
CVE-2026-0013 Android EoP PoC - セキュリティ研究用のコンパイル済みアーティファクト(inforcqb/cve-2026-0013-exploit の派生)
Android DocumentsUI Confused Deputy(混乱した代理人)脆弱性 - セキュリティ研究検証プロジェクト
本リポジトリは派生ビルドリポジトリであり、元のメインリポジトリの付属関係にあります。
| 役割 | リポジトリ | 説明 |
|---|---|---|
| メインリポジトリ | inforcqb/cve-2026-0013-exploit | オリジナルの脆弱性研究 |
| 本リポジトリ | XiaoBaiLovesStirring/cve-2026-0013-poc | クラウドビルド成果物の配布 |
本リポジトリにアクセスする前に、必ず SECURITY_PROTOCOL.md を読んで理解してください。
要点:
GitHub Pages: https://XiaoBaiLovesStirring.github.io/cve-2026-0013-poc/
ビルドのトリガー: https://github.com/XiaoBaiLovesStirring/cve-2026-0013-poc/actions
成果物の取得: git clone --branch artifacts https://github.com/XiaoBaiLovesStirring/cve-2026-0013-poc.git
変更点:DocumentsUI が代理起動する targetIntent を、新規追加した自作コンポーネント IdTestActivity に向けます。このコンポーネントは id を実行し、実行時の識別情報と結果を logcat と通知バーに書き込み、以下の2つの重要な事実を実測するために使用します。
Intent.EXTRA_INTENT を消費し、対象コンポーネントを代理起動するかどうか仕組みの説明(重要):Android の分離モデルに従い、サードパーティアプリのコンポーネントは、誰が起動したかにかかわらず、自身が宣言したプロセス/UID 内でのみ実行されます。DocumentsUI による代理起動だけでは、IdTestActivity は依然として com.example.cve20260013exploit 自身の UID(例: u0_a702/10702)で実行され、DocumentsUI の uid=10054 に自動的に変わることはありません。APK 全体で 10054 を取得するには、sharedUserId="android.uid.documentsui"(system 署名が必要で、サードパーティは取得不可)または root 環境が必要です。v1.0.4 の価値は、EXTRA_INTENT が消費されるかどうかと、代理起動時の実際の識別情報を検証することにあります。
問題:OPPO/ColorOS では、DocumentsUI の PickActivity が呼び出し元から渡された Intent.EXTRA_INTENT を消費しなくなりました。実測では mCallingUid は依然として呼び出し元の u0_a702 であり、PickActivity は自身の選択画面をレンダリングして停止するだけで、DocumentsUI の識別情報(uid=10054)で対象アクションを代理起動することは一切ありません。元の混乱した代理人チェーンは事実上断絶しています。
修正(トリガーチェーンの再設計):
ACTION_OPEN_DOCUMENT / ACTION_GET_CONTENT + CATEGORY_OPENABLE + */*)で DocumentsUI を解決するように変更picker.PickActivity とネイティブエントリ PickActivity の明示的な指定フォールバックを維持し、エントリが見つからずクラッシュするのを防ぐcontent:// 一時認可 URI から認可ホストの識別情報を逆引きし(probeUriGrant)、認可側の観点から混乱した代理人が成立するかを検証する仕組みの説明:アプリ自体は DocumentsUI プロセスに任意のコマンドを代行実行させることはできません。混乱した代理人の「権限昇格」は、DocumentsUI が自身の uid でのみ取得できる認可リソースを、あなたの代わりに保持・転送させることに現れます。そのため v1.0.3 では、アプリ自身のプロセス内で id を実行するのではなく、「DocumentsUI が付与した URI 権限を誰が取得したか」を検証するように変更しました。
ビルド修正の記録:初回ビルドは失敗しました。getPackageManager().resolveActivity() の戻り値の型が ComponentName ではなく ResolveInfo であり、error: incompatible types: ResolveInfo cannot be converted to ComponentName というエラーが発生しました。ResolveInfo.activityInfo から packageName/name を取り出して ComponentName を構築することで解決しました。
変更点:概念実証のアクションを「Termux の起動」から「混乱した代理人チェーンをトリガーした後、id コマンドを実行し、結果をシステム通知バーに表示する」に変更しました。
id コマンドを実行します(sh -c id、id、/system/bin/id、/system/xbin/id の複数のパスを試行)uid/gid/groups などの実行結果を通知バーに表示picker.PickActivity → ネイティブ .PickActivity)POST_NOTIFICATIONS 権限を追加問題:複数のベンダー(OPPO など)が DocumentsUI のクラスパスを改変しており、ネイティブエントリ com.android.documentsui.PickActivity が com.android.documentsui.picker.PickActivity に移動されたため、旧バージョンのビルド成果物は対象デバイス上でエクスプロイトエントリを特定できませんでした。
修正:
com.android.documentsui.picker.PickActivity に更新.PickActivity にフォールバックビルド失敗時のトラブルシューティングガイド(重要):
dumpsys package com.android.documentsui または Activity Resolver Table を使用して、ベンダーによる改変後の実際のエントリクラス名を確認し、ExploitActivity.java の setClassName パラメータを修正してプッシュし、再ビルドをトリガーしてくださいCVE-2026-0013 | HIGH (CVSS 8.4) | CWE-441 | Android 14-16 | DocumentsUI PickActivity
修正情報: Android Security Bulletin 2026-03-01