
перевод оригинального эксплойта Python на C
CVE‑2026‑0073 — это логическая ошибка в демоне ADB (adbd) Android, которая позволяет злоумышленнику обойти взаимную аутентификацию TLS и открыть удалённую оболочку на устройстве, на котором включена беспроводная отладка и которое было сопряжено с любым компьютером хотя бы один раз. Коренная причина — один неправильно используемый API: возвращаемое значение EVP_PKEY_cmp() из OpenSSL трактуется как логическое значение вместо трёхзначного результата.
когда мы включаем беспроводную отладку в настройках разработчика Android, устройство запускает экземпляр adbd, который прослушивает случайный TCP-порт.
Примечание: эта функция была введена в Android 11 и более поздних версиях.
протокол состоит из двух фаз:
adbd требует от клиента предоставить сертификатadbd извлекает открытый ключ из этого сертификата/data/misc/adb/adb_keys. Ключи помещаются туда во время предыдущих сопряжений (для эксплуатации требуется, чтобы здесь был хотя бы один ключ).shell
сравнение ключей выполняется с помощью OPENSSL's EVP_PKEY_cmp(key1, key2), который возвращаетв файле daemon/auth.cpp уязвимая функция adb_tls_verify_cert() выглядит примерно так:
int cmp = EVP_PKEY_cmp(stored_rsa_key, peer_key);
if (cmp) {
authorised = true;
}
поскольку if(cmp) возвращает true, пока cmp не равно нулю, возвращаемое значение -1 от EVP_PKEY_cmp() приводит к авторизации. Это означает, что поскольку сохранённый ключ является RSA, то когда клиент предъявляет сертификат EC или ed25519, функция возвращает -1, и злоумышленник получает авторизованный доступ.
цель: устройство Android с включённой беспроводной отладкой и хотя бы одним RSA-ключом в хранилище ключей (оно было сопряжено хотя бы один раз, кем угодно).
рукопожатие в открытом виде: злоумышленник подключается к TCP-порту adbd и обменивается CNXN/STLS.
TLS-рукопожатие с EC-сертификатом: злоумышленник генерирует эфемерный ключ EC P‑256 и самоподписанный сертификат. Этот ключ намеренно не является RSA.
ошибочное сравнение: EVP_PKEY_cmp(RSA, EC) возвращает ‑1 → if (cmp) истинно → adbd помечает транспорт как авторизованный.
после TLS: злоумышленник избегает отправки CNXN хоста (что сбросило бы транспорт) и напрямую открывает поток shell: с большим окном delayed_ack.
Результат: удалённая оболочка от имени пользователя shell, без взаимодействия с пользователем, без уведомления и без необходимости обладать каким-либо легитимным закрытым ключом.
Скрипт на Python требует интерпретатора Python 3 и библиотеки cryptography, установленных на машине атакующего. Реализация на C компилируется в автономный бинарный файл без внешних зависимостей, кроме системного OpenSSL/libssl, который присутствует практически на каждой системе Linux по умолчанию. Это кардинально снижает барьер для развёртывания. Кроме того, программу на C можно кросс-компилировать для любой целевой архитектуры (x86_64, ARM, MIPS). Это означает, что эксплойт может быть скомпилирован и запущен непосредственно на встраиваемых устройствах, таких как маршрутизаторы, Raspberry Pi или даже другое устройство Android, выступающее в роли атакующего, без необходимости в Python-окружении. А скомпилированный бинарник C может быть лишён символов, упакован (UPX) и непрозрачен без дизассемблера, что делает его более скрытным, чем скрипт на Python.
запуск эксплойта: укажите IP и PORT интерфейса беспроводной отладки, и вы получите оболочку на устройстве.
docker build -t adb_bypass .
docker run -it --network host adb_bypass <IP> <PORT>
открываем калькулятор
am start -n com.sec.android.app.popupcalculator/com.sec.android.app.popupcalculator.Calculator
LLM был использован для перевода эксплойта с Python на C, оригинальный эксплойт находится здесь. Перевод не был точным 1:1, и мы столкнулись с множеством проблем, поэтому для исправления ошибок в переводе и получения полностью рабочего эксплойта потребовался цикл анализа кода и общения туда-сюда.