2.9. Дополнительная литература 1 29
C l 1 разработаны как легко заменяемые аналоги для существующих вызовов. В результате
эти функции могут использоваться в качестве профилактики для снижения вероятности
возникновения уязвимостей в существующем старом коде. Выбор того или иного подхо
да часто предполагает компромисс между удобством и безопасностью. Более безопасные
функции часто имеют больше условий ошибок, а менее безопасные стараются почти лю
бой ценой дать допустимый результат для заданного набора входных данных. Выбор биб
лиотек также ограничен выбором языка программирования, платформы и требованиям
переносимости.
Имеются практичные стратегии предупреждения, которые могут использоваться для
устранения уязвимостей, являющихся результатом переполнения буфера. Использовать
все стратегии предупреждения непрактично , поскольку каждая из них требует определен
ных усилий, а то и имеет конкретную коммерческую стоимость. Однако некоторые стра
тегии прекрасно дополняют друг друга. Статический анализ может использоваться для
выявления потенциальных проблем в ходе аудита исходного кода. Анализ исходного кода
выполняется совместно с тестированием, что несколько снижает его стоимость. Динами
ческий анализ может использоваться в сочетании с тестированием для выявления условий
переполнения.
Реп1ения времени выполнения, такие как проверка выхода за границы, канарейки и
безопасные библиотеки , влияют на производительность приложения и могут вступать
в конфликты одно с другим. Н апример, может не иметь смысла использовать канареек в
сочетании с безопасными библиотеками, поскольку каждое решение осуществляет более
или менее одну и ту же функциональность, хотя и по-разному.
Переполнения буферов являются наиболее частым источником уязвимостей про
граммного обеспечения, и к ним не следует относиться легкомысленно. Мы рекомендуем
стратегию глубокой обороны (defense-in-depth), заключающуюся в применении нескольких
стратегий, когда это возможно. Однако первой и главной стратегией является информи
рование программистов о том, как избежать написания уязвимого кода.
• 2.9. ДопоJПiителъная литература
Статья " Smashing the Stack for Fun and Profit" предоставляет богатый материал по пе
реполнению буферов от Алефа Вана (Aleph One) [ 1 ] . В Building Secure Software [ 2 1 7 ] вы
найдете всестороннее обсуждение переполнений в куче и стеке.
Глава
Уловки с ука зателям и
В соавторстве с Робом Муравски (Rob Murawski) 1
Да он трещит едва ль не вдвое тише,
Чем на огне у фермера каштаны.
Пугайте им детейР
- Уильям Шекспир (William Shakespeare)
Укрощение строптивой, акт 1, сцена 2
Уловки с указателями (pointer subterfuge) - обобщенное название эксплойтов, которые
модифицируют значения указателей [ 1 62 ] . Языки программирования С и С++ различают
указатели на объекты и указатели на функции. Тип указателя на void или на объектный
тип называется типом объектных указателей, или указателей на объекты. Тип указате
ля, который указывает на функцию, называется т ипом функциональных указателей, или
указателей на функции. Указатель на объект типа Т для краткости будем называть просто
"указателем на т". С++ определяет также т ип указателей на члены, который представляет
собой тип указателей, которые указывают на нестатические члены классов.
Указатели на функции могут быть перезаписаны злоумышленником таким образом,
чтобы передавать управление предоставленному им же шеллкоду. Когда программа вы
полняет вызов через указатель на функцию, вместо предполагаемого кода выполняется
код злоумышленника.
Указатели на объекты также могут быть изменены для выполнения произвольного
кода. Если объектный указатель используется как целевой для последующего присваива
ния, взломщик может управлять адресом для изменения других ячеек памяти.
В этой главе подробно рассматриваются изменения функциональных и объектных ука
зателей. Она отличается от других глав этой книги тем, что в ней рассматриваются меха
низмы, которые злоумышленник может применять для выполнения произвольного кода
1 Роберт Муравски ( Robert Murawski) -- технический сотрудник CERT Program в Carnegie Mellon's
Software Engineering lnstitute (SEI ).
2 Перевод П. Мелковой.