m00ddy/CVE-2026-0073-Android-client-TLS-auth-bypass

GitHub: m00ddy/CVE-2026-0073-Android-client-TLS-auth-bypass

将 CVE-2026-0073 Android adbd TLS 认证绕过漏洞的 Python PoC 利用代码转换为独立编译的 C 语言实现。

Stars: 0 | Forks: 2

CVE‑2026‑0073 是 Android 的 ADB 守护进程 (adbd) 中的一个逻辑漏洞,它允许攻击者绕过 TLS 双向身份验证,并在已启用无线调试且至少与一台计算机配对过的设备上打开远程 shell。根本原因是单个 API 的误用:OpenSSL 的 EVP_PKEY_cmp() 的返回值被当作布尔值处理,而不是一个三值结果。 ## ADB 无线调试的正常身份验证流程 当我们从 Android 开发者设置中启用无线调试时,设备会启动一个 `adbd` 实例,监听一个随机的 TCP 端口。 注意:此功能是在 Android 11 及更高版本中引入的。 该协议有两个阶段: 1. 明文协商:主机通过 TCP 连接并交换 CNXN/STLS 握手,以同意升级到 TLS。 2. TLS 1.3 双向身份验证: - 服务端 `adbd` 要求客户端提供证书 - `adbd` 从该证书中提取公钥 - 然后它将此密钥与其存储在 `/data/misc/adb/adb_keys` 中的所有授权 RSA 密钥进行比较。这些密钥是在之前的配对过程中放置在此处的(该漏洞利用要求此处至少有一个密钥) - 如果密钥匹配,则握手成功,主机可以以 `shell` 用户身份发送 shell 命令 密钥比较是使用 OPENSSL 的 `EVP_PKEY_cmp(key1, key2)` 完成的,其返回值为: - 1 --> 密钥相等 - 0 --> 密钥不相等 - -1 --> 密钥类型不同,或发生错误 ## 漏洞 在 `daemon/auth.cpp` 文件中,易受攻击的函数 `adb_tls_verify_cert()` 类似于以下代码: ``` int cmp = EVP_PKEY_cmp(stored_rsa_key, peer_key); if (cmp) { authorised = true; } ``` 由于只要 `cmp` 不为零,`if(cmp)` 就会返回 true,因此 `EVP_PKEY_cmp()` 返回值为 -1 就会通过授权。这意味着,由于存储的密钥是 RSA,当客户端提供 EC 或 ed25519 证书时,该函数会返回 -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)` 为真 → adbd 将该 transport 标记为已授权。 5. TLS 之后:攻击者避免发送 host CNXN(这会重置 transport),而是直接使用大 `delayed_ack` 窗口打开一个 `shell:` 流。 结果:以 shell 用户身份获得远程 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,你将在设备上获得一个 shell。 ``` docker build -t adb_bypass . docker run -it --network host adb_bypass ``` 弹出一个计算器 ``` am start -n com.sec.android.app.popupcalculator/com.sec.android.app.popupcalculator.Calculator ``` ## 关于使用 LLM 的说明 LLM 被用于将漏洞利用程序从 Python 转换为 C 语言,原始漏洞利用程序在[这里](https://github.com/SecTestAnnaQuinn/CVE-2026-0073-Android-adbd-authentication-bypass-POC)。这种转换并不是 1:1 准确的,我们遇到了很多问题,因此需要进行一系列的代码分析和反复的对话,以修复翻译中的 bug,并最终得到一个完整运行的漏洞利用程序。
标签:ADB, Android, DSL, TLS认证绕过, 安全测试工具, 客户端加密, 目录枚举, 移动安全, 请求拦截