Дерни printf за хвост Крис Касперски aka мыщъх Спецвыпуск Xakep, номер #045, стр. 045-032-6 Заключение Ошибки обработки спецификаторов – частный случай проблемы интерполяции строк. Некоторые языки, например Perl, позволяют не только форматировать вывод, но и внедрять переменные и даже функции (!) непосредственно в саму выводимую строку, что существенно упрощает и ускоряет программирование. К сожалению, хорошие идеи становятся фундаментом воинствующего вандализма. Удобство не сочетается с безопасностью. Что удобно программировать – удобно и ломать, хотя обратное утверждение неверно. В общем, не воспринимай языковые возможности как догму. Подходи к ним творчески, отбирая только лучшие функции и операторы. Функции, поддерживающие форматированный вывод Услугами интерпретатора форматного ввода/вывода пользуется множество функций, не только printf и не только в консольных программах. Графические приложения и серверное программное обеспечение, исполняющееся под Windows NT, активно используют функцию sprintf, выводящую отформатированную строку в оперативный буфер. Перечисленные в таблице функции сами по себе не опасны. Опасными их делает наличие пользовательского ввода в форматном аргументе. Именно такие участки кода и нужно искать при исследовании программы на уязвимость. До сих пор не зафиксировано ни одной атаки с помощью форматного ввода на приложения Windows NT. Для аварийного завершения программы достаточно вызвать нарушение доступа, обратившись к невыделенной, несуществующей или заблокированной ячейке памяти. Если пользовательский ввод попадет в строку форматного вывода, злоумышленник сможет манипулировать интерпретатором форматного вывода по своему усмотрению. Unicode-функции используют для завершения строки двойной символ нуля и к одиночным нулям относятся довольно лояльно. snprintf значительно безопаснее sprintf, так как контролирует размер буфера-приемника и никогда не устроит переполнение. Модифицируемая с помощью хитрости со спецификатором "%n", ячейка должна принадлежать странице с атрибутом PAGE_READWRITE, в противном случае процесс сгенерирует исключение. |