Авторизоваться
Дмитрий Цирульников 12.03.2021 Опубликована

Может ли язык программирования уменьшить уязвимости?

Rust предлагает более безопасный язык программирования, но его внедрение все еще остается проблемой, несмотря на недавние признаки роста его популярности.

Когда Microsoft захотела переписать критически важный для безопасности агент сетевой обработки, чтобы устранить уязвимости, связанные с безопасностью памяти, вызывающие повторяющиеся головные боли для Microsoft Security Response Center (MSRC), компания поручила стажеру переписать код на Rust. 

Rust, язык программирования, который пять лет подряд претендовал на звание «самого любимого» среди разработчиков, может изменить ландшафт уязвимостей, практически устранив определенные типы ошибок, связанных с безопасностью памяти. Претензия языка на известность заключается в том, что он обеспечивает скорость и контроль C и C++, обеспечивая при этом гарантии безопасности и надежности других языков, таких как Go и Python. Почти 70% уязвимостей, обрабатываемых MSRC, классифицируются как проблемы с безопасностью памяти, поэтому устранение класса уязвимостей имеет решающее значение.

Обсуждая свое недавно обнаруженное предпочтение Rust, Александр Кларк, стажер-программист MSRC, заявил в своем блоге, что, хотя написать программу, которая будет компилироваться на C++, может быть проще, полученная программа с большей вероятностью будет иметь ошибки и уязвимости.

«Сообщения об ошибках компилятора [Rust] справедливо известны своей полезностью» - говорит он. «Посредством сообщений об ошибках Rust реализует концепции безопасного программирования, точно сообщая вам, почему код неправильный и при этом предоставляет возможные предложения, как это исправить».

Спустя более десяти лет после того, как Mozilla приняла и начала переписывать код для своего браузера Firefox с использованием Rust, этот язык может быть готов к взлету. Несмотря на то, что внедрение продолжает оставаться анемичным - только 5,1% разработчиков используют язык Rust, согласно «Опросу разработчиков StackOverflow 2020» - ряд крупных компаний взяли на себя обязательство использовать Rust в конкретных проектах разработки. 

Mozilla Foundation поставляла код, разработанный с использованием этого языка, в свой браузер Firefox, начиная с 2016 года. В 2019 году Microsoft заявила о своем намерении  более широко использовать Rust для написания системного программного обеспечения для Windows. А в феврале Mozilla выделила проект под управление новой Rust Foundation с спонсорами-основателями Microsoft, Google, Amazon и Huawei.

Почему растет популярность? «Дело не только в скорости и безопасности, по крайней мере, для разработчиков» - говорит Эшли Уильямс, исполняющий обязанности исполнительного директора Rust Foundation.

«Я в шутку отвечу, что у нас есть талисман в виде животного» - смеется она. «На самом деле, когда люди говорят о любви к Rust, есть язык и компилятор, но также и идея, что сообщество должно быть приветливым, а управление пакетами должно быть первоклассным. Есть все эти ценности, которые люди ценят».

Для компаний решение сводится к возможностям, недоступным в Rust. При правильном использовании языка компилятор предупреждает - и отказывается компилировать - определенные шаблоны кодирования,  которые приводят к переполнению буфера, уязвимостям использования после освобождения, проблемам с двойным освобождением памяти и отклонениям нулевого указателя. 

«Вы заключаете кровный договор с компилятором» - говорит Уильямс. «Вы пишете свой код определенным образом, чтобы компилятор знал, что ваш код правильный».

Для Microsoft ошибки, которые может предотвратить Rust, составляют большинство уязвимостей, которым компания присваивает идентификаторы Common Vulnerability and Exposures (CVE). Использование языка программирования для создания основных компонентов системы может помочь уменьшить основной источник уязвимостей, сказал в своем блоге Райан Левик, главный защитник облачных разработчиков в Microsoft.

«Мы считаем, что Rust меняет правила игры, когда дело касается написания безопасного системного программного обеспечения» - сказал он. «Rust обеспечивает производительность и контроль, необходимые для написания низкоуровневых систем, одновременно давая возможность разработчикам программного обеспечения писать надежные и безопасные программы».

Однако языки программирования, обещающие дополнительную безопасность, не всегда делают это.

В январе 1996 года Sun Microsystems анонсировала Java 1.0. Язык может похвастаться переносимым кодом - например, «напиши один раз, запусти где угодно» - но Sun также рекламировала ряд атрибутов безопасности, таких как автоматическое управление памятью, то есть «сборка мусора», а также безопасность типов и возможность изолировать апплеты от изменения системных ресурсов.

Перенесемся в сегодняшний день. Согласно опросу StackOverflow, с распространением около 40% Java является пятым по популярности языком после JavaScript, HTML / CSS, SQL и Python. Тем не менее, программы Java составляли 15% из более чем 6000 уязвимостей, обнаруженных в компонентах с открытым исходным кодом в 2019 году, за C, на долю которого приходилось 30%, и PHP, на долю которого приходилось 27%, согласно "The State of Open Source Security 2020" Отчет, опубликованный фирмой по обеспечению безопасности программного обеспечения WhiteSource.

Java показывает, что разработчики во имя эффективности часто не используют функции безопасности и вместо этого продолжают создавать небезопасный код. 

Rust более категоричен в своем подходе, чем Java, но этот язык, скорее всего, не избежит потенциального нарушения безопасности разработчиками. Хотя Rust обеспечивает безопасность памяти, он также позволяет обойти это - ключевое слово "UNSAFE". Использование ключевого слова позволяет разработчику переопределить компилятор и предотвратить проверку компилятором блока кода - якобы потому, что разработчик утверждает, что код безопасен.

Многие энтузиасты Rust - «Rustaceans», как их называют - утверждают, что чрезмерное использование ключевого слова подрывает модель Rust. Хотя в дебатах есть нюансы, Уильямс понимает суть.

«Есть люди, которые используют блокировку UNSAFE небезопасным способом» - говорит она. «Если вы поместите что-то в небезопасный блок, компилятор не будет это проверять, а если вы ошибаетесь, вы можете ввести ошибку памяти».

Тем не менее, она указывает, что даже при использовании возможности только корректного переопределения компилятора уязвимости, скорее всего, проникнут в программы разработчиков, и - поскольку исследователи безопасности и хакеры, как правило, находят проблемы, оставленные разработчиком - эти уязвимости будут обнаружены. Показательный пример: сайт безопасности RustSec, ориентированный на Rust, перечисляет более 250 уязвимостей в пакетах Rust - или «crates» - и языке. 

«Пейзаж уязвимостей не является абсолютным, поэтому всегда появляются новые уязвимые места» - говорит Уильямс. «Некоторые языки могут быть более безопасными, чем другие, но ... не существует такой вещи, как полностью безопасная система, особенно если на ваш целевой язык обращается много хакеров».

Коментарии
Авторизоваться что-бы оставить комментарий
Присоединяйся в тусовку
Наш сайт использует файлы cookie для вашего максимального удобства. Пользуясь сайтом, вы даете свое согласие с условиями пользования cookie