
Fuzzing potenziato per tmux utilizzando OSS-Fuzz. Include harness personalizzati `cmd-fuzzer` e `argument-fuzzer` per una migliore copertura del codice e una PoC per `CVE-2020-27347`
Software Security @ EPFL, Primavera 2025
In questo laboratorio, abbiamo potenziato le attività di fuzzing per il multiplexer di terminale tmux nell'infrastruttura OSS-Fuzz di Google. Abbiamo innanzitutto stabilito una baseline valutando la copertura delle righe dell'harness input-fuzzer esistente, sia con che senza il suo corpus di seed fornito, riscontrando una copertura iniziale comparabile. Successivamente, abbiamo identificato due regioni di codice significative in tmux scarsamente esercitate dal fuzzer di baseline. Per colmare queste lacune di copertura, abbiamo sviluppato e valutato due nuovi harness di fuzzing mirati, cmd-fuzzer e argument-fuzzer, dimostrando la loro capacità di migliorare la copertura in queste aree precedentemente poco testate. Poiché questi miglioramenti al fuzzing non hanno scoperto nuove vulnerabilità critiche entro i tempi del progetto, la nostra analisi dei crash si è concentrata su una vulnerabilità storica nota. Abbiamo sviluppato una prova di concetto (PoC) per CVE-2020-27347 (un buffer overflow basato su stack), analizzato la sua causa principale, discusso la correzione implementata e valutato le sue implicazioni per la sicurezza.
Questo progetto mirava ad applicare e migliorare le tecniche di fuzzing sul multiplexer di terminale open-source tmux, utilizzando il framework OSS-Fuzz. Il progetto ha compreso diverse fasi chiave:
Valutazione della Baseline (Parte 1):
input-fuzzer esistente per tmux.Analisi delle Lacune di Copertura (Parte 2):
tmux non adeguatamente esercitate dall'input-fuzzer.arguments.c) e sulla logica di parsing/esecuzione dei comandi (moduli cmd-parse.c, cmd-*.c) come aree chiave per il miglioramento.Miglioramento del Fuzzer (Parte 3):
argument-fuzzer: progettato specificamente per testare la logica di parsing degli argomenti da riga di comando in arguments.c.cmd-fuzzer: progettato per testare i percorsi di parsing ed esecuzione dei comandi, mirando a cmd-parse.c e a vari moduli cmd-*.c.Analisi dei Crash (Parte 4):
tmux (CVE-2020-27347).La consegna finale è organizzata come segue (all'interno della directory submission/):
submission/
├── README.md # This file
├── part_1/ # Files for Part 1: Baseline Evaluation
│ ├── oss-fuzz.diff # Diff for removing seed corpus for input-fuzzer
│ ├── project.diff # (Likely empty or minor for Part 1)
│ ├── remove_seed_corpus.patch # The actual patch file used
│ ├── report/ # HTML Coverage reports for input-fuzzer
│ │ ├── w_corpus/
│ │ └── wo_corpus/
│ ├── run.w_corpus.sh # Script to run input-fuzzer with corpus
│ └── run.wo_corpus.sh # Script to run input-fuzzer without corpus
├── part_3/ # Files for Part 3: Fuzzer Improvements
│ ├── coverage_noimprove/ # Baseline coverage (e.g., from input-fuzzer without corpus)
│ │ └── ...
│ ├── improve1/ # Improvement 1: argument-fuzzer
│ │ ├── coverage_improve1/ # Coverage report for argument-fuzzer
│ │ ├── oss-fuzz.diff # OSS-Fuzz config changes for argument-fuzzer
│ │ ├── project.diff # Tmux changes for argument-fuzzer (e.g., new .cc, Makefile.am)
│ │ └── run.improve1.sh # Script to run argument-fuzzer
│ └── improve2/ # Improvement 2: cmd-fuzzer
│ ├── coverage_improve2/ # Coverage report for cmd-fuzzer
│ ├── oss-fuzz.diff # OSS-Fuzz config changes for cmd-fuzzer
│ ├── project.diff # Tmux changes for cmd-fuzzer
│ └── run.improve2.sh # Script to run cmd-fuzzer
├── part_4/ # Files for Part 4: Crash Analysis (CVE-2020-27347)
│ ├── environment/ # Docker environment for PoC
│ │ ├── Dockerfile
│ │ ├── run_tmux_cve_test.sh # Core PoC test logic
│ │ ├── test_fixed.sh
│ │ └── test_vulnerable.sh
│ └── run.poc.sh # Script to build Docker image and run PoC tests
└── report.pdf # The comprehensive project report
(Nota: la directory scripts/ contenente _run_fuzz_core.sh è un ausilio e farebbe parte della radice se questo README si trovasse nella radice effettiva del progetto, accanto a submission/)
Tutte le campagne di fuzzing e la riproduzione della PoC della CVE sono progettate per essere eseguite all'interno di ambienti Docker orchestrati da script di shell.
Tutte le campagne di fuzzing e la riproduzione della PoC della CVE sono progettate per essere eseguite all'interno di ambienti Docker orchestrati da script di shell.
Prerequisiti:
bash e client git.[email protected] se gli script devono clonare oss-fuzz (provano a clonarlo se oss-fuzz/ non viene trovato nella radice del progetto). In alternativa, puoi pre-clonare https://github.com/google/oss-fuzz.git nella radice del progetto.Architettura Generale degli Script:
Il progetto utilizza uno script core centralizzato, scripts/_run_fuzz_core.sh (non incluso nella directory submission/ ma parte della struttura complessiva del progetto presupposta da questo README). Gli script runner individuali situati in submission/part_1/, submission/part_3/improve1/, submission/part_3/improve2/ e submission/part_4/ sono responsabili di:
oss-fuzz.diff specifiche dell'esecuzione a un checkout pulito del repository oss-fuzz (previsto in ../../oss-fuzz rispetto alla maggior parte degli script runner).PROJECT, HARNESS, LABEL, i percorsi delle patch specifiche del progetto e le directory di output)._run_fuzz_core.sh, che si occupa quindi di:
tmux).submission/.Esecuzione degli Script:
In generale, si consiglia di eseguire gli script runner dalla directory radice del progetto per garantire una corretta risoluzione dei percorsi relativi per oss-fuzz/ e le directory di output.
1. Parte 1: Valutazione della Baseline (input-fuzzer)
Questi script valutano l'input-fuzzer esistente per tmux.
# From the project root directory:
./submission/part_1/run.w_corpus.sh # Run input-fuzzer with default seed corpus
./submission/part_1/run.wo_corpus.sh # Run input-fuzzer without seed corpus
run.w_corpus.sh usa il comportamento di build predefinito di tmux per quanto riguarda i seed.
run.wo_corpus.sh applica submission/part_1/remove_seed_corpus.patch (tramite il suo oss-fuzz.diff locale, che farebbe riferimento a questa patch o ne integrerebbe le modifiche) a oss-fuzz/projects/tmux/build.sh per garantire che non venga utilizzato alcun corpus di seed iniziale. I rapporti di copertura vengono esportati in submission/part_1/report/w_corpus/ and submission/part_1/report/wo_corpus/ e submission/part_1/report/wo_corpus/ rispettivamente.
2. Parte 3: Miglioramenti del Fuzzer (input-fuzzer)
Miglioramento 1 (argument-fuzzer): mira a arguments.c.
# From the project root directory:
./submission/part_3/improve1/run.improve1.sh
Miglioramento 2 (cmd-fuzzer): mira a cmd-parse.c e all'esecuzione dei comandi.
# From the project root directory:
./submission/part_3/improve2/run.improve2.sh
Ogni script run.improveX.sh applica il proprio oss-fuzz.diff locale e imposta PROJECT_PATCH_FILE sul proprio project.diff locale (che aggiunge il nuovo codice del fuzzer a tmux e aggiorna Makefile.am). I rapporti di copertura vengono esportati nelle rispettive directory submission/part_3/improveX/coverage_improveX/. La directory submission/part_3/coverage_noimprove/ contiene la copertura di baseline della Parte 1 per il confronto.
# From the project root directory:
./submission/part_4/run.poc.sh
Questo script crea un'immagine Docker dedicata (da submission/part_4/environment/Dockerfile) e testa tmux 3.1b (vulnerabile) rispetto al commit corretto a868bac.
(Spiegazioni dettagliate, figure e tabelle sono disponibili nel report.pdf completo)
input-fuzzer esistente.arguments.c), il parsing/esecuzione dei comandi (cmd-parse.c, cmd-*.c) e la logica client/server (client.c, server.c), erano in gran parte non esercitate (ad es., arguments.c con ~5.8% di copertura delle righe).argument-fuzzer (mirato a arguments.c): ha raggiunto il 66.62% di copertura delle righe per arguments.c, un aumento sostanziale rispetto alla baseline di ~5.8%.cmd-fuzzer (mirato al parsing ed esecuzione dei comandi): ha aumentato la copertura delle righe per cmd-parse.c al 42.58% (dal ~27%) e la copertura delle funzioni al 77.78%.arguments.c è salita al 45.54% tramite questo fuzzer.cmd.c ha raggiunto il 39.14% di copertura delle righe.cmd-*.c (ad es., cmd-bind-key.c, cmd-set-options.c fino al 50% di copertura delle funzioni) e nelle routine di gestione dei tasti (key-string.c fino al 30% di copertura delle righe, key-bindings.c fino al 6.05% di copertura delle righe).6a33a12) utilizzando il payload \033[::::::7::1:2:3::5:6:7:m.a868bac di tmux (che include la correzione e porta alla versione 3.1c) non era suscettibile al crash.argument-fuzzer, cmd-fuzzer) ha richiesto una buona comprensione della logica interna di parsing di argomenti e comandi di tmux per mirare a specifici percorsi di codice non esercitati.cmd-fuzzer per coprire una gamma più ampia di moduli cmd-*.c, in particolare quelli che gestiscono interazioni di stato complesse come manipolazioni di finestre, layout o pannelli.cmd-parse.y per generare sequenze di comandi sintatticamente più valide e complesse.