
CVE-2026-27280の詳細な分析と概念実証。Adobe DNG SDKの`dng_render_task::ProcessArea`における領域外書き込みで、Androidの画像デコードAPIを介して到達可能。根本原因、悪用可能性の評価、RCEギャップ分析を含む。
dng_render_task::ProcessArea における領域外書き込み(Adobe DNG SDK / Android)通常のDNGファイルからAndroidの公開画像デコードAPIを通じて到達可能であり、
Galaxy S25上で、端末自身の/system/lib64/libdng_sdk.soを使用して再現しました。
DNG_REQUIRE(srcArea.Size() == dstArea.Size()) + srcAreaインデックス)#12 AImageDecoder_decodeImage /system/lib64/libjnigraphics.so
#11 android::ImageDecoder::decode /system/lib64/libhwui.so
#09 SkCodec::getPixels /system/lib64/libhwui.so
#08 SkRawCodec::onGetPixels /system/lib64/libhwui.so
#07 dng_render::Render() /system/lib64/libdng_sdk.so
#06 SkDngHost::PerformAreaTask /system/lib64/libhwui.so
#00 dng_render_task::ProcessArea /system/lib64/libdng_sdk.so <-- 脆弱性あり
ProcessAreaは、タイルサイズの一時バッファをsrcAreaにマッピングしますが、dstArea座標でインデックス付けします。srcArea = dstArea + fSrcOffsetであり、fSrcOffsetはファイルのDefaultCropOrigin — 実際のカメラDNGでは常に非ゼロ — であるため、宛先ポインタはfSrcOffset * rowStep * pixelSizeだけ割り当て領域からずれ、マスクの読み戻しがそこに書き込まれます。これは変位であり、整数オーバーフローではないため、巨大な割り当てを必要としません。だからこそ、スマートフォン上で到達可能なのです。
01-vulnerability/ 脆弱性あり・修正済みのdng_render.cpp、および2471→2502の差分
02-poc/ ジェネレータ、ローダ、プローブ(ソース)+ プリビルド済みarm64バイナリ
03-samples/ DNGファイル
04-evidence/ ASANログ、端末のtombstone、プローブ出力
05-analysis/ 根本原因、ジェネレータ、隣接測定、RCEギャップ分析
以前の判定を超える作業: その主張のうち2つを測定によって反証し、「破損したポインタが使用されるか」というギャップを埋め、チェーンが停止する正確な理由を特定します。最初に06-rce-lab/README.mdを読んでください。evidence/*.mdファイルは実験ごとのレポートであり、src/ + apk/は再現可能なハーネスです。
adb push 02-poc/bin-arm64/poc_aimg 03-samples/trigger_natural_croporigin.dng /data/local/tmp/
adb shell "cd /data/local/tmp && chmod 755 poc_aimg && ./poc_aimg trigger_natural_croporigin.dng"
# -> Segmentation fault, tombstone frames inside libdng_sdk.so
arm64ローダを再ビルドするには、Android独自のdng_sdkフラグ(Android.bpから)が必要です。そうしないと、構造体レイアウトが搭載ライブラリと一致しません:
-DUNIX_ENV=1 -DqDNGBigEndian=0 -DqDNGThreadSafe=1 -DqDNGUseLibJPEG=1 \
-DqDNGUseXMP=0 -DqDNGValidateTarget=1 -DqDNGUsingSanitizer=1 -DqLinux=1 -DqAndroid=1
これはCVE-2026-27280(DNG SDK 1.7.1 2471以前、CWE-787、CVSS 3.1 7.8 HIGH)に相当し、2026-03-10に公開 — バージョン範囲とクラスで一致し、Adobeが関数名を特定したことによる確認ではありません。
実機のAndroidデコードパス上で、2026-01-01にパッチ適用された端末で証明済み:
攻撃者が選択した宛先への領域外書き込み(4バイト粒度、双方向、ASLR非依存); プレーンなDNGからAImageDecoderを通じて到達可能で、Samsung Galleryをサムネイルローダ内で強制終了させることを実証; 隣接領域の静かな決定的破壊; free()に到達する破損したポインタ(N1解決); DNG形式で表現されたヒープスプレー(ImageStats × SubIFD); スプレーしたオブジェクトへの書き込みの照準、6/10 vs 0/10。
AndroidパスではRCEではなく、その根本的な理由は1つ: コードは単一の値0x3F800000しか書き込めません。すべてはそこから派生します — 書き込みは連続的であり(Scudoヘッダ上のストライドなし)、書き込むゼロはなく(長さ/参照カウントの破壊なし)、タグを保持する部分的な上書きには正確に1つの固定ターゲットオフセットがあります。1つの値は、ランダム化された256 MBのリザベーションに対する1回の試行であり、スプレーの量や並行性を増やしても試行回数は増えません。デスクトップSDKでは書き込み可能なセットは256値 → 約67 MBの帯域にわたって256回の試行となり、7.8がそこで正しい理由です。
以前の判定(05-analysis/05-exploitability-verdict.md)から撤回され、測定によって反証されました: 「実際のデコーダはスプレープリミティブを提供しない」 および 「オーバーラップは単一のデコード内から操作できない」。ブロックの原因はPAC、BTI、Scudoのチェックサムではなく — 単一の書き込み可能な値であり、Adobeの2502修正がsrcAreaでのインデックス付けによって根本的に除去するコードの特性です。
動作するエクスプロイトは構築されておらず、ここに公開されているものもありません。
| ファイル | 機能 |
|---|
trigger_natural_croporigin.dng | 自然なジオメトリ(DefaultCropOrigin = 8,8); AImageDecoderをクラッシュさせる |
benign_reference.dng | 原点0の同一ファイル — 正常にデコードされ、ヒープのプローブに使用 |
silent_corruption.dng | 小さいサイズクラス: クラッシュせずに領域外書き込み(5/5) |
far_write_crash.dng | 大きな変位: 明確にフォールトする |
| ファイル | 内容 |
|---|
01-root-cause.md | バグ、修正、書き込みの形状 |
02-dng-generator.md | トリガーファイルの構築方法、2つの調整ノブ、落とし穴 |
03-neighbours.md | 制御可能性の数値、バッファの隣にあるもの、緩和策 |
04-what-is-missing-for-rce.md | 証明されていること(P1-P8)、証明されていないこと(N1-N3)、残りのステップ |
05-exploitability-verdict.md | 以前の判定 — 06-rce-labによって取って代わられ、記録用に保持 |
| ファイル | 内容 |
|---|
EXP1-stride-vs-scudo.md | ストライド vs Scudoヘッダ: 抽象論では可能、Androidパスでは不可能(planes==1) |
EXP2-N1-corrupted-pointer-used.md | 破損したポインタがfree()に到達 — N1は解決 |
EXP2-real-process.md | 実際のSamsung Galleryプロセスでの書き込み、何も仕掛けていない |
EXP-imagestats-spray.md | 以前の判定が不可能と呼んだヒープスプレーを、DNG形式で表現 |
EXP-aimed-spray.md | スプレーしたオブジェクトへの書き込みの照準: 6/10 vs 0/10 |
EXP-small-class-in-app.md | 実際のアプリプロセス内で到達可能なコードポインタ |
EXP-band-commit.md / EXP-concurrency.md | ターゲットのコミットが失敗する理由: 書き込み可能な値1つ = 1回の試行 |
EXP-write-read-mismatch.md | 2つ目の欠陥 + ProcessAreaの完全なソース監査 |
EXP-value-1.0f.md | 1.0fをデータとして使う経路、構造的に閉鎖 |