Американские исследователи предложили необычный подход к защите программного обеспечения — намеренно добавлять в код программы ошибки.
Они создали систему, которая автоматически добавляет в код множество ошибок, но таких, которые не могут привести к реальной уязвимости, а только к завершению программы или другим некритическим проблемам. Предполагается, что это помешает злоумышленниками искать настоящие уязвимости, рассказывают исследователи в статье.
Обычно программные ошибки приводят лишь к некорректному функционированию самой программы, но в некоторых случаях они позволяют злоумышленнику исполнять произвольный код, который, к примеру, может красть личные данные пользователя. Для защиты от таких ошибок существует несколько способов. Самый очевидный из них — ручной или автоматизированный поиск ошибок и их исправление. Кроме того, существуют механизмы усложнения эксплуатации существующих уязвимостей, такие как рандомизация размещения адресного пространства, или языки программирования с автоматическим управлением памятью, которые также повышают безопасность написанных на них программ.
Группа исследователей в области компьютерной безопасности из Нью-Йоркского университета под руководством Брендана Долан-Гавитта (Brendan Dolan-Gavitt) предложила контринтуитивный метод повышения безопасности программ, в основе которого лежит добавление в них новых ошибок. Основная идея исследователей заключается в том, что чем больше количество «поддельных» ошибок в коде программы, тем больше времени понадобится злоумышленнику на поиск критических ошибок и написание программы для их эксплуатации.
В своей работе авторы сконцентрировались на безопасности доступа к памяти компьютера. Созданная ими система создает «безопасные» ошибки, приводящие к переполнению буфера, в частности, переполнению стека и кучи. Для автоматизированного создания таких ошибок исследователи воспользовались представленной в 2016 утилитой LAVA.
Исследователи заложили в систему два важных ограничения. Она создает ошибки, которые не приводят к некорректной работе при использовании нормальных данных, реально используемых пользователями. Также она ограничивает значения данных, используемых для нарушения целостности памяти и требует, чтобы перезаписываемые данные не использовались программой. Таким образом, она создает контролируемые ошибки в определенных местах программы и с определенными параметрами, в результате чего генерируемые ошибки не несут в себе серьезной опасности.
Разработчики протестировали систему на трех программах — популярном веб-сервере nginx, библиотеке кодирования аудиофайлов libFLAC и системной утилите file из Unix-подобных операционных систем. Исследователи давали программам данные из двух наборов — нормальные значения и значения, которые должны привести к аварийному завершению программы из-за внедренной ошибки. Авторы показали, что система способна внедрять тысячи ошибок в код программ, но их наличие не приводит к некорректному функционированию программ в ответ на корректные данные. Кроме того, исследователи протестировали метод на программе для фаззинга и отладчике, и показали, что созданные ими ошибки рассматриваются такими программами как потенциально эксплуатируемые, а значит, могут привлечь внимание злоумышленников.
В 2015 году разработчики из Массачусетского технологического университета представили алгоритм для автоматического исправления ошибок в программах, а в 2016 году представили его значительно доработанную версию, способную к самообучению.
Источник: https://nplus1.ru/news/2018/08/07/chaff-bugs
Хорошая идея, на мой взгляд. Правда, будет есть ресурсы, но в отдельных случаях и на некоторое время можно включать, чтоб помотать нервы и потратить время особо одарённых. Будет неплохо если ошибки хорошо продумать и замаскировать выдавая за настоящие.
Пример на коленке:
if(strstr($_GET['id'], "'"))
{
header($_SERVER['SERVER_PROTOCOL'].' 503 Service Temporarily Unavailable');
header('Status: 503 Service Temporarily Unavailable');
echo "QUERY: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1421";
exit;
}
else
{
$id=(int)$_GET['id'];
if($s=mqsqli::select("SELECT `name` FROM `table_users_base` WHERE `id`='$id'"))
{
$s=$s->fetch_assoc;
$name=$s['name'];
}
}
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.