
PoC de crash uniquement pour CVE-2025-69420 démontrant une vulnérabilité de type-confusion dans la vérification de TimeStamp Response d'OpenSSL via des attributs de certificat de signature ESS malformés.
Reproducteur de laboratoire uniquement plantant pour CVE-2025-69420 dans OpenSSL. Le PoC charge une réponse TimeStamp RFC 3161 valide, modifie l'attribut ESS signé de V_ASN1_SEQUENCE à V_ASN1_NULL en mémoire, et appelle TS_RESP_verify_response().
Sur une version affectée, ossl_ess_get_signing_cert_v2() ou ossl_ess_get_signing_cert() accède à l'union ASN1_TYPE comme une séquence sans valider le type actif. UBSan signale un accès à un membre via un pointeur ASN1_STRING nul. L'impact attendu est la terminaison du processus / déni de service ; ce dépôt ne contient aucune logique d'exécution de code.
La sortie de test fournie confirme le problème :
runtime error: member access within null pointer of type 'struct ASN1_STRING'
#0 ossl_ess_get_signing_cert_v2
#1 ts_check_signing_certs
#2 TS_RESP_verify_signature
#3 int_ts_RESP_verify_token
#4 TS_RESP_verify_response
Cela correspond à la description de la vulnérabilité : une réponse TimeStamp malformée atteint TS_RESP_verify_response(), et un attribut de certificat de signature ESS d'un type autre que V_ASN1_SEQUENCE provoque un déréférencement de pointeur invalide ou NULL.
Testez uniquement dans un environnement isolé contre une version d'OpenSSL que vous possédez ou que vous êtes autorisé à évaluer. Ceci est un reproducteur de plantage uniquement.
Chemin de construction par défaut :
/path/to/openssl-3.0.7-asan
Remplacez-le si nécessaire :
export OPENSSL_BUILD=/path/to/openssl-asan-build
git clone https://github.com/Kha-Beleh/PoC-CVE-2025-69420.git
cd PoC-CVE-2025-69420
export OPENSSL_BUILD=/path/to/openssl-3.0.7-asan
make prepare
make build
make run
Ou exécutez tout séparément :
./scripts/prepare.sh
./scripts/build.sh
./scripts/run.sh
prepare.sh utilise le openssl.cnf minimal du dépôt, donc il ne dépend pas d'un $OPENSSL_BUILD/ssl/openssl.cnf manquant.
[+] Loaded valid TimeStamp Response
[+] Found attribute: id-smime-aa-signingCertificateV2
[+] Original ASN.1 type: 16
[+] Attribute changed to V_ASN1_NULL
[+] Calling TS_RESP_verify_response()
crypto/ts/ts_rsp_verify.c:...: runtime error: member access within null pointer of type 'struct ASN1_STRING'
#0 ... in ossl_ess_get_signing_cert_v2
#1 ... in ts_check_signing_certs
#2 ... in TS_RESP_verify_signature
#3 ... in int_ts_RESP_verify_token
#4 ... in TS_RESP_verify_response
Les adresses exactes et les numéros de ligne varient selon la version. Avec UBSAN_OPTIONS=halt_on_error=1, le processus se termine à la première opération indéfinie détectée.
L'attribut malformé doit être rejeté proprement sans résultat du sanitizer ni plantage du processus. Le PoC affiche alors :
[+] Malformed response rejected without a crash
La valeur de type d'attribut originale 16 est V_ASN1_SEQUENCE. Le PoC la change en V_ASN1_NULL. Dans l'implémentation affectée, le code traite ensuite le membre de l'union comme value.sequence et le déréférence. Parce que le membre actif n'est pas une séquence, UBSan détecte un accès à un membre via un pointeur ASN1_STRING * nul.
Il s'agit d'une confusion de type / d'un contrôle de condition exceptionnelle manquant, plutôt que d'un débordement de tampon de tas ou de pile.
poc.c — reproducteur minimalscripts/prepare.sh — génère la clé TSA, le certificat, la demande et la réponse validescripts/build.sh — compile contre la version OpenSSL avec ASan/UBSanscripts/run.sh — s'exécute avec les paramètres du sanitizeropenssl.cnf — configuration minimale du fournisseur/de la demandetsa.conf — configuration TSA locale RFC 3161evidence/confirmed-output.txt — trace sanitizer confirmée raccourcie4e254b48ad93cc092be3dd62d97015f33f73133a