このプロジェクトは、CVE-2022-2869 の根本的な弱点に対する汎用 CodeQL 検出器を実装します。その弱点とは、算術演算の前に十分な下限値/順序ガードが確立されていないためにアンダーフローを引き起こす可能性がある符号なし減算です。
この検出器は、tiffcrop.c、関数名、変数名をハードコーディングするのではなく、根本原因(CWE-191) を意図的に報告します。CodeQL の標準 Overflow ライブラリを使用しており、そのガード推論は制御フロー/範囲解析に基づいています。制御フローの支配関係の代わりにソースコードの行番号順序を使用することはありません。
UnsignedUnderflow.ql — 提出用の主要検出器。report.md — 脆弱性とクエリの説明。test/mini_tiffcrop_like.c — CVE に類似した安全でないケースと安全な対照ケース。test/mini_tiffcrop_variant.c — 構造的に異なるバリエーションと安全な対照ケース。test/EXPECTED_RESULTS.md — 意図された陽性/陰性の動作。original/ORIGINAL_VALIDATION.md — 脆弱な LibTIFF 上で実証すべき内容。このディレクトリから:
codeql pack install
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"
クエリを実行:
codeql query run UnsignedUnderflow.ql --database=db-tests
CodeQL クエリは静的解析です。ASan は、カスタムバリエーションの結果を示す任意の証拠です。
gcc -std=c11 -O0 -g -fsanitize=address test/mini_tiffcrop_like.c -o mini1
./mini1 # 安全
./mini1 unsafe-x2 # メモリエラーが予想される
gcc -std=c11 -O0 -g -fsanitize=address test/mini_tiffcrop_variant.c -o mini2
./mini2 # 安全
./mini2 unsafe # メモリエラーが予想される
脆弱な LibTIFF リビジョン(例: 4.3.0)から CodeQL データベースを構築し、そのデータベースに対してまったく同じ UnsignedUnderflow.ql クエリを実行します。tools/tiffcrop.c、特に computeInputPixelOffsets で結果を取得します。
検出器は tiffcrop、computeInputPixelOffsets、x2、crop_width に言及するように変更してはなりません。変更すると、単一の CVE インスタンスに過適合となり、課題のバリエーション要件を満たせなくなります。