
Улучшенный фаззинг для tmux с использованием OSS-Fuzz. Включает пользовательские обвязки `cmd-fuzzer` и `argument-fuzzer` для улучшенного покрытия кода и PoC для `CVE-2020-27347`.
Безопасность программного обеспечения @ EPFL, весна 2025
В этой лабораторной работе мы улучшили усилия по фаззингу для терминального мультиплексора tmux в рамках инфраструктуры OSS-Fuzz от Google. Сначала мы установили базовый уровень, оценив покрытие строк существующего харнесса input-fuzzer, как с предоставленным начальным корпусом, так и без него, отметив сопоставимое начальное покрытие. Затем мы выявили две значительные области кода в tmux, плохо покрываемые базовым фаззером. Для устранения этих пробелов в покрытии мы разработали и оценили два новых целевых харнесса фаззинга: cmd-fuzzer и argument-fuzzer, продемонстрировав их способность улучшить покрытие в этих ранее недостаточно тестируемых областях. Поскольку эти улучшения фаззинга не выявили новых критических уязвимостей в рамках временных рамок проекта, наш анализ сбоев сосредоточился на известной исторической уязвимости. Мы разработали доказательство концепции (PoC) для CVE-2020-27347 (стековое переполнение буфера), проанализировали её первопричину, обсудили применённое исправление и оценили её последствия для безопасности.
Этот проект был направлен на применение и улучшение методов фаззинга для открытого терминального мультиплексора tmux с использованием фреймворка OSS-Fuzz. Проект включал несколько ключевых этапов:
Базовая оценка (Часть 1):
input-fuzzer для tmux.Анализ пробелов в покрытии (Часть 2):
tmux, недостаточно покрываемые input-fuzzer.arguments.c), логике разбора и выполнения команд (cmd-parse.c, модули cmd-*.c) как на ключевых областях для улучшения.Улучшение фаззера (Часть 3):
argument-fuzzer: специально предназначен для тестирования логики разбора аргументов командной строки в arguments.c.cmd-fuzzer: предназначен для тестирования путей разбора и выполнения команд, нацелен на и различные модули .Финальная версия организована следующим образом (внутри каталога submission/):
submission/
├── README.md # Этот файл
├── part_1/ # Файлы для Части 1: Базовая оценка
│ ├── oss-fuzz.diff # Diff для удаления корпуса семян для input-fuzzer
│ ├── project.diff # (Вероятно, пустой или незначительный для Части 1)
│ ├── remove_seed_corpus.patch # Фактический файл патча, который использовался
│ ├── report/ # HTML-отчёты о покрытии для input-fuzzer
│ │ ├── w_corpus/
│ │ └── wo_corpus/
│ ├── run.w_corpus.sh # Скрипт для запуска input-fuzzer с корпусом
│ └── run.wo_corpus.sh # Скрипт для запуска input-fuzzer без корпуса
├── part_3/ # Файлы для Части 3: Улучшения фаззера
│ ├── coverage_noimprove/ # Базовое покрытие (например, от input-fuzzer без корпуса)
│ │ └── ...
│ ├── improve1/ # Улучшение 1: argument-fuzzer
│ │ ├── coverage_improve1/ # Отчёт о покрытии для argument-fuzzer
│ │ ├── oss-fuzz.diff # Изменения конфигурации OSS-Fuzz для argument-fuzzer
│ │ ├── project.diff # Изменения Tmux для argument-fuzzer (например, новый .cc, Makefile.am)
│ │ └── run.improve1.sh # Скрипт для запуска argument-fuzzer
│ └── improve2/ # Улучшение 2: cmd-fuzzer
│ ├── coverage_improve2/ # Отчёт о покрытии для cmd-fuzzer
│ ├── oss-fuzz.diff # Изменения конфигурации OSS-Fuzz для cmd-fuzzer
│ ├── project.diff # Изменения Tmux для cmd-fuzzer
│ └── run.improve2.sh # Скрипт для запуска cmd-fuzzer
├── part_4/ # Файлы для Части 4: Анализ сбоев (CVE-2020-27347)
│ ├── environment/ # Docker-окружение для PoC
│ │ ├── Dockerfile
│ │ ├── run_tmux_cve_test.sh # Основная логика теста PoC
│ │ ├── test_fixed.sh
│ │ └── test_vulnerable.sh
│ └── run.poc.sh # Скрипт для сборки Docker-образа и запуска тестов PoC
└── report.pdf # Полный отчёт по проекту
(Примечание: Каталог scripts/, содержащий _run_fuzz_core.sh, является вспомогательным и будет частью корня, если этот README находится в истинном корне проекта рядом с submission/)
Все кампании фаззинга и воспроизведение PoC CVE предназначены для запуска в Docker-окружениях, управляемых shell-скриптами.
Все кампании фаззинга и воспроизведение PoC CVE предназначены для запуска в Docker-окружениях, управляемых shell-скриптами.
Предварительные требования:
bash и клиент git.[email protected], если скриптам нужно клонировать oss-fuzz (они пытаются клонировать, если oss-fuzz/ не найден в корне проекта). В качестве альтернативы вы можете предварительно клонировать https://github.com/google/oss-fuzz.git в корень проекта.Общая архитектура скриптов:
Проект использует централизованный основной скрипт scripts/_run_fuzz_core.sh (не включён в каталог submission/, но является частью общей структуры проекта, которую предполагает этот README). Индивидуальные скрипты запуска, расположенные в submission/part_1/, submission/part_3/improve1/, submission/part_3/improve2/ и submission/part_4/, отвечают за:
oss-fuzz.diff к чистой копии репозитория oss-fuzz (ожидается, что он находится по пути ../../oss-fuzz относительно большинства скриптов запуска).PROJECT, HARNESS, LABEL, пути к специфичным для проекта патчам и выходным каталогам)._run_fuzz_core.sh, который затем обрабатывает:
tmux).submission/.Запуск скриптов:
Обычно рекомендуется запускать скрипты из корневого каталога проекта, чтобы обеспечить правильное разрешение относительных путей для oss-fuzz/ и выходных каталогов.
1. Часть 1: Базовая оценка (input-fuzzer)
Эти скрипты оценивают существующий input-fuzzer для tmux.
# Из корневого каталога проекта:
./submission/part_1/run.w_corpus.sh # Запуск input-fuzzer с корпусом по умолчанию
./submission/part_1/run.wo_corpus.sh # Запуск input-fuzzer без корпуса семян
run.w_corpus.sh использует поведение сборки tmux по умолчанию в отношении семян.
run.wo_corpus.sh применяет submission/part_1/remove_seed_corpus.patch (через свой локальный oss-fuzz.diff, который либо ссылается на этот патч, либо включает его изменения) к oss-fuzz/projects/tmux/build.sh, чтобы гарантировать, что начальный корпус семян не используется. Отчёты о покрытии экспортируются в submission/part_1/report/w_corpus/ и submission/part_1/report/wo_corpus/ соответственно.
2. Часть 3: Улучшения фаззера (input-fuzzer)
Улучшение 1 (argument-fuzzer): Нацелен на arguments.c.
# Из корневого каталога проекта:
./submission/part_3/improve1/run.improve1.sh
Улучшение 2 (cmd-fuzzer): Нацелен на cmd-parse.c и выполнение команд.
# Из корневого каталога проекта:
./submission/part_3/improve2/run.improve2.sh
Каждый скрипт run.improveX.sh применяет свой локальный oss-fuzz.diff и устанавливает PROJECT_PATCH_FILE на свой локальный project.diff (который добавляет новый код фаззера в tmux и обновляет Makefile.am). Отчёты о покрытии экспортируются в соответствующие каталоги submission/part_3/improveX/coverage_improveX/. Каталог submission/part_3/coverage_noimprove/ содержит базовое покрытие из Части 1 для сравнения.
# Из корневого каталога проекта:
./submission/part_4/run.poc.sh
Этот скрипт собирает выделенный Docker-образ (из submission/part_4/environment/Dockerfile) и тестирует tmux 3.1b (уязвимая версия) против исправленного коммита a868bac.
(Подробные объяснения, рисунки и таблицы можно найти в полном отчёте report.pdf)
input-fuzzer.arguments.c), разбор/выполнение команд (cmd-parse.c, cmd-*.c), а также клиент-серверная логика (client.c, server.c), оставались в значительной степени неиспользованными (например, arguments.c с ~5.8% покрытия строк).argument-fuzzer (нацелен на arguments.c): Достиг 66.62% покрытия строк для arguments.c, что является значительным увеличением по сравнению с базовым ~5.8%.cmd-fuzzer (нацелен на разбор и выполнение команд): Увеличил покрытие строк для cmd-parse.c до 42.58% (с ~27%) и покрытие функций до 77.78%.arguments.c также выросло до 45.54% через этот фаззер.cmd.c достиг 39.14% покрытия строк.cmd-*.c (например, cmd-bind-key.c, cmd-set-options.c до 50% покрытия функций) и подпрограммах обработки клавиш (key-string.c до 30% покрытия строк, key-bindings.c до 6.05% покрытия строк).6a33a12) с использованием полезной нагрузки \033[::::::7::1:2:3::5:6:7:m.a868bac (который включает исправление и приводит к версии 3.1c) не был подвержен сбою.argument-fuzzer, cmd-fuzzer) потребовала хорошего понимания внутренней логики обработки аргументов и команд tmux для нацеливания на конкретные неиспользованные пути кода.cmd-fuzzer для покрытия более широкого набора модулей cmd-*.c, особенно тех, которые работают со сложными взаимодействиями состояний, такими как манипуляции с окнами, разметкой или панелями.cmd-parse.y для генерации более синтаксически корректных и сложных последовательностей команд.cmd-parse.ccmd-*.cАнализ сбоев (Часть 4):
tmux (CVE-2020-27347).