Google ავითარებს Android-ის ნაწილებს Rust-ში უსაფრთხოების გასაუმჯობესებლად

Google წერს და გადაწერს Android-ის ნაწილებს Rust-ში, რათა გააუმჯობესოს ოპერაციული სისტემა მთლიანობაში, C და C++-ის წინააღმდეგ. წაიკითხეთ მეტი რომ იცოდეთ!

Android, როგორც სრული OS გადაწყვეტა მოიცავს უამრავ მოძრავ ნაწილს. ძალიან ფართოდ რომ ვთქვათ, ეს ნაწილები არის აპლიკაციის ეკოსისტემა და შემდეგ თავად OS. როგორც დეველოპერი, თქვენი არჩეული პროგრამირების ენა განსხვავდება იმისდა მიხედვით, თუ რომელ ნაწილზე მუშაობთ Android-ზე. აპლიკაციის შემქმნელებისთვის Java და Kotlin პოპულარული ვარიანტებია. OS-ზე და მის ქვედა დონეებზე მომუშავე დეველოპერებისთვის C და C++ აქამდე პოპულარული არჩევანი იყო. დღეს Google ამატებს მესამე ვარიანტს OS დეველოპერებისთვის, რადგან Android Open Source Project ახლა მხარს უჭერს Rust პროგრამირების ენას თავად OS-ის განვითარებისთვის.

C და C++-ის შეზღუდვები

Android OS-ის ქვედა დონეები მოითხოვს სისტემების პროგრამირების ენებს, როგორიცაა C და C++. ეს ენები უზრუნველყოფენ დეველოპერებს კონტროლსა და პროგნოზირებადობას, რაც მნიშვნელოვანია დაბალი დონის სისტემის რესურსებსა და აპარატურაზე წვდომისას.

სამწუხაროდ, C და C++ ვერ უზრუნველყოფენ მეხსიერების უსაფრთხოების გარანტიებს, რაც მათ მიდრეკილია შეცდომებისა და უსაფრთხოების დაუცველობისკენ. დეველოპერი პასუხისმგებელია ამ ენებზე მეხსიერების სიცოცხლის ხანგრძლივობის მართვაზე, მაგრამ რთული და მრავალნაკადიანი კოდების ბაზებში, ეს უფრო ადვილია, ვიდრე გაკეთება.

C და C++ ერთად ქმნიან ათობით მილიონი კოდის ხაზს Android პლატფორმაზე. მეხსიერების უსაფრთხოების ეს შეცდომები ხდება კოდის არასწორი მისამართის ყველაზე რთულად მისამართი წყარო, რაც წარმოადგენს Android-ის უსაფრთხოების მაღალი სიმძიმის დაუცველობის ~ 70%-ს. ამ შეცდომების მხოლოდ გამოსწორება არასაკმარისი ხდება პრობლემის მოსაგვარებლად და უკეთესი მიდგომა იქნება მათი თავიდან აცილება.

მეხსიერების უსაფრთხოების ნაკლებობა აიძულებს დეველოპერებს განახორციელონ Android პროცესები მჭიდროდ შეზღუდულ და არაპრივილეგირებულ sandboxes-ში. მაგრამ ქვიშის ყუთები ძვირია რესურსებზე, მოიხმარენ დამატებით ზედნადებს და შემოაქვს შეყოვნება. Sandboxing ასევე არ გამორიცხავს კოდის დაუცველობას მთლიანად და მისი ეფექტურობა მცირდება შეცდომების მაღალი სიმკვრივის გამო, რაც დამატებით საშუალებას აძლევს თავდამსხმელებს დააკავშირონ მრავალი დაუცველობა.

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

ეს არის სადაც გადართვა მეხსიერების უსაფრთხო ენაზე, როგორიცაა Rust, ჩნდება სურათზე.

ჟანგი და მისი სარგებელი

Rust უზრუნველყოფს მეხსიერების უსაფრთხოების გარანტიებს კომპილაციის დროის შემოწმების კომბინაციის გამოყენებით ობიექტის სიცოცხლის ხანგრძლივობის/მფლობელობის აღსასრულებლად და გაშვების დროის შემოწმების გამოყენებით მეხსიერების წვდომის მართებულობის უზრუნველსაყოფად. ეს უსაფრთხოება მიიღწევა C და C++-ის ექვივალენტური მუშაობის უზრუნველყოფისას. Rust ასევე ამცირებს sandboxing-ის აუცილებლობას, რაც დეველოპერებს საშუალებას აძლევს მეტი ოვერჰედის სივრცე შემოიტანონ ახალი ფუნქციები, რომლებიც უფრო უსაფრთხო და მსუბუქია რესურსებზე.

მიუხედავად იმისა, რომ Rust-ს ნამდვილად აქვს თავისი უპირატესობები, შეუძლებელია მთელი Android OS-ის გადართვა Rust-ზე ღამით. და ეს შეიძლება არც იყოს საჭირო, რადგან Android-ის მეხსიერების შეცდომების უმეტესობა ხდება ახალ ან ახლახან შეცვლილ კოდში, დაახლოებით 50% არის ერთ წელზე ნაკლები ასაკის. Google თვლის, რომ მეხსიერებისთვის უსაფრთხო ენის მცდელობები საუკეთესოდ არის ორიენტირებული ახალ მოვლენებზე, ვიდრე სექსუალურ C და C++ კოდების გადაწერაზე.

Rust ასევე ყურადღებას ამახვილებს შეცდომების თავიდან აცილებაზე, ვიდრე სერიოზულად ეყრდნობა შეცდომების გამოვლენას, რის შედეგადაც გაუმჯობესებულია კოდის სისწორე. მას აქვს რამდენიმე ძირითადი ფუნქცია, როგორიცაა მეხსიერების უსაფრთხოება, მონაცემთა კონკურენტულობა, უფრო გამოხატული ტიპის სისტემები, უცვლელი ნაგულისხმევად მითითებები და ცვლადები, მთელი რიცხვების უსაფრთხო მართვა, სტანდარტულ ბიბლიოთეკებში შეცდომების უკეთესი მართვა და მრავალი სხვა მეტი.

რას ნიშნავს Rust-ზე გადასვლა ანდროიდისთვის?

Google ამბობს, რომ ბოლო 18 თვის განმავლობაში ამატებს Rust-ის მხარდაჭერას Android Open Source Project-ში. მაგრამ Android პლატფორმაზე ახალი ენის დამატება უზარმაზარი წამოწყებაა. საჭიროა გარკვეული ინსტრუმენტების ჯაჭვისა და დამოკიდებულების შენარჩუნება, სატესტო ინფრასტრუქტურა და ხელსაწყოები უნდა განახლდეს და დეველოპერები უნდა გაიარონ ტრენინგი.

Google-ს აქვს რამდენიმე ადრეული მიმღების პროექტი, რომლებსაც ისინი გააზიარებენ უახლოეს თვეებში. მაგრამ ასეც რომ იყოს, ცხადი ხდება, რომ Rust-ის მხარდაჭერის სკალირება უფრო მეტ OS-ზე მრავალწლიანი პროექტია.

როგორც ჩვენ ვხედავთ, Google უკვე იყენებს Rust-ს რამდენიმე ადგილას. Android-ის ახალი Bluetooth სტეკის გადაწერა კოდის სახელით "გაბელდორშე“ წერია რუსთში. მუშაობა Gabeldorsche-ზე დაიწყო Android 11-ის დროს, მაგრამ ჯერ კიდევ არ გამოიყენება. ანდროიდის Keystore 2.0 მოდული დაწერილია Rust-ში, ისევე როგორც მომხმარებლის სივრცის ნაწილი, Android-ის IPC დრაივერი. მიუხედავად იმისა, რომ არ არის დაკავშირებული Android-თან, ფუქსიაახალია netstack რუსთაც იწერება.

აპლიკაციის დეველოპერებისთვის, გადამრთველი არაფერს ცვლის იმის შესახებ, თუ როგორ წერთ აპებს თქვენ, როგორც აპლიკაციის შემქმნელი, ან როგორ მუშაობს ჩარჩო API-ები. ეს გადამრთველი მოქმედებს მხოლოდ იმაზე, თუ როგორ ჩაიწერება OS. Android Developer Relations გუნდის წევრის თქმით, Google ასევე არ გეგმავს Rust NDK-ის გამოშვებას ამჟამად. აპლიკაციის განვითარებისთვის მხარდაჭერილი ენები კვლავ იქნება Kotlin, Java, C და C++.