البرنامج الخفي لقفل Android (llkd)

يشتمل Android 10 على البرنامج الخفي لقفل Android Live (llkd)، وهي مُصمَّمة لاكتشاف حالات التعطُّل في النواة والحدّ منها. llkd طريقة تنفيذ مستقلة تلقائية، ولكن يمكنك يمكنك بدلاً من ذلك دمج رمز llkd في خدمة أخرى، سواءً كجزء من التكرار الحلقي الرئيسي أو كسلسلة بيانات منفصلة.

سيناريوهات الكشف

تتضمّن llkd سيناريوهَين للرصد: الحالة D أو Z الثابتة، والوضع الدائم. توقيع الحزمة.

حالة D أو Z ثابتة

إذا كانت سلسلة المحادثات في الحالة D (نوم لا يمكن انقطاعه) أو Z (الزومبي) بدون إعادة توجيه التقدم لمدة أطول من ro.llk.timeout_ms or ro.llk.[D|Z].timeout_ms، يؤدي llkd إلى إنهاء العملية (أو العملية الرئيسية). إذا أظهر فحص لاحق تستمر العملية نفسها، وتؤكّد llkd شرط القفل المباشر الإفزاع بالنواة بطريقة توفر تقرير الأخطاء الأكثر تفصيلاً الشرط.

تتضمّن llkd مراقبًا ذاتيًا يرسِل إنذارًا في حال تم قفل "llkd". مراقب النظام هو مضاعفة الوقت المتوقع للتدفق عبر الحلقة الرئيسية وأخذ العينات ro.llk_sample_ms

توقيع الحزمة الثابتة

في إصدارات userdebug، يمكن لـ llkd رصد عمليات القفل المباشرة للنواة باستخدام التحقق من توقيع الحزمة. إذا كانت سلسلة المحادثات بأي حالة باستثناء ع رمز النواة ro.llk.stack المدرج الذي يتم الإبلاغ عنه لمدة أطول من ro.llk.timeout_ms أو ro.llk.stack.timeout_ms، تؤدي llkd إلى إنهاء العملية. (حتى لو كان هناك تقدم في الجدولة للأمام). إذا أظهر فحص لاحق تستمر العملية نفسها، وتؤكّد llkd شرط القفل المباشر الإفزاع بالنواة بطريقة توفر تقرير الأخطاء الأكثر تفصيلاً الشرط.

تستمر عملية التحقّق من lldk باستمرار عند توفّر حالة القفل المباشر. تبحث عن السلاسل المكونة symbol+0x أو symbol.cfi+0x في /proc/pid/stack على نظام التشغيل Linux. توجد قائمة الرموز باللغة ro.llk.stack و على القائمة المفصولة بفواصل cma_alloc,__get_user_pages,bit_wait_io,wait_on_page_bit_killable

يجب أن تكون الرموز نادرة وقصيرة الأجل بما يكفي لدرجة أنه في النظام النموذجي مرة واحدة فقط في العينة خلال فترة المهلة ro.llk.stack.timeout_ms (يتم عرض العيّنات كل ro.llk.check_ms). بسبب عدم لحماية رابطة المصارف الأمريكية (ABA)، فإن هذه هي الطريقة الوحيدة لمنع حدوث أخطاء. الرمز أسفل الدالة التي تستدعي القفل الذي يمكن أن يستمر. في حال حذف إذا كان القفل أسفل أو في دالة الرمز، فإن الرمز يظهر في جميع وليس فقط تلك التي تسببت في الإقفال.

التغطية

لا يراقب التنفيذ التلقائي لدالة llkd init أو [kthreadd] وتتكاثر [kthreadd]. لكي تغطي llkd سلسلة المحادثات التي تم إنشاؤها باستخدام [kthreadd]:

  • يجب ألا تظل السائقون في حالة D دائمة،

أو

  • يجب أن تتوفر لبرامج التشغيل آليات لاسترداد سلسلة المحادثات في حال إنهائها خارجيًا. على سبيل المثال، يمكنك استخدام wait_event_interruptible() بدلاً من wait_event()

في حال استيفاء أحد الشروط السابقة، يمكن تعديل قائمة الحظر llkd إلى لتغطية مكونات النواة. يتضمن التحقق من رمز التكديس عملية إضافية قائمة الحظر لمنع انتهاك السياسات في الخدمات التي تحظر ptrace العمليات التجارية.

خصائص Android

تستجيب llkd للعديد من خصائص Android (المدرَجة أدناه).

  • تكون الخصائص باسم prop_ms بالمللي ثانية.
  • تستخدم السمات التي تستخدم فاصلة (,) فاصلاً بادئًا للقوائم. الاحتفاظ بالإدخال الافتراضي، ثم قم بإضافة أو طرح الإدخالات باستخدام علامة زائد اختيارية البادئتين (+) والسالب (-) على التوالي. بالنسبة إلى هذه القوائم، تظهر السلسلة false يترادف مع قائمة فارغة، وتلجأ الإدخالات الفارغة أو المفقودة إلى القيمة الافتراضية المحددة.

الأمر ro.config.low_ram

تم ضبط الجهاز باستخدام ذاكرة محدودة.

ro.debuggable

تم ضبط الجهاز لإنشاء "تصحيح الأخطاء" أو "الهندسة".

ro.llk.sysrq_t

إذا كانت الخاصية eng، لن تكون القيمة التلقائية ro.config.low_ram أو ro.debuggable. إذا كانت true، سيتم تفريغ جميع سلاسل المحادثات (sysrq t).

أمر ro.llk.enable

السماح بتفعيل البرنامج الخفي للقفل المباشر القيمة التلقائية هي false.

llk.enable

يتم تقييمه بناءً على تصاميم الهندسة. القيمة التلقائية هي ro.llk.enable.

ro.kungtask.enable

السماح بتفعيل البرنامج الخفي "[khungtask]" القيمة التلقائية هي false.

kungtask.enable

يتم تقييمه بناءً على تصاميم الهندسة. القيمة التلقائية هي ro.khungtask.enable.

ro.llk.mlockall

تفعيل الاتصال برقم mlockall(). القيمة التلقائية هي false.

cannot translate

الحد الأقصى للوقت [khungtask] القيمة التلقائية هي 12 دقيقة.

ro.llk.timeout_ms

الحد الأقصى للوقت D أو Z. والإعداد التلقائي هو 10 دقائق. ضِعف هذه القيمة لضبط مراقب نظام llkd.

ro.llk.D.timeout_ms

D الحد الأقصى للوقت القيمة التلقائية هي ro.llk.timeout_ms.

ro.llk.Z.timeout_ms

الحد الأقصى للوقت Z. القيمة التلقائية هي ro.llk.timeout_ms.

ro.llk.stack.timeout_ms

للتحقق من الحد الأقصى لمدة رموز تسلسل استدعاء الدوال البرمجية الثابتة. الإعداد التلقائي هو ro.llk.timeout_ms نشط فقط على إصدارات userdebug أو eng.

ro.llk.check_ms

نماذج من سلاسل المحادثات لـ "د" أو "ع". الإعداد التلقائي هو دقيقتين.

ro.llk.stack

تبحث عن رموز تكديس النواة (kernel) والتي يمكن أن تشير في حال وجودها باستمرار إلى النظام الفرعي مُقفَل. الإعداد التلقائي هو cma_alloc,__get_user_pages,bit_wait_io,wait_on_page_bit_killable قائمة مفصولة بفواصل لرموز النواة. لا يتيح الشيك جدولة إعادة التوجيه. رابطة المصارف الأمريكية (ABA) باستثناء إجراء استطلاعات كل ro.llk_check_ms على مدار الفترة ro.llk.stack.timeout_ms، ولذلك يجب أن تكون رموز التكديس نادرة جدًا عابر (من غير المرجح جدًا أن يظهر الرمز باستمرار في جميع عينات من المكدس). البحث عن مطابقة لـ symbol+0x أو symbol.cfi+0x في توسيع تسلسل استدعاء الدوال البرمجية. متوفّرة فقط على userdebug أو eng الإصدارات مخاوف تتعلق بالأمان عند إصدارات المستخدم تؤدي إلى امتيازات محدودة منع عملية الفحص هذه.

ro.llk.القائمة السوداء.process

لا يراقب llkd العمليات المحدّدة. القيمة التلقائية هي 0,1,2 (kernel، init و[kthreadd]) بالإضافة إلى أسماء العمليات init,[kthreadd],[khungtaskd],lmkd,llkd,watchdogd, [watchdogd],[watchdogd/0],...,[watchdogd/get_nprocs-1] يمكن أن تكون العملية مرجعًا comm أو cmdline أو pid. عبارة عن إعداد تلقائي يمكن أن يكون أكبر من الحد الأقصى الحالي لحجم الموقع وهو 92.

ro.llk.القائمة السوداء.parent

لا يشاهد llkd العمليات التي تتضمّن العناصر الرئيسية المحدّدة. الإعداد التلقائي يبلغ من العمر 0,2,adbd&[setsid] (kernel و[kthreadd] وadbd للزومبي فقط) setsid). يحدد فاصل علامة العطف (&) أنه يتم تجاهل العنصر الرئيسي فقط إلى جانب العملية الثانوية المستهدفة. تم اختيار علامة العطف لأنها لا تشكّل أبدًا جزءًا من اسم العملية أمّا setprop في واجهة الأوامر، فتتطلّب يجب تخطي علامة العطف أو اقتباسها، على الرغم من أن ملف init rc الذي يتضمن هذا المحددة عادةً لا تحتوي على هذه المشكلة. يمكن أن تكون العملية الرئيسية أو المستهدفة مرجع comm أو cmdline أو pid

ro.llk.القائمة السوداء.uid

لا يراقب llkd العمليات التي تتطابق مع المعرفات الفريدة المحددة. قائمة مفصولة بفواصل تضمّ أرقام أو أسماء واجهات المستخدم. الحقل التلقائي فارغ أو false.

الأمر ro.llk.block.process.stack

لا تراقب llkd المجموعة الفرعية المحدَّدة من العمليات لحزمة القفل المباشر. التوقيعات. الإعدادات التلقائية هي أسماء العمليات init,lmkd.llkd,llkd,keystore,ueventd,apexd,logd لمنع sepolicy والانتهاك المرتبط بالعمليات التي تحظر ptrace (لأنه لا يمكن محدد). نشِط فقط على صيغتَي userdebug وeng. للحصول على تفاصيل عن الإصدار يمكنك الرجوع إلى إنشاء نظام Android.

المخاوف المعمارية

  • تقتصر الخصائص على 92 حرفًا (ولكن يتم تجاهل هذا الإعداد التلقائي المحدد في ملف include/llkd.h ضمن المصادر).
  • البرنامج الخفي لـ [khungtask] المُدمَج عام جدًا ويستهلك تطبيق رحلات برمز السائق ويقف في الحالة D كثيرًا. التبديل إلى S قد يجعل المهام قابلة للقتل (ويمكن السائقين إحياؤهم مرة أخرى إذا لزم الأمر).

واجهة المكتبة (اختيارية)

يمكنك دمج "llkd" في برنامج خفي آخر يملك أذونات مميزة باستخدام الواجهة C التالية من المكوِّن libllkd:

#include "llkd.h"
bool llkInit(const char* threadname) /* return true if enabled */
unsigned llkCheckMillseconds(void)   /* ms to sleep for next check */

إذا تم توفير اسم سلسلة محادثات، ستنبثق سلسلة محادثات تلقائيًا، وإلا فإن المتصل يجب أن يستدعي llkCheckMilliseconds في التكرار الحلقي الرئيسي. تُرجع الدالة دالة قبل الاتصال المتوقع التالي لهذا المعالج.