ტექნიკური დეტალები საკონტროლო ნაკადის მთლიანობის შესახებ
„ბირთვში ფუნქციის მაჩვენებლების უზარმაზარი რაოდენობა ხელს უწყობს ამ თავდასხმის ნიმუშის პოპულარობას. მაშინაც კი, თუ თავდამსხმელებს არ შეუძლიათ საკუთარი შესრულებადი კოდის შეყვანა, არსებული ბირთვის კოდის თვითნებური ნაწილები შეიძლება შესრულდეს მათი ექსპლოიტის დასასრულებლად.
LLVMCFI ცდილობს შეამსუბუქოს ეს შეტევები ზარის მოქმედი სამიზნეების შეზღუდვით და ბირთვის პანიკის იძულებით CFI დარღვევების აღმოჩენისას. შემოწმება ემატება ყოველი არაპირდაპირი განშტოების წინ, რათა დაადასტუროს, რომ სამიზნე მისამართი მიუთითებს მოქმედ ფუნქციაზე სწორი ხელმოწერით. ეს ხელს უშლის არაპირდაპირი ფილიალის გადახტომას თვითნებურ კოდის ადგილას და ზღუდავს ფუნქციებსაც კი, რომელთა გამოძახებაც შესაძლებელია. თავდამსხმელს მაინც შეეძლება შეცვალოს ფუნქციის მაჩვენებელი, თუ ხარვეზი წვდომას იძლევა. მაგრამ LLVM-ის CFI ზღუდავს არაპირდაპირი ზარების 55% მაქსიმუმ 5 შესაძლო სამიზნეზე და 80% მაქსიმუმ 20 სამიზნეზე. იმისათვის, რომ განისაზღვროს ყველა მოქმედი ზარის სამიზნე თითოეული არაპირდაპირი ფილიალისთვის, შემდგენელმა უნდა ნახოს ყველა ბირთვის კოდი ერთდროულად.
LTO-ს გამოყენება (ბმული დროის ოპტიმიზაცია) შესაძლებელს ხდის ამას. LLVM-ის CFI მოითხოვს LTO-ს გამოყენებას, სადაც შემდგენელი აწარმოებს LLVM-ს სპეციფიკურ ბიტკოდს ყველა C-სთვის. კომპილაციის ერთეულები და LTO-ის მცოდნე ლინკერი იყენებს LLVM backend-ს ბიტკოდის გასაერთიანებლად და მის კომპილაციაში მშობლიური კოდი.
CFI-ის გამოყენების ნებართვის დამატებით, LTO აღწევს მუშაობის დროის უკეთეს შესრულებას მთლიანი პროგრამის ანალიზისა და ჯვარედინი მოდული ოპტიმიზაციის მეშვეობით.
ThinLTO თითქმის მიაღწია გრძელვადიანი თანამშრომლების მუშაობის გაუმჯობესებას. ThinLTO რეჟიმში, როგორც ჩვეულებრივ LTO-ში, კლანგი კომპილაციის ფაზის შემდეგ გამოსცემს LLVM ბიტკოდს. ThinLTO ბიტკოდი გაძლიერებულია მოდულის კომპაქტური შეჯამებით. ბმული ნაბიჯის დროს, მხოლოდ შეჯამებები იკითხება და გაერთიანებულია შემაჯამებელ ინდექსში, რომელიც მოიცავს ფუნქციის მდებარეობის ინდექსს მოგვიანებით ჯვარედინი მოდული ფუნქციის იმპორტისთვის. ამის შემდეგ ხდება სწრაფი და ეფექტური მთლიანი პროგრამის ანალიზი კომბინირებულ შემაჯამებელ ინდექსზე. ThinLTO საშუალებას აძლევს მრავალ ხრახნიანი დაკავშირების პროცესს, რაც იწვევს კომპილაციის დროის შემცირებას.
იმის გამო, რომ CFI წყვეტს პროგრამის შესრულებას გარკვეული შეცდომების კლასებში დარტყმისას, ის ასევე კლასიფიცირდება როგორც შეცდომების აღმოჩენის ინსტრუმენტი, როგორც ზემოთ აღინიშნა, როდესაც გამოიყენება ნებადართული რეჟიმში. ნებადართული CFI აჩვენებს CFI დარღვევებს ბირთვის ჟურნალში, ბირთვის პანიკის იძულების გარეშე. ბირთვის 4.9 (Pixel 3 თაობის მოწყობილობები) და 4.14 (Pixel 4 თაობის მოწყობილობები) ბირთვებს ჰქონდათ რამდენიმე ფუნქციის ტიპი. შეუსაბამობები, რომლებიც იწვევს CFI-ს დარღვევას, რომლებიც Google-ის მიერ იქნა განხილული ბირთვში/ჩვეულზე ხელმისაწვდომ პაჩსეტებში რეპო.
თუმცა, Android ეკოსისტემის ბუნების გამო, ეს შეუსაბამობები სავარაუდოდ გვხვდება SoC მწარმოებლის (ამ შემთხვევაში, Qualcomm) ან OEM (OnePlus) კონკრეტულ კოდშიც. რამდენიმე CFI დარღვევა Qualcomm-კოდში, რომელიც განსხვავდება 4.19 ბირთვისგან, დაფიქსირდა კირისაკურას ბირთვზე OnePlus 8 Pro-სთვის (მაგალითი: 1, 2, 3).
ნებადართული CFI-ში ბირთვის გაშვებამ გამოავლინა CFI დარღვევები კოდშიც, რომელიც დაკავშირებულია OnePlus-ის დრაივერებთან (შესაბამისი ვალდებულებების ნახვა შესაძლებელია აქ და აქ). კირისაკურას ბირთვი OnePlus 8 Pro-სთვის მუშაობს CFI-ით, რომელიც იცავს მომხმარებლებს ამ ტიპის კოდის ხელახალი გამოყენების შეტევებისგან.
წაიკითხე მეტი
წვრილმანი ენთუზიასტი (ანუ ძველი კომპიუტერის ნაწილების მხსნელი). Skanda-ს ეკლერის დროიდან მოყოლებული Android-ის მოყვარული მომხმარებელი, ასევე უყვარს თვალი ადევნოს უახლესი განვითარების ტენდენციებს ერთი დაფის გამოთვლის სამყაროში.