本项目为 CVE-2022-2869 背后的根本弱点实现了一个通用 CodeQL 检测器:由于程序在进行算术运算前未建立足够的下界/顺序保护,导致无符号减法可能发生下溢。
该检测器有意报告根本原因(CWE-191),而非硬编码 tiffcrop.c、函数名或变量名。它使用 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 实例,并无法满足作业的变体要求。