Компания Google обяви, че включва езика за програмиране Rust сред допустимите езици за разработка на платформата Android. Компилаторът на езика Rust беше включен в дървото на изходните файлове на Android още през 2019 г., но поддръжката на този език оставаше експериментална. Сред първите компоненти на Rust, които се планира да бъдат доставени в Android, са новите реализации на механизма за междупроцесно взаимодействие Binder и Bluetooth стека.
Внедряването на Rust беше осъществено в рамките на проект за засилване на сигурността, насърчаване на безопасни практики за програмиране и повишаване на ефективността при откриването на проблеми с паметта в Android. Подчертава се, че около 70% от всички опасни уязвимости, открити в Android, са причинени от грешки при работа с паметта. Използването на езика Rust, който е фокусиран върху безопасната работа с паметта и предоставя автоматично управление на паметта, ще намали риска от уязвимости, причинени от грешки при работа с паметта, като достъп до освободена памет и излизане извън пределите на буфера.
Безопасната работа с паметта в Rust се осигурява по време на компилация чрез проверка на препратките, проследяване на собствеността на обектите и вземане предвид на времето на живот на обектите (област на видимост), както и чрез оценка на коректността на достъпа до паметта по време на изпълнението на кода. Rust също предоставя средства за защита от преливания на цели числа, изисква задължителна инициализация на стойностите на променливите преди употреба, по-добре обработва грешките в стандартната библиотека, прилага концепцията за неизменяемост (immutable) на препратките и променливите по подразбиране и предлага силна статична типизация за минимизиране на логическите грешки.
В Android безопасната работа с паметта се осигурява в вече поддържаните езици Kotlin и Java, но те не са подходящи за разработка на системни компоненти поради големите разходи. Rust предлага възможност за постигане на производителност, близка до тази на езиците C и C++, което позволява използването му за разработка на нискоуровневи части от платформата и компоненти за взаимодействие с хардуера.
За осигуряване на безопасността на кода на C и C++ в Android се прилага sandbox изолация, статичен анализ и fuzzing тестване. Възможностите за sandbox изолация са ограничени и са достигнали своя предел (по-нататъшното делене на процеси не е целесъобразно от гледна точка на потреблението на ресурси). Сред ограниченията на приложението на sandbox се споменават високите разходи и увеличеното потребление на памет, предизвикано от необходимостта от създаване на нови процеси, както и допълнителни забавяния, свързани с използването на IPC.
В същото време sandbox не елиминира уязвимостите в кода, а само намалява рисковете и усложнява провеждането на атака, тъй като за експлоатацията се изисква откритие на не една, а на няколко уязвимости. Методите, основани на тестване на кода, са ограничени от това, че за разкриването на грешки е необходимо да се създадат условия за проявление на проблема. Не е възможно да се обхванат всички възможни варианти, затова много грешки остават незабелязани.
За системните процеси в Android компанията Google спазва "правилото на двете", според което всеки добавен код не трябва да подлежи на повече от две условия от три: работа с неконтролирани входни данни, използване на небезопасен език за програмиране (C/C++) и изпълнение без твърда sandbox изолация (наличие на повишени привилегии). От това правило следва, че кодът за обработка на външни данни трябва или да бъде ограничен до минимални привилегии (изолиран), или да бъде написан на безопасен език за програмиране.
Google не цели да преписва вече съществуващия код на C/C++ на Rust, а планира да използва този език за разработка на нов код. Използването на Rust за нов код е разумно, тъй като статистиката показва, че повечето грешки излизат наяве в новия или наскоро променения код. По-специално, около 50% от откритите грешки в паметта в Android се разкриват в код, написан преди по-малко от година.

Източник: opennet.ru
