
Crash-only PoC para CVE-2025-69420 que demonstra uma vulnerabilidade de confusão de tipos na verificação de Resposta TimeStamp do OpenSSL por meio de atributos malformados de certificado de assinatura ESS.
Reprodutor de laboratório somente de travamento para CVE-2025-69420 no OpenSSL. O PoC carrega uma Resposta de Carimbo de Tempo RFC 3161 válida, altera o atributo ESS assinado de V_ASN1_SEQUENCE para V_ASN1_NULL em memória e chama TS_RESP_verify_response().
Em um build afetado, ossl_ess_get_signing_cert_v2() ou ossl_ess_get_signing_cert() acessa a união ASN1_TYPE como uma sequência sem validar o tipo ativo. O UBSan relata acesso a membro através de um ponteiro nulo ASN1_STRING. O impacto esperado é a terminação do processo / negação de serviço; este repositório não contém lógica de execução de código.
A saída de teste fornecida confirma o 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
Isso corresponde à descrição da vulnerabilidade: uma Resposta de Carimbo de Tempo malformada chega a TS_RESP_verify_response(), e um atributo de certificado de assinatura ESS de um tipo diferente de V_ASN1_SEQUENCE causa uma desreferência de ponteiro inválida ou nula.
Teste apenas em um ambiente isolado contra um build do OpenSSL que você possua ou esteja autorizado a avaliar. Este é um reprodutor somente de travamento.
Caminho de build padrão:
/path/to/openssl-3.0.7-asan
Substitua-o quando necessário:
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 execute tudo separadamente:
./scripts/prepare.sh
./scripts/build.sh
./scripts/run.sh
O prepare.sh usa o openssl.cnf mínimo do repositório, portanto não depende de um $OPENSSL_BUILD/ssl/openssl.cnf ausente.
[+] 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
Os endereços exatos e números de linha variam conforme o build. Com UBSAN_OPTIONS=halt_on_error=1, o processo termina na primeira operação indefinida detectada.
O atributo malformado deve ser rejeitado de forma limpa, sem achado de sanitizer ou travamento do processo. O PoC então imprime:
[+] Malformed response rejected without a crash
O valor do tipo de atributo original 16 é V_ASN1_SEQUENCE. O PoC o altera para V_ASN1_NULL. Na implementação afetada, o código subsequentemente trata o membro da união como value.sequence e o desreferencia. Como o membro ativo não é uma sequência, o UBSan detecta acesso a membro através de um ASN1_STRING * nulo.
Trata-se de uma confusão de tipo / verificação de condição excepcional ausente, e não de um estouro de buffer de heap ou pilha.
poc.c — reprodutor mínimoscripts/prepare.sh — gera chave TSA, certificado, solicitação e resposta válidascripts/build.sh — compila contra o build do OpenSSL com ASan/UBSanscripts/run.sh — executa com configurações de sanitizeropenssl.cnf — configuração mínima de provider/solicitaçãotsa.conf — configuração local do TSA RFC 3161evidence/confirmed-output.txt — rastreamento de sanitizer confirmado e reduzido4e254b48ad93cc092be3dd62d97015f33f73133a