
PoC solo crash per CVE-2025-69420 che dimostra una vulnerabilità di type confusion nella verifica della risposta TimeStamp di OpenSSL tramite attributi di certificato ESS di firma malformati.
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