0Pricing
Cyber Security Academy · Урок

Уязвимости форматных строк

Эксплуатируйте форматные строки printf для чтения произвольной памяти и записи по произвольным адресам.

«Уязвимости форматных строк» — бесплатный урок Cyber Security Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cyber Security Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cyber Security Academy содержит 4 уроков всего.

Что такое уязвимость строки формата

Уязвимость строки формата возникает, когда пользовательские данные напрямую передаются в качестве аргумента строки формата функции printf() или аналогичной функции. Злоумышленник может читать память, раскрывать адреса стека и записывать произвольные значения.

Уязвимый шаблон

Уязвимый и безопасный варианты:

// VULNERABLE - user controls the format string:
printf(user_input);
fprintf(stderr, user_input);

// SAFE - user input is a data argument:
printf("%s", user_input);

Чтение памяти с помощью %x и %p

Спецификаторы формата без соответствующих аргументов считывают значения из стека:

# Input: %p.%p.%p.%p.%p
# Output: 0x7ffd12345678.0x400580.0x0.0x1.0x7f3a...
# Each %p prints the next value off the stack - leaking addresses!

Обход ASLR с помощью утечек через строки формата

В стеке часто находятся указатели на libc, стек и бинарный файл. Раскрывая их с помощью спецификаторов %p или %lx, злоумышленник может вычислить базовые адреса и обойти ASLR — даже без других уязвимостей.

Чтение произвольной памяти с помощью %s

%s воспринимает значение из стека как указатель и выводит строку по этому адресу. Разместив целевой адрес в нужной позиции стека и используя доступ к параметру (%7$s), злоумышленник считывает произвольные области памяти.

# Direct parameter access:
printf("%7$s")  # prints string at 7th stack parameter
# If 7th param is an address you control, reads that memory

Запись в память с помощью %n

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

Практический способ записи

Чтобы записать определённое значение с помощью %n:

  1. Получите контроль над указателем в стеке, который указывает на целевой адрес
  2. Используйте %Xc%N$n, чтобы вывести X символов, а затем записать их количество в N-й параметр (целевой адрес)

Такие инструменты, как pwntools, автоматизируют создание эксплойтов для строк формата.

Поиск ошибок в строках формата

Тестирование на наличие уязвимостей строк формата:

# Test inputs:
%x.%x.%x
%p.%p.%p
%s%s%s
AAAA.%p.%p.%p.%p (looking for 0x41414141 in output)

# Automated testing with fuzzer:
python3 -c "print('%p.' * 20)" | ./vuln

Защита: исправьте код

Исправление предельно простое: всегда передавайте пользовательские данные как аргумент данных, а не как строку формата.

// WRONG:
printf(buffer);

// RIGHT:
printf("%s", buffer);

// Compiler warning:
// gcc -Wformat-security will flag this

Строки формата в других языках

Уязвимости строк формата встречаются во многих языках:

  • C: printf(input)
  • Python: не то же самое, но форматирование с помощью % и входного словаря может раскрыть переменные
  • Java: String.format(input) — менее опасно, доступ к памяти отсутствует

Примеры из реального мира

Ошибки в строках формата затрагивали:

  • ProFTPD — позволял удалённо выполнять код с помощью команд FTP
  • WU-FTPD — позволял выполнять удалённый эксплойт с правами суперпользователя через строки формата
  • различные службы Linux до 2000-х годов

Современные компиляторы и FORTIFY_SOURCE помогают, но не устраняют этот класс уязвимостей полностью.

Быстрая проверка: строки формата

Какой спецификатор формата можно использовать, чтобы записать данные по произвольному адресу памяти в атаке через строку формата?

Итоги урока

Уязвимости строк формата возникают, когда пользовательские данные напрямую используются как строка формата для printf. %p/%x раскрывает содержимое стека; %s считывает данные по произвольным адресам; %n записывает данные по произвольным адресам. Исправление требует добавить всего один символ: printf("%s", input). Добавьте -Wformat-security во флаги компилятора, чтобы обнаруживать такие ошибки.

Часто задаваемые вопросы

Урок «Уязвимости форматных строк» бесплатный?

Да — полный текст урока «Уязвимости форматных строк» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cyber Security Academy, подпишись на CoddyKit PRO. Курс Cyber Security Academy содержит 4 уроков всего.

Чему я научусь в уроке «Уязвимости форматных строк»?

Эксплуатируйте форматные строки printf для чтения произвольной памяти и записи по произвольным адресам. Ты практикуешь Cyber Security Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Cyber Security Academy?

Предыдущий опыт не требуется. Cyber Security Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Уязвимости форматных строк»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Cyber Security Academy?

Да. Каждый урок Cyber Security Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Переполнение буфера стека
  2. Программирование, ориентированное на возврат (ROP)
  3. Уязвимости форматных строк
  4. Эксплуатация кучи: Use-After-Free и распыление кучи
← Назад к Cyber Security Academy