零点击ADB漏洞:CVE-2026-0073
本文仅供学习交流,代码均来源于网络,请勿使用该漏洞攻击他人的移动设备。
CVSS Vector:CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
前言
前几天 刚报出来个高位 Linux 漏洞,昨天又爆出个高位 Android 漏洞,是关于ADB的,安卓14到安卓16的主流设备都受到威胁。在无线调试开启时,攻击者可以免认证即连接上ADB调试。用自己的手机(安卓16)测试了下,中招。分析
这个漏洞很低级。
漏洞根因在 packages/modules/adb/daemon/auth.cpp。具体的认证判断为:
1 | bssl::UniquePtr<EVP_PKEY> known_evp(EVP_PKEY_new()); |
而这个EVP_PKEY_cmp是用来比较密钥的,返回的值不是布尔值!参考BoringSSL的源码实现:
1 | int EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b) { |
可以看出,EVP_PKEY_cmp的返回包含负数。对于安卓来说,返回值有四个:
| 返回值 | 含义 |
|---|---|
1 |
key 匹配 |
0 |
key 不匹配 |
-1 |
key 类型不同 |
-2 |
不支持该比较操作 |
问题来了:在C++中,负值在布尔判断中会被当成true。因此,只需让EVP_PKEY_cmp返回一个负值,即可达到和握手成功的key匹配一致的效果。想要让两个key找不到可用的参数比较或公钥比较比较困难,但是 key 类型不同可太方便触发了。安卓端保存的用于ADB的TLS证书是 RSA key,因此只要自己构造一个非 RSA key,例如 EC P-256 或 Ed25519即可。
PoC
代码来源于:SecTestAnnaQuinn/CVE-2026-0073-Android-adbd-authentication-bypass-POC - Github
这个PoC非常完整,实现了ADB 包头、checksum、magic、收包逻辑,构造了兼容性较好的EC P-256 证书来触发-1的返回值。具体流程如下:
---
title: CVE-2026-0073 流程
---
flowchart TD
A["连接 adbd TCP 端口"]
A --> B["明文发送 ADB CNXN"]
B --> C["等设备返回 STLS"]
C --> D["回复 STLS"]
D --> E["升级到 TLS 1.3"]
E --> F["提交 EC P-256 客户端证书"]
F --> G["利用 EVP_PKEY_cmp 返回值处理错误绕过认证"]
G --> H["等设备发送 post-TLS CNXN"]
H --> I["发送 OPEN shell"]
I --> J["获得 ADB shell 或执行命令"]
测试了下,一切正常。如果目标设备被Root了,还能直接拿到Root权限:
反而是老设备(安卓12)没有这个问题。
修复
谷歌自家设备第一时间就推了2026-05-01安全补丁。国产设备要到五月中下旬才有系统更新的安全补丁了。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Esing的小站!
评论
WalineGitalk




