
Улучшенный фаззинг для 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: предназначен для тестирования путей разбора и выполнения команд, нацелен на cmd-parse.c и различные модули cmd-*.c.Анализ сбоев (Часть 4):
tmux (CVE-2020-27347).Финальная версия организована следующим образом (внутри каталога 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 без корпуса семян