Google розробляє частини Android у Rust для покращення безпеки

Google пише та переписує частини Android у Rust, щоб покращити безпеку ОС у цілому, порівняно з C та C++. Читайте далі, щоб дізнатися більше!

Android як комплексне рішення ОС містить багато рухомих частин. У дуже широкому сенсі ці частини — це екосистема програми, а потім сама ОС. Як розробник, ваша мова програмування залежить від того, над якою частиною Android ви працюєте. Для розробників програм Java і Kotlin є популярними варіантами. Для розробників, які працюють над ОС і нижчими рівнями в ній, C і C++ досі були популярними виборами. Сьогодні Google додає третій варіант для розробників ОС, оскільки Android Open Source Project тепер підтримує мову програмування Rust для розробки самої ОС.

Обмеження C і C++

Нижчі рівні ОС Android вимагають системних мов програмування, таких як C і C++. Ці мови забезпечують розробникам контроль і передбачуваність, що важливо при доступі до системних ресурсів і обладнання низького рівня.

На жаль, C і C++ не забезпечують гарантії безпеки пам'яті, що робить їх схильними до помилок і вразливостей безпеки. Розробник відповідає за керування терміном служби пам’яті на цих мовах, але в складних і багатопоточних кодових базах це легше сказати, ніж зробити.

C і C++ разом складають десятки мільйонів рядків коду на платформі Android. Ці помилки безпеки пам’яті стають найважчим для усунення джерелом неправильного коду, що становить ~70% найсерйозніших уразливостей безпеки Android. Простого виправлення цих помилок стає недостатньо для вирішення проблеми, і кращим підходом було б спочатку запобігти їм.

Відсутність гарантій безпеки пам’яті змушує розробників запускати процеси Android у жорстко обмежених і непривілейованих пісочницях. Але пісочниці дорогі за ресурсами, споживають додаткові витрати та вводять затримку. Ізольоване програмне середовище також не усуває повністю вразливості коду, а його ефективність знижується через високу щільність помилок, що ще більше дозволяє зловмисникам з’єднати кілька вразливостей.

Іншим обмеженням, хоча і не унікальним для C і C++, але застосовним до всіх проблем із безпекою пам’яті, є те, що помилковий стан насправді має бути викликаний у інструментальному коді, щоб його виявити. Отже, навіть якщо ваш код пройшов відмінне тестування, справжня помилка може залишитися непоміченою. І коли помилки виявлені, їх виправлення є ще одним завданням, що включає тривалий і дорогий процес, який не завжди може привести до правильного виправлення. Таким чином, виявлення помилок стає ненадійним, і запобігання помилкам є кращим підходом у світлі цих обмежень.

Ось тут і з’являється перехід на безпечну для пам’яті мову, як-от Rust.

Іржа та її переваги

Rust надає гарантії безпеки пам’яті, використовуючи комбінацію перевірок під час компіляції, щоб перевірити час життя/володіння об’єктом, і перевірок під час виконання, щоб переконатися, що доступ до пам’яті дійсний. Ця безпека досягається при забезпеченні еквівалентної продуктивності C і C++. Rust також зменшує потребу в ізольованому програмному середовищі, надаючи розробникам більше простору для впровадження нових функцій, які є безпечнішими та меншими за ресурсами.

Незважаючи на те, що Rust справді має свої переваги, неможливо відразу перевести всю ОС Android на Rust. І це може навіть не знадобитися, оскільки більшість помилок пам’яті Android виникають у новому або нещодавно зміненому коді, причому близько 50% з них менше року. Google вважає, що його зусилля щодо збереження пам’яті мови краще зосередити на нових розробках, а не на переписуванні зрілого коду C і C++.

Rust також зосереджується на запобіганні помилкам, а не на виявленні помилок, що призводить до покращення правильності коду. Він має кілька ключових особливостей, таких як безпека пам’яті, паралельність даних, більш виразні системи типів, незмінність посилання та змінні за замовчуванням, безпечніша обробка цілих чисел, краща обробка помилок у стандартних бібліотеках та багато іншого більше.

Що означає перехід на Rust для Android?

Google каже, що протягом останніх 18 місяців додавав підтримку Rust до проекту Android Open Source. Але додавання нової мови до платформи Android – це величезна справа. Необхідно підтримувати деякі ланцюжки інструментів і залежності, оновлювати тестову інфраструктуру та інструменти, а розробників потрібно навчати.

У Google є кілька перших проектів, якими вони будуть ділитися в найближчі місяці. Але попри це стає зрозуміло, що масштабування підтримки Rust для більшої кількості ОС — це багаторічний проект.

З того, що ми бачимо, Google уже використовує Rust у кількох місцях. Новий стек Bluetooth Android під кодовою назвою "Габельдорше" пишеться мовою Rust. Робота над Gabeldorsche почалася приблизно під час Android 11, але вона ще не використовується. Android Сховище ключів 2.0 Модуль написаний на Rust, як і частина користувача binder, IPC-драйвер Android. Хоча це не стосується Android, Фуксіяновий netstack також пишеться мовою Rust.

Для розробників додатків перемикач нічого не змінює в тому, як ви, як розробник додатків, пишете додатки або як працюють інтерфейси API. Цей перемикач впливає лише на спосіб написання ОС. За словами члена групи зв’язків із розробниками Android, на даний момент Google також не планує випускати Rust NDK. Підтримуваними мовами для розробки програм залишаться Kotlin, Java, C і C++.