বিক্রেতা init

init প্রক্রিয়ার প্রায় অবাধ অনুমতি রয়েছে এবং বুট প্রক্রিয়া চলাকালীন সিস্টেম আরম্ভ করার জন্য সিস্টেম এবং ভেন্ডর পার্টিশন উভয়ের ইনপুট স্ক্রিপ্ট ব্যবহার করে। এই অ্যাক্সেসটি ট্রেবল সিস্টেম/বিক্রেতা বিভাজনে একটি বিশাল গর্ত সৃষ্টি করে, কারণ বিক্রেতা স্ক্রিপ্টগুলি init-কে ফাইল, বৈশিষ্ট্য ইত্যাদি অ্যাক্সেস করার নির্দেশ দিতে পারে যা স্থিতিশীল সিস্টেম-ভেন্ডর অ্যাপ্লিকেশন বাইনারি ইন্টারফেসের (ABI) অংশ নয়।

বিক্রেতা init একটি পৃথক নিরাপত্তা-বর্ধিত Linux (SELinux) ডোমেন vendor_init ব্যবহার করে এই ছিদ্রটি বন্ধ করার জন্য ডিজাইন করা হয়েছে বিক্রেতা-নির্দিষ্ট অনুমতি সহ /vendor এ পাওয়া কমান্ডগুলি চালানোর জন্য।

মেকানিজম

SELinux প্রসঙ্গ u:r:vendor_init:s0 সহ বুট প্রক্রিয়ার প্রথম দিকে Vendor init init-এর একটি সাবপ্রসেস তৈরি করে। এই SELinux প্রসঙ্গের ডিফল্ট init প্রসঙ্গের তুলনায় যথেষ্ট কম অনুমতি রয়েছে এবং এর অ্যাক্সেস ফাইল, বৈশিষ্ট্য ইত্যাদির মধ্যে সীমাবদ্ধ যা হয় ভেন্ডর-নির্দিষ্ট বা স্থিতিশীল সিস্টেম-বিক্রেতা ABI-এর অংশ।

Init লোড হওয়া প্রতিটি স্ক্রিপ্ট পরীক্ষা করে দেখতে যে এর পাথ /vendor দিয়ে শুরু হয় কিনা এবং যদি তাই হয়, তাহলে এটিকে একটি ইঙ্গিত দিয়ে ট্যাগ করে যে এর কমান্ডগুলি অবশ্যই ভেন্ডর init প্রসঙ্গে চালানো হবে। প্রতিটি init বিল্টইন একটি বুলিয়ান দিয়ে টীকা করা হয় যা নির্দেশ করে যে কমান্ডটি ভেন্ডর init সাবপ্রসেসে চালানো হবে কিনা:

  • বেশিরভাগ কমান্ড যেগুলি ফাইল সিস্টেম অ্যাক্সেস করে সেগুলি ভেন্ডর init সাবপ্রসেসে চালানোর জন্য টীকা করা হয় এবং তাই সেগুলি ভেন্ডর init SEPpolicy এর অধীনস্থ হয়।
  • বেশিরভাগ কমান্ড যা অভ্যন্তরীণ init অবস্থাকে প্রভাবিত করে (যেমন, পরিষেবা শুরু করা এবং বন্ধ করা) স্বাভাবিক init প্রক্রিয়ার মধ্যে চালিত হয়। এই কমান্ডগুলিকে সচেতন করা হয়েছে যে একটি বিক্রেতা স্ক্রিপ্ট তাদের নিজস্ব নন-SELinux অনুমতিগুলি পরিচালনা করার জন্য ডাকছে।

init-এর প্রধান প্রসেসিং লুপে একটি চেক রয়েছে যে যদি একটি কমান্ড ভেন্ডর সাবপ্রসেসে চালানোর জন্য টীকা করা হয় এবং একটি ভেন্ডর স্ক্রিপ্ট থেকে উদ্ভূত হয়, তাহলে সেই কমান্ডটি ইন্টার-প্রসেস কমিউনিকেশন (IPC) এর মাধ্যমে ভেন্ডর init সাবপ্রসেসে পাঠানো হয়, যা কমান্ড চালায়। এবং ফলাফলটি init-এ ফেরত পাঠায়।

বিক্রেতা init ব্যবহার করুন

ভেন্ডর init ডিফল্টরূপে সক্রিয় থাকে এবং এর সীমাবদ্ধতা /vendor পার্টিশনে উপস্থিত সমস্ত init স্ক্রিপ্টের ক্ষেত্রে প্রযোজ্য হয়। Vendor init বিক্রেতাদের কাছে স্বচ্ছ হওয়া উচিত যাদের স্ক্রিপ্টগুলি ইতিমধ্যেই কেবল ফাইল, বৈশিষ্ট্য ইত্যাদি সিস্টেম অ্যাক্সেস করছে না।

যাইহোক, যদি একটি প্রদত্ত ভেন্ডর স্ক্রিপ্টের কমান্ডগুলি ভেন্ডর init বিধিনিষেধ লঙ্ঘন করে, কমান্ডগুলি ব্যর্থ হয়। ব্যর্থ কমান্ডের কার্নেল লগে একটি লাইন থাকে (dmesg-এর সাথে দৃশ্যমান) init থেকে ব্যর্থতা নির্দেশ করে। একটি SELinux অডিট যে কোনো ব্যর্থ কমান্ডের সাথে থাকে যা SELinux নীতির কারণে ব্যর্থ হয়। একটি SELinux অডিট সহ একটি ব্যর্থতার উদাহরণ:

type=1400 audit(1511821362.996:9): avc: denied { search } for pid=540 comm="init" name="nfc" dev="sda45" ino=1310721 scontext=u:r:vendor_init:s0 tcontext=u:object_r:nfc_data_file:s0 tclass=dir permissive=0
init: Command 'write /data/nfc/bad_file_access 1234' action=boot (/vendor/etc/init/hw/init.walleye.rc:422) took 2ms and failed: Unable to write to file '/data/nfc/bad_file_access': open() failed: Permission denied

যদি একটি কমান্ড ব্যর্থ হয়, দুটি বিকল্প আছে:

  • যদি নির্দেশিত বিধিনিষেধের কারণে কমান্ডটি ব্যর্থ হয় (যেমন যদি কমান্ডটি একটি সিস্টেম ফাইল বা সম্পত্তি অ্যাক্সেস করে), কমান্ডটি শুধুমাত্র স্থিতিশীল ইন্টারফেসের মাধ্যমে ট্রেবল-বান্ধব উপায়ে পুনরায় প্রয়োগ করা আবশ্যক। স্থিতিশীল সিস্টেম-বিক্রেতা ABI-এর অংশ নয় এমন সিস্টেম ফাইলগুলি অ্যাক্সেস করার অনুমতি যোগ করার নিয়মগুলিকে কখনই অনুমতি দেবেন না।
  • যদি SELinux লেবেলটি নতুন হয় এবং ইতিমধ্যেই সিস্টেম vendor_init.te এ অনুমতি দেওয়া না হয় বা neverallow নিয়মের মাধ্যমে অনুমতি বাদ দেওয়া হয়, তাহলে নতুন লেবেলটি ডিভাইস-নির্দিষ্ট vendor_init.te এ অনুমতি দেওয়া হতে পারে।

Android 9-এর আগে চালু হওয়া ডিভাইসগুলির জন্য, ডিভাইস-নির্দিষ্ট vendor_init.te ফাইলে data_between_core_and_vendor_violators টাইপ অ্যাট্রিবিউট যোগ করে কখনই অনুমতি দেয় না এমন নিয়মগুলিকে বাইপাস করা যেতে পারে।

কোড অবস্থান

বিক্রেতা init IPC-এর বেশিরভাগ যুক্তি সিস্টেম/core/init/subcontext.cpp- এ রয়েছে।

কমান্ডের টেবিলটি system/core/init/builtins.cpp-BuiltinFunctionMap ক্লাসে রয়েছে এবং এতে টীকা অন্তর্ভুক্ত রয়েছে যা নির্দেশ করে যে কমান্ডটি অবশ্যই ভেন্ডর init সাবপ্রসেসে চলবে কিনা।

বিক্রেতা init-এর জন্য SEPpolicy প্রাইভেট ( system/sepolicy/private/vendor_init.te ) এবং সর্বজনীন ( system/sepolicy/public/vendor_init.te ) ডিরেক্টরিতে সিস্টেম/sepolicy-এ বিভক্ত।

,

init প্রক্রিয়ার প্রায় অবাধ অনুমতি রয়েছে এবং বুট প্রক্রিয়া চলাকালীন সিস্টেম আরম্ভ করার জন্য সিস্টেম এবং ভেন্ডর পার্টিশন উভয়ের ইনপুট স্ক্রিপ্ট ব্যবহার করে। এই অ্যাক্সেসটি ট্রেবল সিস্টেম/বিক্রেতা বিভাজনে একটি বিশাল গর্ত সৃষ্টি করে, কারণ বিক্রেতা স্ক্রিপ্টগুলি init-কে ফাইল, বৈশিষ্ট্য ইত্যাদি অ্যাক্সেস করার নির্দেশ দিতে পারে যা স্থিতিশীল সিস্টেম-ভেন্ডর অ্যাপ্লিকেশন বাইনারি ইন্টারফেসের (ABI) অংশ নয়।

বিক্রেতা init একটি পৃথক নিরাপত্তা-বর্ধিত Linux (SELinux) ডোমেন vendor_init ব্যবহার করে এই ছিদ্রটি বন্ধ করার জন্য ডিজাইন করা হয়েছে বিক্রেতা-নির্দিষ্ট অনুমতি সহ /vendor এ পাওয়া কমান্ডগুলি চালানোর জন্য।

মেকানিজম

SELinux প্রসঙ্গ u:r:vendor_init:s0 সহ বুট প্রক্রিয়ার প্রথম দিকে Vendor init init-এর একটি সাবপ্রসেস তৈরি করে। এই SELinux প্রসঙ্গের ডিফল্ট init প্রসঙ্গের তুলনায় যথেষ্ট কম অনুমতি রয়েছে এবং এর অ্যাক্সেস ফাইল, বৈশিষ্ট্য ইত্যাদির মধ্যে সীমাবদ্ধ যা হয় ভেন্ডর-নির্দিষ্ট বা স্থিতিশীল সিস্টেম-বিক্রেতা ABI-এর অংশ।

Init লোড হওয়া প্রতিটি স্ক্রিপ্ট পরীক্ষা করে দেখতে যে এর পাথ /vendor দিয়ে শুরু হয় কিনা এবং যদি তাই হয়, তাহলে এটিকে একটি ইঙ্গিত দিয়ে ট্যাগ করে যে এর কমান্ডগুলি অবশ্যই ভেন্ডর init প্রসঙ্গে চালানো হবে। প্রতিটি init বিল্টইন একটি বুলিয়ান দিয়ে টীকা করা হয় যা নির্দেশ করে যে কমান্ডটি ভেন্ডর init সাবপ্রসেসে চালানো হবে কিনা:

  • বেশিরভাগ কমান্ড যেগুলি ফাইল সিস্টেম অ্যাক্সেস করে সেগুলি ভেন্ডর init সাবপ্রসেসে চালানোর জন্য টীকা করা হয় এবং তাই সেগুলি ভেন্ডর init SEPpolicy এর অধীনস্থ হয়।
  • বেশিরভাগ কমান্ড যা অভ্যন্তরীণ init অবস্থাকে প্রভাবিত করে (যেমন, পরিষেবা শুরু করা এবং বন্ধ করা) স্বাভাবিক init প্রক্রিয়ার মধ্যে চালিত হয়। এই কমান্ডগুলিকে সচেতন করা হয়েছে যে একটি বিক্রেতা স্ক্রিপ্ট তাদের নিজস্ব নন-SELinux অনুমতিগুলি পরিচালনা করার জন্য ডাকছে।

init-এর প্রধান প্রসেসিং লুপে একটি চেক রয়েছে যে যদি একটি কমান্ড ভেন্ডর সাবপ্রসেসে চালানোর জন্য টীকা করা হয় এবং একটি ভেন্ডর স্ক্রিপ্ট থেকে উদ্ভূত হয়, তাহলে সেই কমান্ডটি ইন্টার-প্রসেস কমিউনিকেশন (IPC) এর মাধ্যমে ভেন্ডর init সাবপ্রসেসে পাঠানো হয়, যা কমান্ড চালায়। এবং ফলাফলটি init-এ ফেরত পাঠায়।

বিক্রেতা init ব্যবহার করুন

ভেন্ডর init ডিফল্টরূপে সক্রিয় থাকে এবং এর সীমাবদ্ধতা /vendor পার্টিশনে উপস্থিত সমস্ত init স্ক্রিপ্টের ক্ষেত্রে প্রযোজ্য হয়। Vendor init বিক্রেতাদের কাছে স্বচ্ছ হওয়া উচিত যাদের স্ক্রিপ্টগুলি ইতিমধ্যেই কেবল ফাইল, বৈশিষ্ট্য ইত্যাদি সিস্টেম অ্যাক্সেস করছে না।

যাইহোক, যদি একটি প্রদত্ত ভেন্ডর স্ক্রিপ্টের কমান্ডগুলি ভেন্ডর init বিধিনিষেধ লঙ্ঘন করে, কমান্ডগুলি ব্যর্থ হয়। ব্যর্থ কমান্ডের কার্নেল লগে একটি লাইন থাকে (dmesg-এর সাথে দৃশ্যমান) init থেকে ব্যর্থতা নির্দেশ করে। একটি SELinux অডিট যে কোনো ব্যর্থ কমান্ডের সাথে থাকে যা SELinux নীতির কারণে ব্যর্থ হয়। একটি SELinux অডিট সহ একটি ব্যর্থতার উদাহরণ:

type=1400 audit(1511821362.996:9): avc: denied { search } for pid=540 comm="init" name="nfc" dev="sda45" ino=1310721 scontext=u:r:vendor_init:s0 tcontext=u:object_r:nfc_data_file:s0 tclass=dir permissive=0
init: Command 'write /data/nfc/bad_file_access 1234' action=boot (/vendor/etc/init/hw/init.walleye.rc:422) took 2ms and failed: Unable to write to file '/data/nfc/bad_file_access': open() failed: Permission denied

যদি একটি কমান্ড ব্যর্থ হয়, দুটি বিকল্প আছে:

  • যদি নির্দেশিত বিধিনিষেধের কারণে কমান্ডটি ব্যর্থ হয় (যেমন যদি কমান্ডটি একটি সিস্টেম ফাইল বা সম্পত্তি অ্যাক্সেস করে), কমান্ডটি শুধুমাত্র স্থিতিশীল ইন্টারফেসের মাধ্যমে ট্রেবল-বান্ধব উপায়ে পুনরায় প্রয়োগ করা আবশ্যক। স্থিতিশীল সিস্টেম-বিক্রেতা ABI-এর অংশ নয় এমন সিস্টেম ফাইলগুলি অ্যাক্সেস করার অনুমতি যোগ করার নিয়মগুলিকে কখনই অনুমতি দেবেন না।
  • যদি SELinux লেবেলটি নতুন হয় এবং ইতিমধ্যেই সিস্টেম vendor_init.te এ অনুমতি দেওয়া না হয় বা neverallow নিয়মের মাধ্যমে অনুমতি বাদ দেওয়া হয়, তাহলে নতুন লেবেলটি ডিভাইস-নির্দিষ্ট vendor_init.te এ অনুমতি দেওয়া হতে পারে।

Android 9-এর আগে চালু হওয়া ডিভাইসগুলির জন্য, ডিভাইস-নির্দিষ্ট vendor_init.te ফাইলে data_between_core_and_vendor_violators টাইপ অ্যাট্রিবিউট যোগ করে কখনই অনুমতি দেয় না এমন নিয়মগুলিকে বাইপাস করা যেতে পারে।

কোড অবস্থান

বিক্রেতা init IPC-এর বেশিরভাগ যুক্তি সিস্টেম/core/init/subcontext.cpp- এ রয়েছে।

কমান্ডের টেবিলটি system/core/init/builtins.cpp-BuiltinFunctionMap ক্লাসে রয়েছে এবং এতে টীকা অন্তর্ভুক্ত রয়েছে যা নির্দেশ করে যে কমান্ডটি অবশ্যই ভেন্ডর init সাবপ্রসেসে চলবে কিনা।

বিক্রেতা init-এর জন্য SEPpolicy প্রাইভেট ( system/sepolicy/private/vendor_init.te ) এবং সর্বজনীন ( system/sepolicy/public/vendor_init.te ) ডিরেক্টরিতে সিস্টেম/sepolicy-এ বিভক্ত।