Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #45, АВГУСТ 2004 г.

Дерни printf за хвост

Крис Касперски aka мыщъх

Спецвыпуск Xakep, номер #045, стр. 045-032-6


Заключение

Ошибки обработки спецификаторов – частный случай проблемы интерполяции строк. Некоторые языки, например Perl, позволяют не только форматировать вывод, но и внедрять переменные и даже функции (!) непосредственно в саму выводимую строку, что существенно упрощает и ускоряет программирование. К сожалению, хорошие идеи становятся фундаментом воинствующего вандализма. Удобство не сочетается с безопасностью. Что удобно программировать – удобно и ломать, хотя обратное утверждение неверно.

В общем, не воспринимай языковые возможности как догму. Подходи к ним творчески, отбирая только лучшие функции и операторы.

Функции, поддерживающие форматированный вывод

Услугами интерпретатора форматного ввода/вывода пользуется множество функций, не только printf и не только в консольных программах. Графические приложения и серверное программное обеспечение, исполняющееся под Windows NT, активно используют функцию sprintf, выводящую отформатированную строку в оперативный буфер.

Перечисленные в таблице функции сами по себе не опасны. Опасными их делает наличие пользовательского ввода в форматном аргументе. Именно такие участки кода и нужно искать при исследовании программы на уязвимость.

До сих пор не зафиксировано ни одной атаки с помощью форматного ввода на приложения Windows NT.

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

Если пользовательский ввод попадет в строку форматного вывода, злоумышленник сможет манипулировать интерпретатором форматного вывода по своему усмотрению.

Unicode-функции используют для завершения строки двойной символ нуля и к одиночным нулям относятся довольно лояльно.

snprintf значительно безопаснее sprintf, так как контролирует размер буфера-приемника и никогда не устроит переполнение.

Модифицируемая с помощью хитрости со спецификатором "%n", ячейка должна принадлежать странице с атрибутом PAGE_READWRITE, в противном случае процесс сгенерирует исключение.

Назад на стр. 045-032-5  Содержание