CVE-2026-0073はWireless ADBの証明書比較ミスで隣接ネットワークRCEになる
目次
TL;DR
影響 Android 14、15、16、16-qpr2 のWireless ADB。CVSS 3.1は8.8 HIGH
対応 2026-05-01以降のAndroidセキュリティパッチレベル、または該当するGoogle Play system update
暫定 更新までWireless Debuggingをオフ。社内Wi-Fi、検証端末、エミュレータ実機混在ネットワークでADB露出を探す
Androidの2026年5月セキュリティ情報で、Wireless ADBの認証バイパス CVE-2026-0073 が公開された。
対象は Android 14、15、16、16-qpr2。
近くのネットワークから、ユーザー操作なしで shell ユーザー権限のリモートコード実行に届く。
Wireless ADBは開発用の機能なので、普段のスマホ利用だけ見れば露出は限定的だ。
ただ、開発端末、検証用端末、社内Wi-Fiにぶら下げた実機、常時起動のAndroid TV系デバイスでは話が変わる。
以前 Android MCPサーバーでエミュレータテストを自動化する でADBを前提にした自動化を書いたが、今回のCVEはまさにそのADBの無線接続側に刺さっている。
壊れていたのはEVP_PKEY_cmpの戻り値判定
Androidセキュリティ情報では、SystemコンポーネントのCriticalなRCEとして載っている。
説明は短く、adbd_tls_verify_cert のロジックエラーでWireless ADBの相互認証をバイパスできる、という内容だ。
Project Mainline側のサブコンポーネントは adbd になっている。
AOSPの修正差分を見ると、バグの形はかなりはっきりしている。
daemon/auth.cpp で EVP_PKEY_cmp() の戻り値をそのまま if に入れていた。
- if (EVP_PKEY_cmp(known_evp.get(), evp_pkey.get())) {
+ int cmp_result = EVP_PKEY_cmp(known_evp.get(), evp_pkey.get());
+ if (cmp_result == 1) {
コミットメッセージは Fix EVP_PKEY_cmp usage.。
続く一文がそのまま原因で、非ゼロが全部成功を意味するわけではなかった。
OpenSSL/BoringSSL系の比較APIは、真偽値だけを返す関数と違い、成功、不一致、未対応、エラーのような状態を整数で返すことがある。
EVP_PKEY_cmp では一致を表す値が 1 で、それ以外を「一致」と扱ってはいけない。
修正前のコードは、-1 や -2 のようなエラー系の非ゼロ値まで成功扱いに落ちる余地があった。
Wireless ADBの相互認証で起きること
Wireless ADBは、USBケーブルなしでAndroid端末へADB接続する機能だ。
ローカルWi-Fi越しにシェル、アプリインストール、ログ取得、ファイル転送を行える。
便利な一方で、ADBの到達先はただのアプリではなく adbd なので、接続を許す相手の認証がそのまま端末操作の境界になる。
今回のCVEは、証明書を比較して「このホストは既知のADBクライアントか」を見る処理で起きた。
比較関数が「一致」以外の非ゼロを返した時でも、コード側が成功として扱う。
その結果、Wireless ADBの相互認証をすり抜け、shell ユーザーとしてコマンド実行できる。
shell ユーザーはrootではない。
それでもAndroidではかなり強い。
logcat、デバッグ用のシェル、アプリデータ周辺の操作、端末状態の取得など、通常アプリより広い面に触れる。
端末がroot化されていなくても、検証端末や社内端末なら十分に痛い権限だ。
隣接ネットワークという条件
NVDのCISA-ADP評価は CVSS 3.1 AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H、8.8 HIGH。
AV:A はAdjacent、つまりインターネット越しのどこからでもではなく、同じローカルネットワークや近接したネットワークからの攻撃を指す。
ここを「リモートRCEだから全Android端末がインターネットから危ない」と読むとズレる。
ただし軽くもない。
社内Wi-Fi、イベント会場の共有Wi-Fi、家庭内LAN、検証ラボの同一セグメントは普通にAdjacentだ。
ADBを使う開発者の端末ほど、Wireless Debuggingをオンにしたままにしがちなのも嫌なところ。
runZeroは資産探索の観点で、protocol:=adb AND os:Android のような条件でADB露出を探す例を出している。
企業ネットワークなら、脆弱性スキャンより先に「ADBが見えているAndroid機器がいるか」を洗うほうが早い。
パッチレベルは2026-05-01
AndroidセキュリティのFAQでは、2026-05-01以降のセキュリティパッチレベルなら、このパッチレベルに紐づく問題は修正済みとして扱われる。
Android 10以降では、Google Play system update側の日時が同じパッチレベルに対応する場合もある。
確認する値は ro.build.version.security_patch。
UI上では「Androidセキュリティアップデート」や「Google Playシステムアップデート」の日付として出る。
端末メーカーの配信が遅れる機種では、AOSPに修正が入っていても手元の端末にはまだ届かない。
更新できるなら更新で終わり。
更新待ちなら、開発者向けオプションの「Wireless debugging」をオフにする。
検証用途で必要な端末は、信頼できる開発用ネットワークに隔離し、共有Wi-Fiには置かない。