Android Live-LocK Daemon (llkd)

الروبوت 10 يتضمن الروبوت لايف للقفل الشيطان ( 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 تأمين أعلى؛ الوكالة الدولية للطاقة هو ضعف الوقت المتوقع أن تتدفق من خلال mainloop وأخذ العينات كل ro.llk_sample_ms .

توقيع المكدس المستمر

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

و lldk قائما الاختيار بشكل مستمر عند وجود حالة قفل الحية، ويتطلع لسلاسل تتألف " symbol+0x" أو " symbol.cfi+0x" في /proc/pid/stack الملف على لينكس. قائمة الرموز هي في 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] المواضيع -spawned:

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

أو

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

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

خصائص Android

و llkd يستجيب إلى العديد من الخصائص الروبوت (المذكورة أدناه).

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

ro.config.low_ram

تم تكوين الجهاز بذاكرة محدودة.

ro.debuggable

تم تكوين الجهاز لـ userdebug أو eng build.

ro.llk.sysrq_t

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

ro.llk.enable

السماح بتمكين البرنامج الخفي للقفل المباشر. الافتراضي هو خطأ.

llk.enable

تم تقييمها للمباني الهندسية. الافتراضي هو ro.llk.enable .

ro.khungtask.enable

تسمح [khungtask] الخفي إلى تمكين. الافتراضي هو خطأ.

khungtask.enable

تم تقييمها للمباني الهندسية. الافتراضي هو ro.khungtask.enable .

ro.llk.mlockall

تمكين الدعوة إلى mlockall() . الافتراضي هو خطأ.

ro.khungtask.timeout

[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 أو المهندس يبني.

ro.llk.check_ms

نماذج من سلاسل الرسائل لـ D أو Z. الافتراضي دقيقتان.

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 أو المهندس يبني. تؤدي المخاوف الأمنية المتعلقة ببنيات المستخدم إلى امتيازات محدودة تمنع هذا الفحص.

ro.llk.blacklist.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.blacklist.parent

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

ro.llk.blacklist.uid

و llkd لا يراقب العمليات التي تطابق المحدد رمز المستخدم (ق). قائمة بأرقام التعريف أو الأسماء مفصولة بفواصل. الافتراضي فارغ أو خطأ.

ro.llk.blacklist.process.stack

و llkd لا ترصد فرعية محددة من العمليات للتوقيعات كومة قفل الحية. الافتراضي هو أسماء عملية init,lmkd.llkd,llkd,keystore,ueventd,apexd,logd . يمنع انتهاك sepolicy المرتبطة العمليات التي كتلة ptrace (وهذه لا يمكن أن يتم التحقق). نشط فقط على userdebug والمهندس يبني. لمزيد من التفاصيل عن أنواع البناء، ارجع إلى بناء الروبوت .

الاهتمامات المعمارية

  • تقتصر الخصائص إلى 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 */

إذا تم توفير threadname، وهو موضوع تلقائيا يولد، وإلا فإن المتصل يجب استدعاء llkCheckMilliseconds في حلقة الرئيسية. ترجع الدالة الفترة الزمنية قبل الاستدعاء التالي المتوقع لهذا المعالج.