Google разработва части от Android в Rust, за да подобри сигурността

Google пише и пренаписва части от Android в Rust, за да подобри сигурността на операционната система като цяло, срещу C и C++. Прочетете, за да научите повече!

Android като цялостно решение за ОС включва много движещи се части. Най-общо казано, тези части са екосистемата на приложението и след това самата операционна система. Като разработчик избраният от вас език за програмиране варира в зависимост от това върху каква част от Android работите. За разработчиците на приложения Java и Kotlin са популярни опции. За разработчиците, работещи върху операционната система и по-ниските нива в нея, C и C++ са били популярни избори досега. Днес Google добавя трета опция за разработчиците на ОС, тъй като проектът с отворен код на Android вече поддържа езика за програмиране Rust за разработване на самата ОС.

Ограничения на C и C++

По-ниските нива на операционната система Android изискват системни програмни езици като C и C++. Тези езици предоставят на разработчиците контрол и предвидимост, което е важно при достъп до системни ресурси и хардуер на ниско ниво.

За съжаление, C и C++ не успяват да осигурят гаранции за безопасност на паметта, което ги прави податливи на грешки и уязвимости в сигурността. Разработчикът е отговорен за управлението на живота на паметта на тези езици, но в сложни и многонишкови кодови бази това е по-лесно да се каже, отколкото да се направи.

C и C++ заедно съставляват десетки милиони редове код на платформата Android. Тези грешки в безопасността на паметта се превръщат в най-трудния за адресиране източник на неправилен код, представляващ ~70% от уязвимостите в сигурността с висока степен на сериозност на Android. Самото коригиране на тези грешки става недостатъчно за справяне с проблема и по-добрият подход би бил да ги предотвратите на първо място.

Липсата на гаранции за безопасност на паметта принуждава разработчиците да изпълняват процеси на Android в строго ограничени и непривилегировани пясъчни кутии. Но пясъчните кутии са скъпи за ресурси, консумират допълнителни разходи и въвеждат латентност. Sandboxing също така не елиминира напълно уязвимостите на кода и неговата ефикасност е намалена поради високата плътност на грешки, което допълнително позволява на нападателите да свързват множество уязвимости във верига.

Друго ограничение, макар и не уникално за C и C++, но приложимо към всички проблеми с безопасността на паметта, е, че погрешното състояние трябва действително да бъде задействано в инструментиран код, за да бъде открито. Така че дори кодът ви да има отлично тестване, действителната грешка може да остане неоткрита. И когато се открият бъгове, коригирането им е друга задача, включваща дълъг и скъп процес, който не винаги може да доведе до правилна корекция. По този начин откриването на грешки става ненадеждно и предотвратяването на грешки е по-добрият подход в светлината на тези ограничения.

Това е мястото, където преминаването към безопасен за паметта език като Rust влиза в картината.

Ръждата и ползите от нея

Rust предоставя гаранции за безопасност на паметта, като използва комбинация от проверки по време на компилиране, за да наложи живот/собственост на обекта, и проверки по време на изпълнение, за да гарантира, че достъпът до паметта е валиден. Тази безопасност се постига при осигуряване на еквивалентна производителност на C и C++. Rust също така намалява нуждата от sandboxing, позволявайки на разработчиците повече пространство за въвеждане на нови функции, които са по-безопасни и по-малко ресурси.

Въпреки че Rust наистина има своите предимства, не е възможно да превключите цялата операционна система Android към Rust за една нощ. И това може дори да не е необходимо, тъй като повечето грешки в паметта на Android възникват в нов или наскоро модифициран код, като около 50% са на по-малко от година. Google вярва, че нейните усилия за безопасен за паметта език са най-добре фокусирани върху нови разработки, вместо да пренаписват зрял C и C++ код.

Rust също така се фокусира върху предотвратяването на грешки, вместо да разчита силно на откриването на грешки, което води до подобрена коректност на кода. Той има няколко ключови характеристики, като безопасност на паметта, едновременност на данни, по-изразителни типове системи, неизменност препратки и променливи по подразбиране, по-безопасна обработка на цели числа, по-добра обработка на грешки в стандартните библиотеки и много Повече ▼.

Какво означава преминаването към Rust за Android?

Google казва, че добавя поддръжка на Rust към проекта с отворен код на Android през последните 18 месеца. Но добавянето на нов език към платформата Android е огромно начинание. Някои вериги от инструменти и зависимости трябва да се поддържат, тестовата инфраструктура и инструментите трябва да се актуализират, а разработчиците трябва да бъдат обучени.

Google има няколко проекта за ранно осиновяване, които ще споделят през следващите месеци. Но дори и така става ясно, че мащабирането на поддръжката на Rust към повече от операционната система е многогодишен проект.

От това, което виждаме, Google вече използва Rust на няколко места. Новото пренаписване на Bluetooth стека на Android с кодово име "Габелдорше“ се пише на Rust. Работата по Gabeldorsche започна около времето на Android 11, но все още не се използва. на Android Keystore 2.0 модулът е написан на Rust, както и частта от потребителското пространство на binder, IPC драйвера на Android. Въпреки че не е свързано с Android, Фуксияе ново netstack също се пише на Rust.

За разработчиците на приложения превключването не променя нищо относно това как вие, като разработчик на приложения, пишете приложения или как работят API на рамката. Този превключвател засяга само начина на писане на операционната система. Според член на екипа за връзки с разработчиците на Android, Google също не планира да пусне Rust NDK в момента. Поддържаните езици за разработка на приложения ще продължат да бъдат Kotlin, Java, C и C++.