001
ok
CVE-2026-0047 - Framework EoP Critical
001-ok-dumpbitmaps-permission-bypass
cve.md の Android / Pixel 脆弱性情報
- CVE
- CVE-2026-0047
- Program
- Android Security Reward Program
- Bulletin
- Android Security Bulletin - March 2026
- Patch level
- 2026-03-01
- Component
- Framework
- Reference
- A-465136263
- Type
- EoP
- Severity
- Critical
- AOSP versions
- 16-qpr2
- Bulletin URL
- https://source.android.com/docs/security/bulletin/2026/2026-03-01
cve.md summary
Framework EoP Critical vulnerability from the March 2026 advisory. Use the linked advisory and Android bug reference as the starting point for patch analysis and reproduction work.
判定内容
具体的な脆弱性(何が起きる脆弱性だったか)
`ActivityManagerService.dumpBitmapsProto()` に権限チェックが無く、通常アプリから他プロセスのメモリ内 Bitmap 情報を dump できる問題だった。 この API は `IActivityManager` の Binder メソッドとして存在し、呼び出し元が渡した `ParcelFileDescriptor` に dump 結果を書き出す。修正前は、呼び出し権限も、対象プロセスが debuggable かどうかも確認していなかった。そのため、攻撃アプリは対象プロセス名や pid、または未指定による全プロセス対象で `dumpBitmapsProto` を呼び、他アプリが保持している Bitmap を protobuf として取得できる。 `Bitmap.dumpAll(proto, dumpFormat)` は Bitmap の id、幅、高さ、サイズ、config などのメタデータを書くだけでなく、`dumpFormat` が `png` / `jpg` / `webp` などなら Bitmap を圧縮して `CONTENT` に格納する。つまり、条件次第では他アプリの UI 画像、表示中の写真、QR コード、認証画面、サムネイルなどの画素データそのものが漏れる。
原因(根本原因)
デバッグ・診断用の強力な dump 機能を `IActivityManager` 経由で公開したにもかかわらず、サーバ側実装に認可境界が無かったことが根本原因。 具体的には、修正前の `dumpBitmapsProto()` は次の制御だけで動いていた。 1. 呼び出し元提供の fd を受け取る。 2. `collectProcesses(null, 0, allPkgs, processes)` で対象プロセスを集める。 3. 対象プロセスの `IApplicationThread.dumpBitmapsProto()` を呼ぶ。 4. 対象アプリ内で `Bitmap.dumpAll()` を実行し、結果を fd に書く。 ここに `SET_ACTIVITY_WATCHER` などの権限チェックが無く、production build で非 debuggable アプリを除外する処理も無かった。 同じ `ActivityManagerService` の `dumpHeap()` は既に `SET_ACTIVITY_WATCHER` と `enforceDebuggable(proc)` を使っており、今回の修正もそれに合わせている。つまり、本来 heap dump 相当の機密性を持つ操作なのに、`dumpBitmapsProto()` だけが認可を抜いていた。
どこから特定したか
validated.md の「対象」「パッチ内容」 / Android bug参照 A-465136263 / 参照URL: https://source.android.com/docs/security/bulletin/2026/2026-03-01, https://storage.googleapis.com/android-osv/ASB-A-465136263.json, https://android.googlesource.com/platform/frameworks/base/+/93b72e5a84815c09d5eac89fe8f974a44002c629
validated.md を表示
# CVE-2026-0047 検証結果
## 判定
OK。AOSP の修正コミットと前後ソースから、脆弱性の発生条件、影響、根本原因をソースコードベースで特定できた。
## 対象
- CVE: CVE-2026-0047
- Android bug: A-465136263
- コンポーネント: Framework / `platform/frameworks/base`
- 影響: 16-qpr2 / 16-qpr2-next
- 種別: EoP
- 深刻度: Critical
- 公開ブリテン: https://source.android.com/docs/security/bulletin/2026/2026-03-01
- OSV: https://storage.googleapis.com/android-osv/ASB-A-465136263.json
- 解析した修正コミット: https://android.googlesource.com/platform/frameworks/base/+/93b72e5a84815c09d5eac89fe8f974a44002c629
## 何が起きる脆弱性だったか
`ActivityManagerService.dumpBitmapsProto()` に権限チェックが無く、通常アプリから他プロセスのメモリ内 Bitmap 情報を dump できる問題だった。
この API は `IActivityManager` の Binder メソッドとして存在し、呼び出し元が渡した `ParcelFileDescriptor` に dump 結果を書き出す。修正前は、呼び出し権限も、対象プロセスが debuggable かどうかも確認していなかった。そのため、攻撃アプリは対象プロセス名や pid、または未指定による全プロセス対象で `dumpBitmapsProto` を呼び、他アプリが保持している Bitmap を protobuf として取得できる。
`Bitmap.dumpAll(proto, dumpFormat)` は Bitmap の id、幅、高さ、サイズ、config などのメタデータを書くだけでなく、`dumpFormat` が `png` / `jpg` / `webp` などなら Bitmap を圧縮して `CONTENT` に格納する。つまり、条件次第では他アプリの UI 画像、表示中の写真、QR コード、認証画面、サムネイルなどの画素データそのものが漏れる。
## 根本原因
デバッグ・診断用の強力な dump 機能を `IActivityManager` 経由で公開したにもかかわらず、サーバ側実装に認可境界が無かったことが根本原因。
具体的には、修正前の `dumpBitmapsProto()` は次の制御だけで動いていた。
1. 呼び出し元提供の fd を受け取る。
2. `collectProcesses(null, 0, allPkgs, processes)` で対象プロセスを集める。
3. 対象プロセスの `IApplicationThread.dumpBitmapsProto()` を呼ぶ。
4. 対象アプリ内で `Bitmap.dumpAll()` を実行し、結果を fd に書く。
ここに `SET_ACTIVITY_WATCHER` などの権限チェックが無く、production build で非 debuggable アプリを除外する処理も無かった。
同じ `ActivityManagerService` の `dumpHeap()` は既に `SET_ACTIVITY_WATCHER` と `enforceDebuggable(proc)` を使っており、今回の修正もそれに合わせている。つまり、本来 heap dump 相当の機密性を持つ操作なのに、`dumpBitmapsProto()` だけが認可を抜いていた。
## パッチ内容
修正ファイルは `services/core/java/com/android/server/am/ActivityManagerService.java` のみ。
`dumpBitmapsProto()` の先頭に以下が追加された。
```java
enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER,
"dumpBitmapsProto()");
```
さらに各対象プロセスについて、user build では debuggable アプリ以外を skip する処理が追加された。
```java
if (!Build.IS_DEBUGGABLE && !r.isDebuggable()) {
Slog.w(TAG, "Process not debuggable: " + r.info.packageName);
continue;
}
```
この 2 つにより、未権限の通常アプリは Binder 呼び出し時点で拒否され、権限を持つ診断主体であっても production build では非 debuggable アプリの Bitmap を dump できなくなる。
## 攻撃シナリオ
修正前の端末で、攻撃アプリが hidden API / Binder transaction などで ActivityManager の `dumpBitmapsProto` を呼ぶ。
- fd: 攻撃アプリが読める pipe や file descriptor
- processes: victim の processName / pid、または空配列
- dumpFormat: `png` など
サーバ側は呼び出し元 uid の権限を確認せず、対象プロセスへ `IApplicationThread.dumpBitmapsProto()` を依頼する。victim プロセス側は自身の live Bitmap を列挙し、指定形式で圧縮した画像データを system_server 経由で攻撃側 fd に書き出す。
プロセス未指定の場合、`ProcessList.collectProcessesLOSP()` は LRU プロセス一覧全体を返すため、全実行中アプリを対象にできる点も危険だった。また `dumpBitmapsProto` の `userId` 引数は対象収集に使われていない。
## 調査中に分かった面白い点
- Android ブリテン上では `A-465136263` にリンクが無く、詳細は OSV と修正コミットから復元する必要があった。
- OSV の details には「missing permission check」と書かれているが、実パッチでは permission check だけでなく debuggability check も追加されている。
- `am dumpbitmaps` は単なる shell command front-end であり、実際の境界は `ActivityManagerService.dumpBitmapsProto()` の Binder サーバ側にある。
- `dumpBitmapsProto()` は `userId` を受け取るが、修正前後とも対象プロセス収集では使っていない。今回の直接の修正対象ではないが、API 設計上は気になる点。
- OSV は `16-qpr2` の fix として `70d95430379ece974722a1044cb693371412b636` も列挙していたが、この実行時点では Gitiles から直接取得すると 404 だった。取得可能な `16-qpr2-next` の `93b72e5a...` と OSV の Vanir signature が同一関数を指しているため、こちらで解析した。
## 保存した付帯ファイル
- `ASB-A-465136263.json`: OSV レコード
- `commit_93b72e5a.txt`: 修正コミット本文
- `patch_93b72e5a.diff`: 修正差分
- `ActivityManagerService_before.java`: 修正前ソース
- `ActivityManagerService_after.java`: 修正後ソース
- `ActivityManagerShellCommand_after.java`: `am dumpbitmaps` 呼び出し経路確認用
- `IActivityManager_after.aidl`: Binder API 確認用
- `ProcessList_after.java`: 対象プロセス収集ロジック確認用
- `ActivityThread_after.java`: victim プロセス側 dump 呼び出し確認用
- `Bitmap_after.java`: Bitmap 内容が圧縮され protobuf に入ることの確認用
- `patch_analysis.md`: 解析メモ
## 検証限界
実機・エミュレータでの PoC 実行はしていない。ただし、公開 OSV、AOSP 修正コミット、前後ソース、呼び出し経路、dump されるデータ内容が一致しており、脆弱性の種類と根本原因はソースコードから十分に特定できる。
cve.md を表示
# CVE-2026-0047 - Framework EoP Critical ## Advisory - Program: Android Security Reward Program - Bulletin: Android Security Bulletin - March 2026 - Bulletin URL: https://source.android.com/docs/security/bulletin/2026/2026-03-01 - Security patch level: 2026-03-01 ## CVE details - CVE: CVE-2026-0047 - Component: Framework - Reference: A-465136263 - Type: EoP - Severity: Critical - Updated AOSP versions: 16-qpr2 ## Scope decision - Bounty target: yes - Reason: Included: Android platform component listed in Framework/System. Excluded Linux kernel, other OSS, and vendor/OEM component sections. ## Summary Framework EoP Critical vulnerability from the March 2026 advisory. Use the linked advisory and Android bug reference as the starting point for patch analysis and reproduction work.