Sploitus

Exploit for CVE-2026-0073-Android-client-TLS-auth-bypass

kitploit · 2026-08-25

Exploit Code

MARKDOWN81 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-M00DDY-CVE-2026-0073-ANDROID-CLIENT-TLS-AUTH-BYPASS
CVE‑2026‑0073 は、Android の ADB デーモン (adbd) における論理バグであり、ワイヤレスデバッグが有効で、かつ一度でも任意のコンピューターとペアリングされたデバイスに対して、攻撃者が TLS 相互認証をバイパスしてリモートシェルを開くことを可能にします。根本原因は、単一の API の誤用です。OpenSSL の `EVP_PKEY_cmp()` の戻り値が、3 値の結果ではなくブール値として扱われます。

## ADB ワイヤレスデバッグにおける通常の認証フロー

アンドロイドの開発者向けオプションからワイヤレスデバッグを有効にすると、デバイスはランダムな TCP ポートで待ち受ける `adbd` インスタンスを起動します。 注: この機能は Android 11 以降で導入されました。

プロトコルには 2 つのフェーズがあります。

  1. クリアテキストネゴシエーション: ホストは TCP 経由で接続し、TLS へのアップグレードに合意するために CNXN/STLS ハンドシェイクを交換します。
  2. TLS 1.3 相互認証: 
     * サーバー `adbd` はクライアントに証明書の提示を要求します
     * `adbd` はその証明書から公開鍵を抽出します
     * 次に、その鍵を `/data/misc/adb/adb_keys` に保存されているすべての承認済み RSA 鍵と比較します。鍵は以前のペアリング中にそこに配置されます (このエクスプロイトでは、少なくとも 1 つの鍵がそこに存在する必要があります)
     * 鍵が一致すれば、ハンドシェイクは成功し、ホストは `shell` ユーザーとしてシェルコマンドを送信できます 鍵の比較には OpenSSL の `EVP_PKEY_cmp(key1, key2)` が使用され、これは次の値を返します。


  * 1 --> 鍵が等しい
  * 0 --> 鍵が等しくない
  * -1 --> 鍵のタイプが異なる、またはエラーが発生した



## バグ

ファイル `daemon/auth.cpp` 内の脆弱な関数 `adb_tls_verify_cert()` はおおよそ次のようになります。

root@kitploit:~
    
    
    int cmp = EVP_PKEY_cmp(stored_rsa_key, peer_key);
    if (cmp) {     
        authorised = true;
    }
    

`if(cmp)` は `cmp` が非ゼロである限り true を返すため、`EVP_PKEY_cmp()` が -1 を返すと認証が行われます。つまり、保存されている鍵が RSA であるため、クライアントが EC または ed25519 証明書を提示すると、関数は -1 を返し、攻撃者は承認されたアクセスを獲得します。

## 攻撃の流れ

  1. ターゲット: ワイヤレスデバッグが有効で、キーストアに少なくとも 1 つの RSA 鍵がある Android デバイス (誰かによって一度でもペアリングされている)。

  2. クリアテキストハンドシェイク: 攻撃者は adbd の TCP ポートに接続し、CNXN/STLS を交換します。

  3. EC 証明書を使用した TLS ハンドシェイク: 攻撃者は一時的な EC P‑256 鍵と自己署名証明書を生成します。この鍵は意図的に RSA ではありません。

  4. 欠陥のある比較: `EVP_PKEY_cmp(RSA, EC)` は ‑1 を返す → `if (cmp)` が true になる → adbd はトランスポートを承認済みとしてマークします。

  5. TLS 後: 攻撃者はホスト CNXN (トランスポートをリセットする) の送信を回避し、大きな `delayed_ack` ウィンドウを持つ `shell:` ストリームを直接開きます。




結果: シェルユーザーとしてのリモートシェル。ユーザーの操作なし、通知なし、正当な秘密鍵を保持する必要もありません。

## なぜ C に移植するのか?

Python スクリプトは、攻撃マシンに python 3 インタープリターと `cryptography` ライブラリがインストールされている必要があります。C での実装は、システムの OpenSSL/libssl 以外の外部依存関係を持たないスタンドアロンのバイナリにコンパイルされます。OpenSSL/libssl は事実上すべての Linux システムにデフォルトで存在します。これにより、配備の障壁が劇的に下がります。さらに、C プログラムは任意のターゲットアーキテクチャ (x86_64、ARM、MIPS) 向けにクロスコンパイルできます。つまり、エクスプロイトはルーターや Raspberry Pi などの組み込みデバイス、あるいは攻撃者として動作する別の Android デバイス上でも、python 環境を必要とせずにコンパイルして実行できます。そして、コンパイルされた C バイナリはシンボルを除去したり、(UPX で) パックしたりできるため、逆アセンブラなしでは不透明であり、python スクリプトよりもステルス性が高くなります。

## デモ

エクスプロイトの実行: ワイヤレスデバッグインターフェースの IP と PORT を指定すると、デバイス上でシェルを取得できます。

root@kitploit:~
    
    
    docker build -t adb_bypass .
    docker run -it --network host adb_bypass <IP> <PORT>
    

電卓を起動する

root@kitploit:~
    
    
    am start -n com.sec.android.app.popupcalculator/com.sec.android.app.popupcalculator.Calculator
    

## LLM の使用に関する注記

LLM はエクスプロイトを python から C に移植するために使用されました。元のエクスプロイトは こちら です。移植は 1:1 では正しくなく、多くの問題に直面したため、コード分析とやり取りを繰り返すループが、移植のバグを修正して完全に動作するエクスプロイトに到達するために必要でした。