
Reproductor de laboratorio exclusivamente de caída para CVE-2025-69420 en OpenSSL. El PoC carga una TimeStamp Response RFC 3161 válida, cambia en memoria el atributo ESS firmado de V_ASN1_SEQUENCE a V_ASN1_NULL y llama a TS_RESP_verify_response().
En una compilación afectada, ossl_ess_get_signing_cert_v2() o ossl_ess_get_signing_cert() accede a la unión ASN1_TYPE como una secuencia sin validar el tipo activo. UBSan informa de acceso a un miembro a través de un puntero ASN1_STRING nulo. El impacto esperado es la terminación del proceso / denegación de servicio; este repositorio no contiene lógica de ejecución de código.
La salida de prueba proporcionada confirma el 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
Esto coincide con la descripción de la vulnerabilidad: una TimeStamp Response malformada llega a TS_RESP_verify_response(), y un atributo ESS de certificado de firma de un tipo distinto de V_ASN1_SEQUENCE provoca una desreferencia de puntero inválida o NULL.
Pruébelo únicamente en un entorno aislado contra una compilación de OpenSSL que sea suya o que esté autorizado a evaluar. Este es un reproductor exclusivamente de caída.
Ruta de compilación predeterminada:
/path/to/openssl-3.0.7-asan
Puede sobrescribirla cuando sea necesario:
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
O ejecute todo por separado:
./scripts/prepare.sh
./scripts/build.sh
./scripts/run.sh
El script prepare.sh usa el openssl.cnf mínimo del repositorio, por lo que no depende de la existencia de $OPENSSL_BUILD/ssl/openssl.cnf.
[+] 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
Las direcciones y números de línea exactos varían según la compilación. Con UBSAN_OPTIONS=halt_on_error=1, el proceso termina en la primera operación indefinida detectada.
El atributo malformado debe rechazarse limpiamente, sin hallazgos del sanitizador ni caída del proceso. El PoC entonces imprime:
[+] Malformed response rejected without a crash
El valor de tipo de atributo original 16 es V_ASN1_SEQUENCE. El PoC lo cambia a V_ASN1_NULL. En la implementación afectada, el código trata posteriormente el miembro de la unión como value.sequence y lo desreferencia. Dado que el miembro activo no es una secuencia, UBSan detecta el acceso a un miembro a través de un ASN1_STRING * nulo.
Esto es una confusión de tipos / ausencia de comprobación de condiciones excepcionales, más que un desbordamiento de búfer en heap o en la pila.
poc.c — reproductor mínimoscripts/prepare.sh — genera la clave TSA, el certificado, la solicitud y una respuesta válidascripts/build.sh — compila contra la compilación de OpenSSL con ASan/UBSanscripts/run.sh — se ejecuta con la configuración de sanitizadoresopenssl.cnf — configuración mínima de provider/solicitudtsa.conf — configuración local de TSA RFC 3161evidence/confirmed-output.txt — traza de sanitizador confirmada y abreviada4e254b48ad93cc092be3dd62d97015f33f73133a