يشتمل 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
في التكرار الحلقي الرئيسي. تُرجع الدالة دالة
قبل الاتصال المتوقع التالي لهذا المعالج.