În baza de cod a nucleului Linux, pe care se bazează versiunea 6.18, a fost implementat mecanismul de comunicare interprocesuală Binder, scris în limbajul Rust. Binder este utilizat în Android pentru a organiza interacțiunea între procese și apelurile la distanță ale metodelor (un proces Android poate apela o metodă sau o funcție într-un alt proces Android, folosind Binder pentru a identifica, apela și transmite argumente între procese). Codul Binder a fost refăcut în Rust în cadrul unui proiect destinat îmbunătățirii securității, promovării tehnicilor de programare sigură și creșterii eficienței în identificarea problemelor legate de gestionarea memoriei în Android (aproximativ 70% dintre toate vulnerabilitățile periculoase, identificate în Android, sunt cauzate de erori în gestionarea memoriei).
Utilizarea Rust a permis soluționarea unor probleme cu care s-au confruntat dezvoltatorii Binder, inclusiv erori legate de numărarea referințelor, blocaje și verificarea limitelor, precum și o reducere semnificativă a complexității gestionării erorilor. Implementarea Binder în Rust este funcțional similară cu varianta inițială în limbajul C, trece toate testele AOSP (Proiectul Android Open-Source) și poate fi utilizată pentru a crea ediții funcționale ale firmware-ului Android. În ciuda capacităților avansate și a suportului pentru obiecte cu o semnificație de proprietate complexă, driverul în Rust este mai mic decât varianta în C — 5.5 față de 5.8 mii de linii de cod.
În descrierea commit-ului, autorul menționează următoarele motive pentru a rescrie Binder:
- Binder, care s-a dezvoltat timp de 15 ani, a crescut semnificativ în funcționalitate și complexitate — proiectul se află la intersecția tuturor componentelor Android și acoperă o multitudine de sarcini care depășesc cadrul IPC:
- analiza corectă și transformarea conținutului tranzacțiilor, care pot conține mai multe obiecte de tipuri diferite (de exemplu, pointeri, descriitori de fișiere), interacționând între ele;
- monitorizarea dimensiunii pool-urilor de fire în spațiul utilizatorului și asigurarea alocării tranzacțiilor către fire într-un mod care să evite blocajele reciproce atunci când pool-ul de fire este epuizat;
- urmărirea contoarelor de referință ale obiectelor partajate de mai multe procese, transmițând corect modificările contoarelor de referință între procese;
- procesarea mai multor scenarii de erori și combinarea a 13 blocări diferite, 7 contoare de linkuri și variabile atomice. În plus, trebuie să rezolve aceste sarcini cât mai rapid și corect.
- Vechea bază de cod a acumulat o datorie tehnică semnificativă, complicând atât identificarea erorilor, cât și dezvoltarea ulterioară. De exemplu, în nucleu există funcții mari de peste o mie de linii de cod, metode de gestionare a erorilor îndoielnice și structuri complicate.
- Binder este un component critic din punct de vedere al securității în Android, deoarece elementele platformei care funcționează în medii sandbox izolate, cum ar fi procesul de redare în Chrome și SW Codec, au acces direct la acesta, iar o vulnerabilitate în Binder ar putea ocoli izolarea. Complexitatea ridicată împreună cu datoria tehnică complică foarte mult menținerea unui nivel înalt de securitate în Binder.
Sursa: opennet.ro
