Coverage-guided fuzzing is the industry standard for automated vulnerability discovery, with platforms like OSS-Fuzz uncovering thousands of bugs in C/C++ projects. Yet Java fuzzing has yielded far fewer results: in OSS-Fuzz, Java makes up for 17% of projects but fewer than 0.5% of reported vulnerabilities. A key challenge is the gap between reaching and detecting vulnerabilities. In C/C++, memory-safety violations crash the program, providing a universal oracle. In contrast, Java's memory safety eliminates such crashes, forcing fuzzers like Jazzer to rely on sanitizers that check for specific vulnerability patterns at runtime. These sanitizers require precise predicates at the sink (e.g., a valid deserialization stream), but inputs must pass through multiple parsing and encoding layers, making such predicates difficult for byte-level mutation to satisfy. Consequently, fuzzers often generate inputs that reach vulnerable sinks but fail to trigger sanitizers, silently missing real bugs. To address this limitation, we propose Jazzy, a two-stage fuzzing framework based on loosened sanitizers (LoSan). In Stage 1, LoSan replaces strict crash predicates with relaxed checks that trigger on any evidence of fuzzer-controlled data reaching the sink (e.g., deserialization exceptions), decoupling sink reachability from exploit construction. In Stage 2, an agentic refinement system takes the previous stage findings and iteratively synthesizes inputs that satisfy the original, precise sanitizer predicates, producing confirmed vulnerabilities. We integrate this approach into an automated pipeline for sink identification, harness generation, and large-scale fuzzing. We evaluate Jazzy on 473 open-source Java projects (including 230 from OSS-Fuzz) and 2,455 Jenkins plugins. Jazzy reproduces 5 known CVEs that vanilla Jazzer fails to find within 24 hours and discovers 10 new vulnerabilities, including bugs in OSS-Fuzz targets missed by existing fuzzing infrastructure.
Il fuzzing guidato dalla copertura del codice è lo standard industriale per la scoperta automatica di vulnerabilità: piattaforme come OSS-Fuzz hanno identificato decine di migliaia di bug in progetti C e C++. Il fuzzing di Java, invece, ha prodotto risultati molto più modesti: pur costituendo circa il 17% dei progetti su OSS-Fuzz, Java rappresenta meno dello 0,5% delle vulnerabilità segnalate. La causa principale risiede nello scarto tra il raggiungere un punto di interesse vulnerabile (sink) e il rilevare la corrispondente vulnerabilità. Nei linguaggi non memory-safe come C e C++ una violazione della sicurezza della memoria fa terminare il programma in modo anomalo, fornendo un oracolo universale e gratuito. In Java, la memory safety garantita dalla Java Virtual Machine elimina questa classe di segnali, e i fuzzer devono affidarsi a sanitizer che verificano, a tempo di esecuzione, predicati specifici per ciascuna classe di vulnerabilità. Questi predicati impongono al fuzzer condizioni strutturali stringenti sul sink (ad esempio, uno stream di serializzazione Java valido o uno specifico nome di programma in un argomento di comando) che la mutazione a livello di byte raramente soddisfa, soprattutto quando l'input attraversa più livelli di codifica o parsing prima di raggiungere il sink. Questa tesi propone Jazzy, un framework di fuzzing a due fasi basato sui loosened sanitizer (LoSan). Nella prima fase, LoSan sostituisce i rigidi predicati di crash di Jazzer con controlli rilassati che si attivano in presenza di qualsiasi evidenza del fatto che dati controllati dal fuzzer abbiano raggiunto il sink. Nella seconda fase, un sistema di raffinamento agentico basato su Large Language Model trasforma ogni crash prodotto da LoSan in un input che soddisfa il predicato originale del sanitizer, producendo una vulnerabilità confermata. L'intero approccio è inserito in una pipeline automatizzata che si occupa di identificazione dei sink, costruzione del progetto, verifica del dataflow e generazione di harness di fuzzing. Su 473 progetti Java open source (di cui 230 provenienti da OSS-Fuzz) e 2 455 plugin Jenkins, Jazzy riproduce 5 CVE note che la versione vanilla di Jazzer non riesce a trovare in 24 ore e scopre 10 nuove vulnerabilità, alcune in progetti già sottoposti a fuzzing continuo da OSS-Fuzz.
Jazzy: towards effective fuzzing of Java with loosened sanitizers
SIMEI, LUCA
2025/2026
Abstract
Coverage-guided fuzzing is the industry standard for automated vulnerability discovery, with platforms like OSS-Fuzz uncovering thousands of bugs in C/C++ projects. Yet Java fuzzing has yielded far fewer results: in OSS-Fuzz, Java makes up for 17% of projects but fewer than 0.5% of reported vulnerabilities. A key challenge is the gap between reaching and detecting vulnerabilities. In C/C++, memory-safety violations crash the program, providing a universal oracle. In contrast, Java's memory safety eliminates such crashes, forcing fuzzers like Jazzer to rely on sanitizers that check for specific vulnerability patterns at runtime. These sanitizers require precise predicates at the sink (e.g., a valid deserialization stream), but inputs must pass through multiple parsing and encoding layers, making such predicates difficult for byte-level mutation to satisfy. Consequently, fuzzers often generate inputs that reach vulnerable sinks but fail to trigger sanitizers, silently missing real bugs. To address this limitation, we propose Jazzy, a two-stage fuzzing framework based on loosened sanitizers (LoSan). In Stage 1, LoSan replaces strict crash predicates with relaxed checks that trigger on any evidence of fuzzer-controlled data reaching the sink (e.g., deserialization exceptions), decoupling sink reachability from exploit construction. In Stage 2, an agentic refinement system takes the previous stage findings and iteratively synthesizes inputs that satisfy the original, precise sanitizer predicates, producing confirmed vulnerabilities. We integrate this approach into an automated pipeline for sink identification, harness generation, and large-scale fuzzing. We evaluate Jazzy on 473 open-source Java projects (including 230 from OSS-Fuzz) and 2,455 Jenkins plugins. Jazzy reproduces 5 known CVEs that vanilla Jazzer fails to find within 24 hours and discovers 10 new vulnerabilities, including bugs in OSS-Fuzz targets missed by existing fuzzing infrastructure.| File | Dimensione | Formato | |
|---|---|---|---|
|
2026_07_Simei_Thesis.pdf
accessibile in internet per tutti a partire dal 24/06/2027
Dimensione
553.25 kB
Formato
Adobe PDF
|
553.25 kB | Adobe PDF | Visualizza/Apri |
|
2026_07_Simei_executive_summary.pdf
accessibile in internet per tutti a partire dal 24/06/2027
Dimensione
281.39 kB
Formato
Adobe PDF
|
281.39 kB | Adobe PDF | Visualizza/Apri |
I documenti in POLITesi sono protetti da copyright e tutti i diritti sono riservati, salvo diversa indicazione.
https://hdl.handle.net/10589/260546