
CodeQL-Detektor für die Grundursache von CVE-2022-2869 (CWE-191 unsigned underflow) unter Verwendung von Kontrollfluss-/Bereichsanalyse, um verwundbare Muster zu identifizieren, ohne bestimmte Funktionen fest zu kodieren.
Dieses Projekt implementiert einen allgemeinen CodeQL-Detektor für die Grundschwäche hinter CVE-2022-2869: eine vorzeichenlose Subtraktion, die unterlaufen kann, weil das Programm vor der Arithmetik keine ausreichende Untergrenzen-/Ordnungsprüfung etabliert hat.
Der Detektor meldet bewusst die Grundursache (CWE-191) anstatt tiffcrop.c, Funktionsnamen oder Variablennamen fest zu kodieren. Er verwendet CodeQLs standardmäßige Overflow-Bibliothek, deren Guard-Logik auf Kontrollfluss-/Bereichsanalyse basiert. Er verwendet keine Quellcode-Zeilennummern-Reihenfolge als Ersatz für Kontrollfluss-Dominanz.
UnsignedUnderflow.ql — primärer Detektor zur Einreichung.report.md — Schwachstellen- und Abfrageerklärung.test/mini_tiffcrop_like.c — CVE-ähnliche unsichere Fälle plus sichere Kontrollen.test/mini_tiffcrop_variant.c — eine strukturell unterschiedliche Variation plus sichere Kontrolle.test/EXPECTED_RESULTS.md — beabsichtigtes Positiv-/Negativverhalten.original/ORIGINAL_VALIDATION.md — was an verwundbarem LibTIFF demonstriert werden muss.Aus diesem Verzeichnis:
codeql pack install
Beispiel unter 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"
Die Abfrage ausführen:
codeql query run UnsignedUnderflow.ql --database=db-tests
Die CodeQL-Abfrage ist statische Analyse. ASan ist optionale Evidenz, die die Konsequenz der benutzerdefinierten Variationen zeigt.
gcc -std=c11 -O0 -g -fsanitize=address test/mini_tiffcrop_like.c -o mini1
./mini1 # sicher
./mini1 unsafe-x2 # erwarteter Speicherfehler
gcc -std=c11 -O0 -g -fsanitize=address test/mini_tiffcrop_variant.c -o mini2
./mini2 # sicher
./mini2 unsafe # erwarteter Speicherfehler
Erstellen Sie eine CodeQL-Datenbank aus einer verwundbaren LibTIFF-Revision (zum Beispiel 4.3.0) und führen Sie dann exakt dieselbe UnsignedUnderflow.ql-Abfrage gegen diese Datenbank aus. Erfassen Sie das Ergebnis in tools/tiffcrop.c, insbesondere computeInputPixelOffsets.
Der Detektor darf nicht geändert werden, um tiffcrop, computeInputPixelOffsets, x2 oder crop_width zu erwähnen; andernfalls wäre er auf eine einzelne CVE-Instanz überangepasst und würde die Variationsanforderung der Aufgabe nicht erfüllen.