
Riproduttore di laboratorio che causa esclusivamente un crash per CVE-2025-69420 in OpenSSL. Il PoC carica una TimeStamp Response RFC 3161 valida, modifica in memoria l'attributo ESS firmato da V_ASN1_SEQUENCE a V_ASN1_NULL e chiama TS_RESP_verify_response().
Su una build interessata, ossl_ess_get_signing_cert_v2() o ossl_ess_get_signing_cert() accede all'union ASN1_TYPE come se fosse una sequenza senza convalidare il tipo attivo. UBSan segnala un accesso a un membro tramite un puntatore ASN1_STRING nullo. L'impatto previsto è la terminazione del processo / denial of service; questo repository non contiene logica di esecuzione di codice.
L'output di test fornito conferma il problema:
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
Ciò corrisponde alla descrizione della vulnerabilità: una TimeStamp Response malformata raggiunge TS_RESP_verify_response() e un attributo ESS del certificato di firma con tipo diverso da V_ASN1_SEQUENCE causa un dereferenziamento di puntatore non valido o NULL.
Eseguire il test solo in un ambiente isolato contro una build di OpenSSL di cui si è proprietari o che si è autorizzati a valutare. Questo è un riproduttore che causa esclusivamente un crash.
Percorso di build predefinito:
/path/to/openssl-3.0.7-asan
Sostituirlo quando necessario:
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
Oppure eseguire tutto separatamente:
./scripts/prepare.sh
./scripts/build.sh
./scripts/run.sh
prepare.sh utilizza il openssl.cnf minimale del repository, quindi non dipende da un $OPENSSL_BUILD/ssl/openssl.cnf mancante.
[+] 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
Gli indirizzi e i numeri di riga esatti variano in base alla build. Con UBSAN_OPTIONS=halt_on_error=1, il processo termina alla prima operazione indefinita rilevata.
L'attributo malformato dovrebbe essere rifiutato in modo pulito senza segnalazioni del sanitizer o crash del processo. Il PoC quindi stampa:
[+] Malformed response rejected without a crash
Il valore originale del tipo di attributo 16 è V_ASN1_SEQUENCE. Il PoC lo modifica in V_ASN1_NULL. Nell'implementazione interessata, il codice tratta successivamente il membro dell'union come value.sequence e lo dereferenzia. Poiché il membro attivo non è una sequenza, UBSan rileva un accesso a un membro tramite un ASN1_STRING * nullo.
Questo è un caso di confusione di tipo / mancato controllo delle condizioni eccezionali, piuttosto che un overflow del buffer di heap o di stack.
poc.c — riproduttore minimalescripts/prepare.sh — genera la chiave TSA, il certificato, la richiesta e una risposta validascripts/build.sh — compila contro la build OpenSSL ASan/UBSanscripts/run.sh — esegue con le impostazioni dei sanitizeropenssl.cnf — configurazione minima per provider/richiestatsa.conf — configurazione locale TSA RFC 3161evidence/confirmed-output.txt — traccia del sanitizer confermata e abbreviata4e254b48ad93cc092be3dd62d97015f33f73133a