Sploitus

Exploit for CVE-2026-0073-Research

kitploit · 2026-08-27

Exploit Code

MARKDOWN78 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-NOVAEK-CVE-2026-0073-RESEARCH
# CVE-2026-0073-Research

CVE-2026-0073 — это RCE с оценкой серьезности CVSS 8.3, и здесь мы объясним, как она работает.

## Первая часть: анализ кода:

Сначала единственное, что может быть интересным, — это узнать больше о самой ошибке.

Мой первый источник: https://www.tenable.com/cve/CVE-2026-0073

Этот источник сообщает нам, что файл auth.cpp содержит функцию под названием adbd_tls_verify_cert, которая имеет поток выполнения, позволяющий неаутентифицированный RCE.

Теперь основная цель — получить исходный код auth.cpp.

Поскольку я не смог найти его ни в одном официальном репозитории, я нашел этот репозиторий, созданный Project-Awaken, по адресу: https://github.com/Project-Awaken/android_packages_modules_adb/blob/12/daemon/auth.cpp

и вот она! наша загадочная функция:

root@kitploit:~
    
    
    int adbd_tls_verify_cert(X509_STORE_CTX* ctx, std::string* auth_key) {
        if (!auth_required) {
            // Any key will do.
            LOG(INFO) << __func__ << ": auth not required";
            return 1;
        }
    
        bool authorized = false;
        X509* cert = X509_STORE_CTX_get0_cert(ctx);
        if (cert == nullptr) {
            LOG(INFO) << "got null x509 certificate";
            return 0;
        }
        bssl::UniquePtr<EVP_PKEY> evp_pkey(X509_get_pubkey(cert));
        if (evp_pkey == nullptr) {
            LOG(INFO) << "got null evp_pkey from x509 certificate";
            return 0;
        }
    
        IteratePublicKeys([&](std::string_view public_key) {
            // TODO: do we really have to support both ' ' and '\t'?
            std::vector<std::string> split = android::base::Split(std::string(public_key), " \t");
            uint8_t keybuf[ANDROID_PUBKEY_ENCODED_SIZE + 1];
            const std::string& pubkey = split[0];
            if (b64_pton(pubkey.c_str(), keybuf, sizeof(keybuf)) != ANDROID_PUBKEY_ENCODED_SIZE) {
                LOG(ERROR) << "Invalid base64 key " << pubkey;
                return true;
            }
    
            RSA* key = nullptr;
            if (!android_pubkey_decode(keybuf, ANDROID_PUBKEY_ENCODED_SIZE, &key)) {
                LOG(ERROR) << "Failed to parse key " << pubkey;
                return true;
            }
    
            bool verified = false;
            bssl::UniquePtr<EVP_PKEY> known_evp(EVP_PKEY_new());
            EVP_PKEY_set1_RSA(known_evp.get(), key);
            if (EVP_PKEY_cmp(known_evp.get(), evp_pkey.get())) {
                LOG(INFO) << "Matched auth_key=" << public_key;
                verified = true;
            } else {
                LOG(INFO) << "auth_key doesn't match [" << public_key << "]";
            }
            RSA_free(key);
            if (verified) {
                *auth_key = public_key;
                authorized = true;
                return false;
            }
    
            return true;
        });
    
        return authorized ? 1 : 0;
    }