OnePlus 3/3T ჩამტვირთველის დაუცველობა საშუალებას გაძლევთ შეცვალოთ SELinux დაშვებულ რეჟიმში Fastboot-ში

სერიოზული დაუცველობა OnePlus 3/3T ჩამტვირთველში თავდამსხმელებს საშუალებას აძლევს გადართონ SELinux მდგომარეობა აღსრულებიდან დასაშვებზე! წაიკითხეთ მეტი რომ იცოდეთ!

The OnePlus 3 და OnePlus 3T არის საუკეთესო ტელეფონებიდან, რომელთა შეძენაც ახლა შეგიძლიათ. მიუხედავად იმისა, რომ 2017 წლის მომავალი ფლაგმანები ჯერ კიდევ არ არის გამჟღავნებული მომხმარებლებისთვის, მათი არყოფნის შემთხვევაში OnePlus 3/3T დომინირებს რეალურ სამყაროში ხელმისაწვდომ ფასად.

მაგრამ, თუ ჩვენ უნდა ვიყოთ სამართლიანი მოწყობილობის შეფასებაში, ჩვენ უნდა ვაღიაროთ, რომ მიუხედავად OnePlus-ის საუკეთესო ძალისხმევისა, OnePlus 3/3T არ არის დეფექტების გარეშე. მაგალითად, ჩვენ ადრე შეგვატყობინეთ უსაფრთხოების საკითხებზე, როგორიცაა OnePlus-ის IMEI დეტალების გაჟონვა ქსელის საშუალებით, როდესაც ამოწმებთ განახლებებს თქვენს ტელეფონზე. ახლა კი, ჩვენ გვაქვს კიდევ ერთი უსაფრთხოების საკითხი, რომელიც სიას უნდა დავამატოთ, ეს არის პოტენციურად უფრო საშიში შედეგებით.

დაუცველობა OnePlus 3/3T-ის ჩამტვირთველში ხსნის კარებს მავნე შეტევებისთვის. როგორც აღმოაჩინა როი ჰეიმ IBM X-Force აპლიკაციის უსაფრთხოების კვლევის ჯგუფიდან და 

გამოვლინდა IBM X-Force Exchange პლატფორმაზე, ეს დაუცველობა თავდამსხმელს საშუალებას აძლევს მანიპულირება მოახდინოს მოწყობილობებზე SELinux-ის მდგომარეობით, რითაც გადართოს ის დასაშვებ რეჟიმში. თავდამსხმელს მხოლოდ ეს სჭირდება ან ფიზიკური წვდომა მოწყობილობაზე, ან დისტანციური წვდომა ADB კავშირზე მოწყობილობას.

SELinux, ან Security-Enhanced Linux, არის Linux ბირთვის უსაფრთხოების მოდული, რომელიც იძლევა უსაფრთხოების პოლიტიკის წვდომას და მართვას. SELinux დაინერგა Android-ში Android 4.3-ით დაწყებული და დაყენებული იყო აღსრულება ნაგულისხმევი რეჟიმი Android 4.4-დან. ეს სავალდებულო წვდომის კონტროლის სისტემა ხელს უწყობს წვდომის კონტროლის არსებული უფლებების აღსრულებას და ცდილობს თავიდან აიცილოს პრივილეგიების ესკალაციის შეტევები. ეს მოქმედებს, როგორც დაბრკოლება თქვენს მოწყობილობაზე არაავტორიზებული კონტროლისთვის, როგორიცაა აპი ან დაუცველობა, რომელიც მიზნად ისახავს მავნე წვდომის მოპოვებას. SELinux-ის დაყენება აღსრულება ნაგულისხმევად Android-ზე ემსახურება, როგორც პირველი ნაბიჯი ნორმალური მომხმარებლების დასაცავად ასეთი შეტევებისგან.

დაუცველობა საკმაოდ მარტივი გამოსაყენებელია - ფაქტობრივად, როგორც ჩანს, ეს არის უზარმაზარი ზედამხედველობა OnePlus-ის მხრიდან, ვიდრე წარმოგიდგენიათ თქვენი ტიპიური ექსპლოიტის სახე. პირველ რიგში, თავდამსხმელი გადატვირთავს OnePlus 3/3T-ს „სწრაფი ჩატვირთვის“ რეჟიმში - თუ ფიზიკური წვდომა გაქვთ, უბრალოდ დააჭირეთ ხმის გაზრდის ღილაკს ჩატვირთვისას, მაგრამ თუ არა, შეგიძლიათ გასცეთ ADB ბრძანება. adb reboot bootloader მოწყობილობას. მოწყობილობაზე სწრაფი ჩატვირთვის რეჟიმი ავლენს USB ინტერფეისს, რომელიც არ უნდა დაუშვას უსაფრთხოების მგრძნობიარე ბრძანების შესრულება ჩაკეტილ მოწყობილობებზე. მაგრამ OnePlus 3/3T-ზე უბრალოდ გაცემა fastboot oem selinux permissive ბრძანება fastboot ინტერფეისის საშუალებით ცვლის SELinux რეჟიმს აღსრულება რომ დასაშვები.

fastboot oem selinux permissive
...
OKAY[ 0.045s]
finished. totaltime: 0.047s

...

OnePlus3:/ $ getenforce
Permissive
OnePlus3:/ $

პრობლემის კიდევ უფრო გართულებისთვის, OnePlus 3 და 3T არ გააჩნიათ რაიმე ჩანაწერი "ეკრანის შესახებ" მოწყობილობის ამჟამინდელი SELinux მდგომარეობის აღსანიშნავად. მსხვერპლი გააგრძელებს ყურადღების მიქცევას მისი მოწყობილობის კომპრომეტირებული მდგომარეობის შესახებ, თუ ის არ შეესწრო ექსპლოიტის აქტიურად გამოყენებას. SELinux-ის სტატუსის ჩანაწერის ნაკლებობა "ეკრანის შესახებ" არ არის როგორც Android 6.0-ზე დაფუძნებული Open Beta გამოშვებებში, ასევე Android 7.0 ოფიციალურ ROM-ებში.

არსებობს რამდენიმე აპი SELinux-ის მდგომარეობის დასაშვებზე გადასართავად, როგორიცაა SELinuxModeChanger განაცხადი. SELinux-ის ამ მეთოდით გადართვა სახელმწიფოს არ აძლევს უფლებას გადატვირთვის გზით შენარჩუნდეს. თუმცა, შეგიძლია სკრიპტების გამოყენება შესანარჩუნებლად დასაშვები SELinux მდგომარეობა მძიმე გადატვირთვების დროს. ორივე ეს მეთოდი მოითხოვს root წვდომას, რაც გულისხმობს, რომ მომხმარებელს უკვე აქვს ცოდნა იმ რისკების შესახებ, რომლებსაც ისინი ექვემდებარებიან. მაგრამ მთავარი განსხვავებაა SELinux რეჟიმის შეცვლასთან დასაშვები ზემოაღნიშნული დაუცველობის გამოყენება არის ის, რომ ის არა მხოლოდ გრძელდება მძიმე გადატვირთვების დროს, ასე აკეთებს root წვდომის გარეშე.

დაუცველობის საწინააღმდეგო საშუალებები დღეისთვის არ არსებობს.


განახლება:

მივაღწიეთ სულთანხდა, ერთ-ერთი ყველაზე ცნობილი Custom ROM დეველოპერი OnePlus მოწყობილობებისთვის, რათა გვენახა, შეუძლია თუ არა ის დაგვეხმაროს ამ საკითხის შესახებ მეტის გაგებაში. მან დაუყონებლივ ჩათხარა კოდი ძირეული წყაროს მოსაძებნად, აი რა იპოვა:

ისე, რომ "fastboot oem selinux ბრძანება მუშაობს იმაში, რომ ის ამატებს დამატებით არგუმენტს ბირთვის ბრძანების ხაზზე Linux-ის ჩატვირთვისას. დამატებითი არგუმენტი მოდის "androidboot.selinux="-ის სახით“, სადაც შეიძლება იყოს "ნებადართული". აქ ყველაფერი სასაცილო ხდება: "androidboot.არგუმენტები ბირთვის ბრძანების სტრიქონზე განიხილება Android-ის ინიტით. ნორმალურ ანდროიდის წარმოების build-ში ("მომხმარებლის" აშენება), "androidboot.selinux" არგუმენტი სრულიად იგნორირებულია და selinux ყოველთვის იძულებულია აღასრულოს. ასე რომ, ეს შეცდომა შედგება ორი პრობლემისგან:

  1. მომხმარებლებს შეუძლიათ აიძულონ ჩამტვირთველმა გადასცეს დროშა, რომელიც ჩვეულებრივ ნებადართულს გახდის selinux-ს საინჟინრო/გამართვის ROM-ის კონსტრუქციაზე.
  2. OnePlus-მა შეცვალა Android-ის init, რათა პატივი სცეს "androidboot.selinux" დროშას საწარმოო ROM-ის კონსტრუქციებისთვისაც კი.

აი, სადაც Android-ის init არის კონფიგურირებული ისე, რომ იგნორირება გაუკეთოს "androidboot.selinux" დროშას წარმოების კონსტრუქციებისთვის: https://android.googlesource.com/platform/system/core/+/android-6.0.0_r41/init/Android.mk#7

ALLOW_DISABLE_SELINUX დროშა საწყის კოდში დაყენებულია მხოლოდ 1-ზე მომხმარებლის გამართვისა და საინჟინრო ნაგებობებისთვის

(ჩემს ROM-ზე ეს არ მოქმედებს, რადგან მე ვაშენებ ჩემს ROM-ს წარმოების (მომხმარებლის) რეჟიმში)

ასე რომ, "androidboot.selinux" უბრალოდ იგნორირებულია ჩემს ROM-ში, "fastboot oem selinux" როგორც ჩანს, ბრძანება არის ის, რაც OnePlus-მა შექმნა, რადგან ასეთი ბრძანება არ არსებობს CAF-ის საჯარო ჩამტვირთველის წყაროებში. მე შემიძლია მოვიფიქრო 4 გზა ამის გამოსასწორებლად მომხმარებლებისთვის, რომლებსაც აქვთ განბლოკილი ჩამტვირთველი:

  1. Hex-რედაქტირება ჩამტვირთველი, რათა შეცვალოს "selinux" სტრიქონის ყველა ინსტანცია რაღაც განსხვავებულად (როგორიცაა "sclinux"), რათა დროშა არ იყოს ამოცნობილი Android-ის ინიტით.
  2. ექვსკუთხა რედაქტირება Android init ორობითი OxygenOS-ში, რათა შეცვალოს ყველა ეგზემპლარი "androidboot.selinux"-ში რაღაც განსხვავებული (როგორც "androidboot.sclinux") ისე, რომ Android init-მა არ ამოიცნოს androidboot.selinux დროშა
  3. დაამატე ბირთვის ბრძანების ხაზის დრაივერი, მსგავსი ჩემი SafetyNet შემოვლითი გზით, რათა დამალოთ "androidboot.selinux" დროშა Android-ის საწყისებიდან.

გვინდა მადლობა გადავუხადოთ Sultanxda-ს დახარჯული დროისა და ძალისხმევისთვის, რომელიც დაგვეხმარა იმის გაგებაში, თუ რა ხდება კულისებში. ჩვენ ასევე მივმართეთ OnePlus-ს, რომელიც იცის სიტუაციის შესახებ და იკვლევს საკითხს.


ვიმედოვნებთ, რომ OnePlus საჯაროდ აღიარებს სერიოზულ პრობლემას და გამჭვირვალე იქნება მისი გამოსწორების გეგმებში.