
Crash-only-PoC für CVE-2025-69420, der eine Typverwechslungsschwachstelle in der TimeStamp-Response-Überprüfung von OpenSSL über manipulierte ESS-Signaturzertifikatsattribute demonstriert.
Reiner Crash-only-Labor-Reproduzent für CVE-2025-69420 in OpenSSL. Der PoC lädt eine gültige RFC-3161-TimeStamp-Response, ändert das signierte ESS-Attribut im Speicher von V_ASN1_SEQUENCE zu V_ASN1_NULL und ruft TS_RESP_verify_response() auf.
Auf einem betroffenen Build greift ossl_ess_get_signing_cert_v2() oder ossl_ess_get_signing_cert() auf die ASN1_TYPE-Union wie auf eine Sequenz zu, ohne den aktiven Typ zu validieren. UBSan meldet einen Member-Zugriff über einen Null-ASN1_STRING-Zeiger. Die erwartete Auswirkung ist Prozessbeendigung / Denial of Service; dieses Repository enthält keine Logik zur Codeausführung.
Die mitgelieferte Testausgabe bestätigt das Problem:
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
Dies entspricht der Schwachstellenbeschreibung: Eine fehlerhafte TimeStamp Response erreicht TS_RESP_verify_response(), und ein ESS-Signaturzertifikat-Attribut eines anderen Typs als V_ASN1_SEQUENCE verursacht eine ungültige oder NULL-Zeiger-Dereferenzierung.
Nur in einer isolierten Umgebung gegen einen OpenSSL-Build testen, der dir gehört oder zu dessen Bewertung du autorisiert bist. Dies ist ein reiner Crash-Reproduzent.
Standard-Build-Pfad:
/path/to/openssl-3.0.7-asan
Bei Bedarf überschreiben:
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
Oder alles separat ausführen:
./scripts/prepare.sh
./scripts/build.sh
./scripts/run.sh
prepare.sh verwendet das minimale openssl.cnf des Repositorys und hängt daher nicht von einer fehlenden $OPENSSL_BUILD/ssl/openssl.cnf ab.
[+] 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
Die genauen Adressen und Zeilennummern variieren je nach Build. Mit UBSAN_OPTIONS=halt_on_error=1 beendet der Prozess beim ersten erkannten undefinierten Vorgang.
Das fehlerhafte Attribut sollte sauber abgewiesen werden, ohne dass der Sanitizer einen Befund meldet oder der Prozess abstürzt. Der PoC gibt dann Folgendes aus:
[+] Malformed response rejected without a crash
Der ursprüngliche Attributtyp-Wert 16 ist V_ASN1_SEQUENCE. Der PoC ändert ihn zu V_ASN1_NULL. In der betroffenen Implementierung behandelt der Code das Union-Member anschließend als value.sequence und dereferenziert es. Da das aktive Member keine Sequenz ist, erkennt UBSan einen Member-Zugriff über einen Null-ASN1_STRING *.
Es handelt sich um eine Typverwechslung / fehlende Prüfung von Ausnahmebedingungen und nicht um einen Heap- oder Stack-Pufferüberlauf.
poc.c — minimaler Reproduzentscripts/prepare.sh — erzeugt TSA-Schlüssel, Zertifikat, Anfrage und gültige Antwortscripts/build.sh — kompiliert gegen den ASan/UBSan-OpenSSL-Buildscripts/run.sh — führt mit Sanitizer-Einstellungen ausopenssl.cnf — minimale Provider-/Anfragekonfigurationtsa.conf — lokale RFC-3161-TSA-Konfigurationevidence/confirmed-output.txt — gekürzte bestätigte Sanitizer-Ablaufverfolgung4e254b48ad93cc092be3dd62d97015f33f73133a