Американские исследователи предложили необычный подход к защите программного обеспечения — намеренно добавлять в код программы ошибки. Они создали систему, которая автоматически добавляет в код множество ошибок, но таких, которые не могут привести к реальной уязвимости, а только к завершению программы или другим некритическим проблемам. Предполагается, что это помешает злоумышленниками искать настоящие уязвимости, рассказывают исследователи в статье, опубликованной на arXiv.org.
Обычно программные ошибки приводят лишь к некорректному функционированию самой программы, но в некоторых случаях они позволяют злоумышленнику исполнять произвольный код, который, к примеру, может красть личные данные пользователя. Для защиты от таких ошибок существует несколько способов. Самый очевидный из них — ручной или автоматизированный поиск ошибок и их исправление. Кроме того, существуют механизмы усложнения эксплуатации существующих уязвимостей, такие как рандомизация размещения адресного пространства, или языки программирования с автоматическим управлением памятью, которые также повышают безопасность написанных на них программ.
Группа исследователей в области компьютерной безопасности из Нью-Йоркского университета под руководством Брендана Долан-Гавитта (Brendan Dolan-Gavitt) предложила контринтуитивный метод повышения безопасности программ, в основе которого лежит добавление в них новых ошибок. Основная идея исследователей заключается в том, что чем больше количество «поддельных» ошибок в коде программы, тем больше времени понадобится злоумышленнику на поиск критических ошибок и написание программы для их эксплуатации.
В своей работе авторы сконцентрировались на безопасности доступа к памяти компьютера. Созданная ими система создает «безопасные» ошибки, приводящие к переполнению буфера, в частности, переполнению стека и кучи. Для автоматизированного создания таких ошибок исследователи воспользовались представленной в 2016 утилитой LAVA.
Исследователи заложили в систему два важных ограничения. Она создает ошибки, которые не приводят к некорректной работе при использовании нормальных данных, реально используемых пользователями. Также она ограничивает значения данных, используемых для нарушения целостности памяти и требует, чтобы перезаписываемые данные не использовались программой. Таким образом, она создает контролируемые ошибки в определенных местах программы и с определенными параметрами, в результате чего генерируемые ошибки не несут в себе серьезной опасности.
Разработчики протестировали систему на трех программах — популярном веб-сервере nginx, библиотеке кодирования аудиофайлов libFLAC и системной утилите file из Unix-подобных операционных систем. Исследователи давали программам данные из двух наборов — нормальные значения и значения, которые должны привести к аварийному завершению программы из-за внедренной ошибки. Авторы показали, что система способна внедрять тысячи ошибок в код программ, но их наличие не приводит к некорректному функционированию программ в ответ на корректные данные. Кроме того, исследователи протестировали метод на программе для фаззинга и отладчике, и показали, что созданные ими ошибки рассматриваются такими программами как потенциально эксплуатируемые, а значит, могут привлечь внимание злоумышленников.
В 2015 году разработчики из Массачусетского технологического университета представили алгоритм для автоматического исправления ошибок в программах, а в 2016 году представили его значительно доработанную версию, способную к самообучению.
Григорий Копиев