Новости
Rust избавляет Android от ошибок и помогает существенно сократить количество небезопасного кода
Внедрение безопасного программирования в новый код — это смена парадигмы, позволяющая нам использовать присущее уязвимостям угасание в своих интересах, даже в больших существующих системах.
Компания Google говорит, что ее усилия, направленные на приоритетную разработку безопасного для памяти программного обеспечения, которые предпринимались в течение последних шести лет, позволили существенно сократить количество уязвимостей в операционной системе Android, связанных с безопасностью памяти.
В отчете Google сообщает, что процент уязвимостей в Android, связанных с проблемами безопасности памяти, снизился с 76% в 2019 году до 24% к концу 2024 года, что значительно меньше отраслевой нормы в 70%.
Это значительное снижение риска для Android, которое член команды безопасности Android Джефф Вандер Стоеп и старший инженер-программист Google Алекс Реберт связывают с внедрением “безопасного программирования”, набора практик разработки, которые пытаются избежать появления уязвимостей с помощью безопасных для памяти языков программирования, включая Rust; статического анализа; и правильного проектирования API.
«Переход от предыдущих поколений к безопасному программированию можно увидеть в количественной оценке утверждений, которые делаются при разработке кода», — говорят Вандер Стоеп и Реберт.
«Вместо того чтобы фокусироваться на применяемых мерах (смягчениях, фаззинге) или пытаться использовать прошлую производительность для прогнозирования будущей безопасности, Safe Coding позволяет нам делать сильные утверждения о свойствах кода и о том, что может или не может произойти на основе этих свойств».
Разработка программного обеспечения на языках программирования, безопасных для памяти, таких как C#, Go, Java, Python, Swift и Rust, является важной частью безопасного кодирования. Недостатки безопасности памяти, такие как переполнение буфера, представляют собой большинство серьезных уязвимостей безопасности в больших кодовых базах, и это осознание привело к широкому стремлению государственного и частного секторов создавать меньше ошибок в безопасности памяти.
В основном эта цель достигается путем рекомендаций не использовать C и C++, которые требуют ручного управления памятью и приводят к уязвимостям, если только разработчики не проявляют исключительное усердие (это не осталось незамеченным сообществом C/C++, где безопасность памяти также стала приоритетом).
Для Google международный крестовый поход за безопасность памяти означал увеличение кода на языке Rust для Android и других проектов, который обеспечивает гарантии безопасности памяти без ущерба для производительности, по крайней мере, в большинстве случаев. И это повышает продуктивность.
«Безопасное кодирование повышает корректность кода и производительность разработчиков, смещая поиск ошибок дальше влево, еще до проверки кода», — говорят Вандер Стоеп и Реберт.
«Мы видим, что этот сдвиг проявляется в таких важных показателях, как частота откатов (экстренное исправление кода из-за непредвиденной ошибки). Команда Android заметила, что частота отката изменений в Rust в два раза ниже, чем в C++».
Хорошая новость для организаций с большим количеством небезопасного унаследованного кода заключается в том, что переписывать старый код на новых языках, скорее всего, нет необходимости. Как отмечают Вандер Стоеп и Реберт, уязвимости имеют период полураспада — они исчезают со временем по мере развития кода. «Например, исходя из среднего времени жизни уязвимостей, плотность уязвимостей в коде пятилетней давности от 3.4 (по данным исследования) до 7.4 раз меньше (по данным Android и Chromium) ниже, чем в новом коде», — говорят они.
Это не значит, что старые ошибки чудесным образом становятся неэксплуатируемыми. Скорее, общая плотность уязвимостей уменьшается — это статистический выигрыш, но не гарантия безопасности.
Тем не менее, если сосредоточиться на обеспечении совместимости старого кода с кодом, безопасным для памяти, и писать новый код на языках, безопасных для памяти, естественная скорость распада существующих уязвимостей со временем сделает большие кодовые базы безопаснее без обременительного пересмотра кода. Если вы перестаете создавать новые ошибки, связанные с безопасностью памяти, старые ошибки становятся менее значимыми, по крайней мере, в совокупности.
«Внедрение безопасного программирования в новый код — это смена парадигмы, позволяющая нам использовать присущее уязвимостям угасание в своих интересах, даже в больших существующих системах», — говорят Вандер Стоеп и Реберт.
«Концепция проста. Как только мы отключаем поток новых уязвимостей, их количество уменьшается по экспоненте, что делает весь наш код более безопасным, повышает эффективность проектирования систем безопасности и снимает проблемы масштабируемости, связанные с существующими стратегиями безопасности памяти, что позволяет применять их более эффективно и целенаправленно».