Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
mt6985-CVE-2026-43499 — MT6985 MediaTek Dimensity 9300(vivo PD2241)向け CVE-2026-43499 エクスプロイトアダプター | Kitploit
ツール/GitHubGitHub/233laoliu/mt6985-cve-2026-43499
エクスプロイトフレームワーク脆弱性分析エクスプロイトリバースエンジニアリングフォレンジックモバイルセキュリティファームウェア解析バイナリエクスプロイト
GitHub233laoliu/mt6985-cve-2026-43499

mt6985-CVE-2026-43499

MT6985 MediaTek Dimensity 9300(vivo PD2241)向け CVE-2026-43499 エクスプロイトアダプター

リポジトリを見る
1111ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-43499 失敗記録:MT6985 適応の試み

結論: 68M tokens を費やしたが、root は取れなかった。
原因: KernelSnitch のタイミング攻撃は MTK Dimensity 9200 では信頼性が低く、CONFIG_PANIC_ON_OOPS=y により試行錯誤の余地がなかった。
この記事は完全な失敗プロセスを記録し、後続の参考と回避策を提供する。


背景

項目値
デバイスvivo PD2241 (Dimensity 9200 / MT6985), Android 15
ファームウェアPD2241_A_15.2.10.2.W10.V000L1
カーネル5.15.178-android13-8-gfb31f5bdd612-dirty
Bootloaderロック済み (ro.boot.flash.locked=1)
SELinuxEnforcing
panic_on_oops有効 → カーネル OOPS 発生 = 即再起動
ExploitCyberMeowfia — CVE-2026-43499 (IonStack)
ソースツリーandroid_15.0_kernel_MT6985 (5.15.178) — デバイスバージョンと不一致 (ソースは android15 GKI、デバイスは android13 GKI を実行)

実施した作業

1. ソース解析 → 構造体オフセットの抽出

arch/arm64/include/asm/memory.h + include/linux/fs.h + android/abi_gki_aarch64.xml から抽出:

  • メモリレイアウト: KIMAGE_TEXT_BASE = 0xffffffc008000000, VA_BITS=39, DIRECT_MAP=256GB
  • task_struct: 36864 bits、完全解析 (ABI XML layout-offset-in-bits)
  • file_operations: iopoll なし (android13 GKI)、IOCTL=0x48、open=0x68
  • cred: atomic_t usage = 4 バイト、uid=0x04
  • struct page: 64 バイト、slab_cache=0x18

重要な発見: ソースは android15 GKI、デバイスは android13 GKI — task_struct のオフセットは 0x40〜0x88 バイト異なり、ソースをそのまま流用できない。

2. ファームウェア展開 → シンボル抽出

root@kitploit:~
OTA zip (8.3GB)
  → payload.bin (8.2GB)
    → payload_dumper → boot.img (96MB, v4 header)
      → LZ4 展開 → Image (50MB ARM64)
        → kallsyms-finder → 187810 シンボル

2 つのファームウェアバージョン (15.2.7.6 / 15.2.10.2) からシンボルを抽出 — 同じシンボルでもバージョン間で 10KB〜200KB の差があり、正しいバージョンを使用する必要がある。

3. 逆アセンブル検証 → capstone で重要オフセットを確認

root@kitploit:~
# rt_mutex_adjust_pi 内:
LDR x21, [x19, #0x8b0]  → pi_blocked_on = 0x8b0 (android15 の値、frankel ではない)

これにより task_struct レイアウトが frankel の android13 ではなく android15 ブランチであることが確認された。

4. コンパイル → 成功

NDK r29、make PROJECT=android_15.0_kernel_MT6985 → preload.so (150KB)。

5. 実行 → 繰り返しクラッシュ

root@kitploit:~
[+] preload starting pid=25414
[+] p0 profile ... 全シンボル正常ロード
[-] KernelSnitch mm_struct leak failed     ← この行がない場合もある (稀に成功)
[+] slide child context route=pselect      ← slide KASLR leak 子プロセス起動
[カーネルパニック]                            ← rt_mutex_adjust_prio_chain+0x1b0

クラッシュ命令 (capstone):

root@kitploit:~
ldar w8, [x27]    ; x27 = waiter->lock ([x28, #0x38] からロード)
                  ; x27 の値がガベージ → ページテーブルにマッピングなし → translation fault
                  ; → die() → panic → 再起動

失敗の理由

根本原因 1: KernelSnitch が MTK で信頼性が低い

KernelSnitch は exploit 全体の入口 — futex ハッシュバケットのタイミング差で mm_struct アドレスをリークする:

  1. 衝突検出は成功 — 低閾値で 5 つの衝突を発見
  2. bruteforce マッチングはほぼ常に失敗 — 核心の問題は:
root@kitploit:~
MT6985 は CONFIG_KASAN_HW_TAGS=y → カーネルは MTE タグで slab 割り当てをマーク
mm_struct のポインタに KASAN tag が付く → futex_hash は tagged pointer に基づいて計算

しかし bruteforce は direct map (untagged アドレス) をスキャン → 計算されたハッシュが一致しない
MTE tag の走査 (0-14 の 15 種類) を追加しても、VA_BITS=39 のシステムでは
tag ビット (bit56-59) が符号拡張ビットと重なる → 一部の tag 組み合わせで無効なアドレスが発生 → 検出漏れ

Pixel デバイスには KASAN_HW_TAGS がなく、このメカニズムは機能する。MTK では機能しない。

根本原因 2: CONFIG_PANIC_ON_OOPS が致命的

root@kitploit:~
Pixel:  カーネル OOPS → dump_stack → 実行継続 → exploit は再試行可能
MT6985: カーネル OOPS → die() → panic() → 即再起動 → 試行錯誤の余地なし
π チェーン破壊が少しでもずれると全体がクラッシュ。Pixel ではずれても「今回は失敗、別のアドレスセットで再試行」で済む。

さらに bootloader はロック済み (flash.locked=1) → このオプションを無効化するカスタムカーネルをフラッシュできない。

根本原因 3: カーネルバージョンの乖離

root@kitploit:~
ソースツリー: 5.15.178 android15 GKI
デバイス:     5.15.178-android13 (vivo vendor)

メジャーバージョン番号はどちらも 5.15.178 だが、GKI ブランチが異なる (android13 vs android15) ため、task_struct/cred などの重要な構造体レイアウトが一致しない。frankel/android15 の 2 セットのオフセット間で何度も切り替え、最終的に逆アセンブルで確定した。


試した調整 (全て効果なし)

変更目的結果
THRESHOLD_MULT 10→5→3衝突検出閾値の低下<5 では偽陽性が多すぎる
APPENDED_FUTEXES 4096→8192ハッシュチェーン差の拡大効果なし
REPEAT_MEASUREMENT/AVERAGEサンプリング精度の向上効果なし
MTE=1bruteforce にタグ走査を追加遅くなるだけで、クラッシュは減少
MM_STRUCT_SZ 0x500→0x400mm_struct ステップサイズの修正必要、ABI は実際には 992 バイト
IDENTITY_END 64GB→256GBスキャン範囲の拡大遅すぎる (MTE 走査)、依然として不一致
TASK offsets: android15↔frankel正しいオフセットの特定逆アセンブルで android15 を確認
FOPS offsets: android15↔frankelandroid13 には iopoll なしfrankel を使用

target.h の現状

exploit/targets/android_15.0_kernel_MT6985/target.h 内:

カテゴリ信頼度検証方法
メモリレイアウト正しいmemory.h 計算 + kallsyms _text 検証
シンボルオフセット (22 個)正しい15.2.10.2 boot.img から抽出
task_struct オフセット正しいABI XML + capstone 逆アセンブル (pi_blocked_on=0x8b0)
FOPS オフセット誤り(2026-07-31 に修正済み)元の値は frankel から流用 (android13 に iopoll なし);ソースツリー ABI には実際に iopoll@0x30、ioctl=0x50、open=0x70 がある — VERIFICATION.md 参照
CRED オフセット正しい(検証済み)ABI XML:uid=0x04、securebits=0x24、caps=0x28、security=0x78

アセンブルは通る、実行もできる、最後の 1 キロメートルで負けた。


続行する場合

必要条件 (全て必須)

  1. CONFIG_PANIC_ON_OOPS を無効化 — カスタムカーネルをフラッシュするか (bootloader のロック解除が必要)、デフォルトでこのオプションが無効な MT6985 デバイスを見つける
  2. KernelSnitch の解決 — MTK Dimensity 9200 のキャッシュタイミング較正が必要、または exploit 内で KernelSnitch を完全に置き換えて別の mm_struct リーク方式を使用

考えられる代替アプローチ

  • /proc/self/pagemap — 本デバイスでは制限済み (全ゼロを返す)
  • MTK 固有のデバッグインターフェース (/proc/mtk_*) — 存在するがさらなる分析が必要
  • MTK カメラ/GPU ドライバの ioctl 脆弱性 — より簡単な権限昇格パス
  • コミュニティによる MTK バリアントの適応を待つ

本リポジトリの残存価値

  • symbols/kallsyms_PD2241_15.2.10.2.txt — 完全な 15.2.10.2 シンボルテーブル、後続は直接使用可能
  • device_config.txt — デバイスの実際のカーネル設定、vendor が何を変更したか確認可能
  • exploit/targets/android_15.0_kernel_MT6985/target.h — 構造体オフセットは検証済み
  • scripts/server_compile.py — 自動コンパイル、パラメータ変更後の再コンパイルが高速

失敗チェックリスト (後続の回避用)

  1. Windows でのファイル解凍: tar -xf は大きな zip で失敗する可能性がある。Python zipfile を使用するか、先に手動で解凍する
  2. payload_dumper の protobuf バージョン競合: 生成された update_metadata_pb2.py は protobuf 5.x を要求するため、runtime_version インポート行を手動で削除する必要がある
  3. ./preload.so を直接実行すると segfault: /system/bin/linker64 /data/local/tmp/preload.so を使用する必要がある
  4. ABI XML はソースより正確: layout-offset-in-bits はコンパイラが計算したもので、5000 バイトを手動で数えるより 100 倍正確
  5. GKI ブランチがレイアウトに影響: android13/14/15 の task_struct は異なるため、ブランチ間でオフセットをコピーできない
  6. ファームウェアバージョンが異なるとシンボルオフセットも異なる: 15.2.7.6 と 15.2.10.2 では 10KB〜200KB の差
  7. vivo vendor は多数の OEM フィールドを追加: CONFIG_ANDROID_VENDOR_OEM_DATA=y、CONFIG_SCHED_INFO=y、CONFIG_RSC_* → 標準 GKI から乖離
  8. シンボル抽出ツールチェーン: boot.img → kernel.bin → LZ4 展開 → Image → kallsyms-finder → シンボルテーブル

タイムライン

root@kitploit:~
07/28  CyberMeowfia リポジトリ + MT6985 ソースをダウンロード
07/29  ソース解析 (memory.h, fs.h, ABI XML, 各種 struct)
       ファームウェア展開 (payload.bin → boot.img → Image)
       シンボル抽出 (kallsyms-finder → 187810 シンボル)
       複数回のコンパイル + 複数回のクラッシュ + 逆アセンブル検証
       5 回の自動再試行 → 全て失敗
       本記事を執筆
-------------------------------------------
合計: ~68M tokens、0 root shells

2026-07-29、生きて物語を語る


2026-07-31 続編:ソース入手後の検証と修正

android_15.0_kernel_MT6985.tar.gz(5.15.178 ソースツリー + ABI XML)を入手後、 全量の相互検証を実施。詳細は VERIFICATION.md を参照。要約:

  1. MT6985 = 天玑 9200(MT6989 が 9300)、上記の記述を修正済み。
  2. シンボルオフセット 23/23 正しい(kallsyms 検証)、task_struct / cred / waiter / page / pipe / configfs のオフセットは全てソースツリー ABI と一致。
  3. FOPS オフセットは誤り: 元の値は frankel(android13 GKI、iopoll なし、 ioctl=0x48)から流用;しかしデバイスの task_struct レイアウト(pi_blocked_on=0x8b0、実行時逆アセンブル で確認)はこのソースツリーと一致するため、同一カーネルの file_operations には iopoll@0x30、 ioctl=0x50、open=0x70 などがあるはず — target.h を修正し、exploit 内蔵の leak_kernel_base() による実機自己検証をフォールバックとして利用。
  4. KernelSnitch の MTK 互換性パッチ(patches/kernelsnitch_mtk_fixes.patch):
    • ユーザー空間の futex ハッシュテーブルサイズをカーネルと一致させる(possible CPU + 2 の 2 のべき乗に切り上げ)、 possible≠online の場合に bruteforce が必然的に失敗する問題を回避;
    • MTE tag 走査に 0xf(untagged)を追加し、KSNITCH_MTE_ENABLED=1 を実際に 有効化(元の util.c は mte=0 をハードコード);
    • 非 MTK target には影響なし。
  5. クラッシュポイント rt_mutex_adjust_prio_chain+0x1b0 は pselect/pi チェーン段階にあり、 FOPS 自己検証より前;上記修正後、再実機検証の価値あり。

2026-07-31 実機テスト:KernelSnitch は成功、slide 段階が依然として壁

デバイス(PD2241、compiler251203103903)実機 8+ ラウンドテスト:

  • KernelSnitch は修正・検証済み:MM_STRUCT_SZ=0x400(元の 0x500 はスキャングリッド の位置ずれを引き起こし、偽陽性のみ発生)+ MTE tag 0..15 走査(デバイスの mm ポインタ tag は変化する)+ 偽装アドレス untag。現在は実際の mm_struct を安定して発見可能。
  • 各ラウンドで依然として rt_mutex_adjust_prio_chain+0x1b0 でクラッシュ:pselect/pi チェーンの タイミング競合(偽装 waiter がカーネルスタックの正しいオフセットに配置できない)。vivo RSC スケジューラが futex/pi パスを 変更しており、この race を根本的に破壊している可能性がある。slide スタックアライメントは SLIDE_SHIFT 環境変数として パラメータ化済みだが、スキャンは未完了。
  • FOPS/pipe/cred 段階には未到達、実機検証は継続中。

最終選択:有料で bootloader のロック解除を依頼(本パスに依存しない)。

ツールをダウンロード