বিক্রেতা init

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

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

প্রক্রিয়া

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

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

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

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

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

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

তবে, যদি কোনও নির্দিষ্ট ভেন্ডর স্ক্রিপ্টের কমান্ডগুলি ভেন্ডর init বিধিনিষেধ লঙ্ঘন করে, তাহলে কমান্ডগুলি ব্যর্থ হয়। ব্যর্থ কমান্ডগুলির কার্নেল লগে init থেকে একটি লাইন থাকে (dmesg দিয়ে দৃশ্যমান) যা ব্যর্থতা নির্দেশ করে। 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

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

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

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

কোড লোকেশন

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

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

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