CyberGlossary

Уязвимости

Уязвимость форматной строки

Также известно как: printf format bug

Определение

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

Уязвимости форматной строки возникают, когда разработчик пишет printf(user_input) вместо printf("%s", user_input). Спецификаторы %x утечкой раскрывают стек, %s разыменовывает произвольные указатели, а %n записывает число выведенных байт по указанному адресу — это даёт примитивы произвольного чтения и записи. Классические цели эксплуатации — записи GOT/PLT, указатели функций или стековые канарейки. Современные toolchain-ы выдают предупреждения (-Wformat-security, FORTIFY_SOURCE), а многие языки запрещают такой шаблон, но баг по-прежнему встречается в старом C, embedded-прошивках и оболочках. Защита механистична: не передавать недоверенный ввод как форматную строку и применять типизированные форматтеры — fmtlib, Rust println!, Go fmt с явными «глаголами».

Примеры

  • CVE-2000-0573 (wu-ftpd): форматная строка в site exec, удалённый root.
  • Встраиваемые маршрутизаторы, пишущие в syslog поля, контролируемые атакующим.

Связанные термины