অ্যান্ড্রয়েড 10 এ অ্যান্ড্রয়েড লাইভ-লক ডেমন ( llkd
) অন্তর্ভুক্ত রয়েছে, যা কার্নেল অচলাবস্থাকে ধরা এবং প্রশমিত করার জন্য ডিজাইন করা হয়েছে। llkd
কম্পোনেন্ট একটি ডিফল্ট স্বতন্ত্র বাস্তবায়ন প্রদান করে, কিন্তু আপনি বিকল্পভাবে llkd
কোডটিকে অন্য একটি পরিষেবাতে সংহত করতে পারেন, প্রধান লুপের অংশ হিসাবে বা একটি পৃথক থ্রেড হিসাবে।
সনাক্তকরণ দৃশ্যকল্প
llkd
দুটি সনাক্তকরণ পরিস্থিতি রয়েছে: স্থায়ী D বা Z অবস্থা, এবং স্থায়ী স্ট্যাক স্বাক্ষর।
ক্রমাগত D বা Z অবস্থা
যদি একটি llkd
D (নিরবচ্ছিন্ন ঘুম) বা Z (জম্বি) অবস্থায় থাকে ro.llk.timeout_ms or ro.llk.[D|Z].timeout_ms
) যদি পরবর্তী স্ক্যান দেখায় যে একই প্রক্রিয়াটি অব্যাহত রয়েছে, llkd
একটি লাইভ-লক অবস্থা নিশ্চিত করে এবং কার্নেলটিকে এমনভাবে আতঙ্কিত করে যা শর্তটির জন্য সবচেয়ে বিশদ বাগ রিপোর্ট প্রদান করে।
llkd
মধ্যে একটি স্ব-প্রহরী রয়েছে যা llkd
লক আপ হলে অ্যালার্ম দেয়; ওয়াচডগ মেইনলুপের মধ্য দিয়ে প্রবাহিত হওয়ার প্রত্যাশিত সময়ের দ্বিগুণ এবং প্রতি ro.llk_sample_ms
নমুনা নেওয়া হয়।
অবিরাম স্ট্যাক স্বাক্ষর
ইউজারডিবাগ রিলিজের জন্য, llkd
ক্রমাগত স্ট্যাক সিগনেচার চেকিং ব্যবহার করে কার্নেল লাইভ-লক সনাক্ত করতে পারে। যদি Z ব্যতীত অন্য কোনো অবস্থায় একটি থ্রেডের একটি স্থায়ী তালিকাভুক্ত ro.llk.stack
কার্নেল চিহ্ন থাকে যা ro.llk.timeout_ms
বা ro.llk.stack.timeout_ms
এর চেয়ে বেশি সময়ের জন্য রিপোর্ট করা হয়, llkd
প্রক্রিয়াটিকে মেরে ফেলে (এমনকি যদি ফরওয়ার্ড থাকে সময়সূচী অগ্রগতি)। যদি পরবর্তী স্ক্যান দেখায় যে একই প্রক্রিয়াটি অব্যাহত রয়েছে, llkd
একটি লাইভ-লক অবস্থা নিশ্চিত করে এবং কার্নেলটিকে এমনভাবে আতঙ্কিত করে যা শর্তটির জন্য সবচেয়ে বিশদ বাগ রিপোর্ট প্রদান করে।
যখন লাইভ লক কন্ডিশন থাকে এবং লিনাক্সে /proc/pid/stack
ফাইলে কম্পোজ করা স্ট্রিং symbol+0x
বা symbol.cfi+0x
খোঁজে তখন lldk
চেক ক্রমাগত থাকে। চিহ্নগুলির তালিকা 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]
spawns নিরীক্ষণ করে না। llkd
কভার করার জন্য [kthreadd]
-স্পন করা থ্রেড:
- ড্রাইভারদের অবিরাম D অবস্থায় থাকতে হবে না,
বা
- থ্রেডটি বাহ্যিকভাবে মেরে ফেলা হলে ড্রাইভারদের অবশ্যই পুনরুদ্ধার করার ব্যবস্থা থাকতে হবে। উদাহরণস্বরূপ,
wait_event()
এর পরিবর্তেwait_event_interruptible()
ব্যবহার করুন।
যদি উপরের শর্তগুলির মধ্যে একটি পূরণ করা হয়, তাহলে llkd
denylist কে কার্নেলের উপাদানগুলি কভার করার জন্য সামঞ্জস্য করা যেতে পারে। স্ট্যাক সিম্বল চেকিং ptrace
অপারেশন ব্লক করে এমন পরিষেবাগুলিতে সিপলিসি লঙ্ঘন প্রতিরোধ করার জন্য একটি অতিরিক্ত প্রক্রিয়া অস্বীকারকারী জড়িত।
অ্যান্ড্রয়েড বৈশিষ্ট্য
llkd
বেশ কয়েকটি অ্যান্ড্রয়েড বৈশিষ্ট্যে সাড়া দেয় (নীচে তালিকাভুক্ত)।
-
prop_ms
নামের বৈশিষ্ট্যগুলি মিলিসেকেন্ডে রয়েছে। - তালিকার জন্য কমা (,) বিভাজক ব্যবহার করে এমন বৈশিষ্ট্যগুলি ডিফল্ট এন্ট্রি সংরক্ষণের জন্য একটি অগ্রণী বিভাজক ব্যবহার করে, তারপর যথাক্রমে ঐচ্ছিক প্লাস (+) এবং বিয়োগ (-) উপসর্গ সহ এন্ট্রি যোগ বা বিয়োগ করে। এই তালিকাগুলির জন্য, স্ট্রিং
false
একটি খালি তালিকার সমার্থক, এবং ফাঁকা বা অনুপস্থিত এন্ট্রিগুলি নির্দিষ্ট ডিফল্ট মান অবলম্বন করে।
ro.config.low_ram
ডিভাইসটি সীমিত মেমরির সাথে কনফিগার করা হয়েছে।
ro.debuggable
ডিভাইসটি userdebug বা eng বিল্ডের জন্য কনফিগার করা হয়েছে।
ro.llk.sysrq_t
প্রপার্টি eng
হলে, ডিফল্ট ro.config.low_ram
বা ro.debuggable
নয়। true
হলে, সমস্ত থ্রেড ডাম্প করুন ( sysrq t
)।
ro.llk.enable
লাইভ-লক ডেমনকে সক্ষম করার অনুমতি দিন। ডিফল্ট false
.
llk.enable
eng বিল্ডের জন্য মূল্যায়ন করা হয়েছে। ডিফল্ট হল ro.llk.enable
।
ro.khungtask.enable
[khungtask]
ডেমনকে সক্রিয় করার অনুমতি দিন। ডিফল্ট false
.
khungtask.enable
eng বিল্ডের জন্য মূল্যায়ন করা হয়েছে। ডিফল্ট হল ro.khungtask.enable
।
ro.llk.mlockall
mlockall()
এ কল চালু করুন। ডিফল্ট false
.
ro.khungtask.timeout
[khungtask]
সর্বোচ্চ সময়সীমা। ডিফল্ট 12 মিনিট।
ro.llk.timeout_ms
D বা Z সর্বোচ্চ সময়সীমা। ডিফল্ট 10 মিনিট। llkd
এর জন্য অ্যালার্ম ওয়াচডগ সেট করতে এই মানটিকে দ্বিগুণ করুন।
ro.llk.D.timeout_ms
ডি সর্বোচ্চ সময়সীমা। ডিফল্ট হল 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
কার্নেল স্ট্যাক চিহ্নগুলির জন্য পরীক্ষা করে যেটি যদি ক্রমাগত উপস্থিত থাকে তবে একটি সাবসিস্টেম লক আপ করা নির্দেশ করতে পারে। ডিফল্ট হল cma_alloc,__get_user_pages,bit_wait_io,wait_on_page_bit_killable
কমা দ্বারা পৃথক করা কার্নেল চিহ্নের তালিকা। ro.llk.stack.timeout_ms
সময়কাল ধরে প্রতিটি ro.llk_check_ms
পোলিং করা ছাড়া চেক ফরওয়ার্ড শিডিউলিং ABA করে না, তাই স্ট্যাক প্রতীকগুলি ব্যতিক্রমীভাবে বিরল এবং ক্ষণস্থায়ী হওয়া উচিত (একটি প্রতীকের জন্য সব ক্ষেত্রে অবিরামভাবে প্রদর্শিত হওয়ার সম্ভাবনা খুবই কম। স্ট্যাকের নমুনা)। স্ট্যাক সম্প্রসারণে symbol+0x
বা symbol.cfi+0x
এর জন্য একটি মিল পরীক্ষা করে। শুধুমাত্র userdebug বা eng বিল্ডে উপলব্ধ ; ব্যবহারকারী বিল্ডে নিরাপত্তা উদ্বেগের ফলে সীমিত সুযোগ-সুবিধা হয় যা এই চেককে আটকায়।
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
শুধুমাত্র zombie setsid
এর জন্য)। একটি অ্যাম্পারস্যান্ড (&) বিভাজক নির্দিষ্ট করে যে অভিভাবককে শুধুমাত্র লক্ষ্য শিশু প্রক্রিয়ার সাথে একত্রে উপেক্ষা করা হয়। Ampersand নির্বাচন করা হয়েছিল কারণ এটি কখনই একটি প্রক্রিয়া নামের অংশ নয়; যাইহোক, শেলের একটি setprop
জন্য অ্যাম্পারস্যান্ডকে এস্কেপ বা উদ্ধৃত করা প্রয়োজন, যদিও init rc
ফাইল যেখানে এটি সাধারণত নির্দিষ্ট করা হয় সেখানে এই সমস্যা নেই। একটি অভিভাবক বা লক্ষ্য প্রক্রিয়া একটি comm
, cmdline
, বা pid
রেফারেন্স হতে পারে৷
ro.llk.blacklist.uid
llkd
নির্দিষ্ট UID-এর সাথে মেলে এমন প্রসেস দেখে না। ইউআইএস নম্বর বা নামের কমা দ্বারা পৃথক করা তালিকা। ডিফল্ট খালি বা false
।
ro.llk.blacklist.process.stack
llkd
লাইভ লক স্ট্যাক স্বাক্ষরের জন্য প্রসেসের নির্দিষ্ট উপসেট নিরীক্ষণ করে না। ডিফল্ট হল প্রক্রিয়ার নাম init,lmkd.llkd,llkd,keystore,ueventd,apexd,logd
ptrace
ব্লক করে এমন প্রসেসের সাথে যুক্ত সিপলিসি লঙ্ঘন প্রতিরোধ করে (যেহেতু এগুলো চেক করা যায় না)। শুধুমাত্র userdebug এবং eng বিল্ডে সক্রিয় । বিল্ড প্রকারের বিস্তারিত জানার জন্য, বিল্ডিং অ্যান্ড্রয়েড দেখুন।
স্থাপত্য উদ্বেগ
- বৈশিষ্ট্যগুলি 92টি অক্ষরের মধ্যে সীমাবদ্ধ (তবে, উত্সগুলিতে
include/llkd.h
ফাইলে সংজ্ঞায়িত ডিফল্টগুলির জন্য এটি উপেক্ষা করা হয়)। - অন্তর্নির্মিত
[khungtask]
ডেমনটি খুব সাধারণ এবং ড্রাইভার কোডে ট্রিপ করে যা D অবস্থায় খুব বেশি বসে থাকে। S-তে স্যুইচ করা কাজগুলিকে হত্যাযোগ্য করে তুলবে (এবং প্রয়োজনে ড্রাইভারদের দ্বারা পুনরুত্থানযোগ্য)।
লাইব্রেরি ইন্টারফেস (ঐচ্ছিক)
আপনি ঐচ্ছিকভাবে libllkd
উপাদান থেকে নিম্নলিখিত C ইন্টারফেস ব্যবহার করে অন্য বিশেষ সুবিধাপ্রাপ্ত ডেমনে llkd
অন্তর্ভুক্ত করতে পারেন:
#include "llkd.h"
bool llkInit(const char* threadname) /* return true if enabled */
unsigned llkCheckMillseconds(void) /* ms to sleep for next check */
যদি একটি থ্রেডনাম প্রদান করা হয়, একটি থ্রেড স্বয়ংক্রিয়ভাবে তৈরি হয়, অন্যথায় কলকারীকে তার প্রধান লুপে llkCheckMilliseconds
কল করতে হবে। এই হ্যান্ডলারের পরবর্তী প্রত্যাশিত কলের আগে ফাংশনটি সময়কাল ফেরত দেয়।