Строка неконтролируемого формата
-
Определение и история уязвимости форматной строки
- Уязвимость форматной строки — это тип уязвимости, связанный с внедрением кода, который был обнаружен в 1989 году.
- Изначально считалось, что эксплойты форматной строки безвредны, но они могут использоваться для аварийного завершения программы или выполнения вредоносного кода.
- Проблема связана с использованием непроверенного пользовательского ввода в качестве параметра format string в функциях C, таких как printf().
-
Эксплуатация уязвимости
- Злоумышленник может использовать токены формата для печати данных из стека вызовов или других мест в памяти.
- Уязвимость позволяет записывать произвольные данные в произвольные места, используя токен формата %n.
- Типичный эксплойт включает комбинацию методов для контроля над указателем команд процесса.
-
Причины и последствия уязвимости
- Ошибки форматирования строк часто возникают из-за неправильного использования спецификаторов формата.
- Механизм varargs в C не является типобезопасным, что позволяет злоумышленникам использовать ошибки форматирования для выполнения кода.
- Ошибки в форматировании строк встречаются и в других языках программирования, но реже и не всегда могут быть использованы для атаки.
-
История обнаружения и распространения
- Ошибки форматирования были обнаружены в 1989 году во время тестирования в Университете Висконсина.
- Использование ошибок форматной строки в качестве вектора атаки было обнаружено в 1999 году.
- Первые эксплойты, привлекающие внимание к проблеме, были опубликованы в июне 2000 года.
-
Предотвращение уязвимости в компиляторах
- Многие компиляторы могут статически проверять формат строки и выдавать предупреждения.
- Приложения должны проверять строку формата перед ее использованием, а также быть осторожными при генерации или выборе строк формата «на лету».
-
Обнаружение уязвимости
- Уязвимость легко обнаруживается в исполняемых файлах, скомпилированных на x86, благодаря соглашению о вызове.
- Неправильное использование функций семейства printf может быть обнаружено путем подсчета количества аргументов, переданных функции.
-
Рекомендации и дальнейшее чтение
- В статье приведены ссылки на дополнительные ресурсы и материалы для углубленного изучения проблемы.