
CodeQL detector per la causa principale di CVE-2022-2869 (CWE-191 underflow senza segno) che utilizza l'analisi del flusso di controllo/dell'intervallo per identificare pattern vulnerabili senza codificare funzioni specifiche.
Questo progetto implementa un rilevatore CodeQL generale per la debolezza alla radice di CVE-2022-2869: una sottrazione senza segno che può andare in underflow perché il programma non ha stabilito un controllo sufficiente di limite inferiore/ordine prima dell'operazione aritmetica.
Il rilevatore segnala deliberatamente la causa principale (CWE-191) piuttosto che codificare in modo rigido tiffcrop.c, nomi di funzioni o nomi di variabili. Utilizza la libreria standard Overflow di CodeQL, il cui ragionamento sui controlli si basa sull'analisi del flusso di controllo/degli intervalli. Non utilizza l'ordinamento per numero di riga del codice sorgente come sostituto della dominanza del flusso di controllo.
UnsignedUnderflow.ql — rilevatore primario da inviare.report.md — spiegazione della vulnerabilità e della query.test/mini_tiffcrop_like.c — casi non sicuri simili a CVE più controlli sicuri.test/mini_tiffcrop_variant.c — una variazione strutturalmente diversa più controllo sicuro.test/EXPECTED_RESULTS.md — comportamento positivo/negativo previsto.original/ORIGINAL_VALIDATION.md — cosa deve essere dimostrato su LibTIFF vulnerabile.Da questa directory:
codeql pack install
Esempio su Linux/WSL:
codeql database create db-tests \
--language=cpp \
--command="gcc -std=c11 -O0 -g test/mini_tiffcrop_like.c -o /tmp/test1 && gcc -std=c11 -O0 -g test/mini_tiffcrop_variant.c -o /tmp/test2"
Eseguire la query:
codeql query run UnsignedUnderflow.ql --database=db-tests
La query CodeQL è analisi statica. ASan è una prova facoltativa che mostra la conseguenza delle variazioni personalizzate.
gcc -std=c11 -O0 -g -fsanitize=address test/mini_tiffcrop_like.c -o mini1
./mini1 # sicuro
./mini1 unsafe-x2 # errore di memoria previsto
gcc -std=c11 -O0 -g -fsanitize=address test/mini_tiffcrop_variant.c -o mini2
./mini2 # sicuro
./mini2 unsafe # errore di memoria previsto
Costruire un database CodeQL da una revisione LibTIFF vulnerabile (ad esempio 4.3.0), quindi eseguire esattamente la stessa query UnsignedUnderflow.ql su quel database. Catturare il risultato in tools/tiffcrop.c, in particolare computeInputPixelOffsets.
Il rilevatore non deve essere modificato per menzionare tiffcrop, computeInputPixelOffsets, x2 o crop_width; altrimenti sarebbe sovradattato a una singola istanza CVE e fallirebbe il requisito di variazione dell'assegnazione.