
Crash-only PoC для CVE-2025-69420, демонстрирующий уязвимость type-confusion в проверке ответов TimeStamp в OpenSSL через некорректные атрибуты ESS signing-certificate.
Лабораторный воспроизводитель, предназначенный только для аварийного завершения, для CVE-2025-69420 в OpenSSL. PoC загружает валидный ответ TimeStamp Response по RFC 3161, заменяет в памяти подписанный атрибут ESS с V_ASN1_SEQUENCE на V_ASN1_NULL и вызывает TS_RESP_verify_response().
В затронутой сборке ossl_ess_get_signing_cert_v2() или ossl_ess_get_signing_cert() обращается к объединению ASN1_TYPE как к последовательности, не проверяя активный тип. UBSan сообщает о доступе к члену через нулевой указатель ASN1_STRING. Ожидаемое воздействие — завершение процесса / отказ в обслуживании; данный репозиторий не содержит логики выполнения кода.
Приведённый тестовый вывод подтверждает проблему:
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
Это соответствует описанию уязвимости: некорректный ответ TimeStamp Response достигает TS_RESP_verify_response(), а атрибут ESS signing-certificate типа, отличного от V_ASN1_SEQUENCE, вызывает недопустимое или нулевое разыменование указателя.
Тестируйте только в изолированной среде на сборке OpenSSL, которой вы владеете или которую уполномочены оценивать. Это воспроизводитель, предназначенный только для аварийного завершения.
Путь сборки по умолчанию:
/path/to/openssl-3.0.7-asan
При необходимости переопределите его:
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
Или запустите всё по отдельности:
./scripts/prepare.sh
./scripts/build.sh
./scripts/run.sh
prepare.sh использует минимальный openssl.cnf из репозитория, поэтому он не зависит от отсутствующего $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
Точные адреса и номера строк зависят от сборки. При UBSAN_OPTIONS=halt_on_error=1 процесс завершается при первой обнаруженной неопределённой операции.
Некорректный атрибут должен быть чисто отклонён без срабатывания санитайзера и без аварийного завершения процесса. Затем PoC выводит:
[+] Malformed response rejected without a crash
Исходное значение типа атрибута 16 — это V_ASN1_SEQUENCE. PoC изменяет его на V_ASN1_NULL. В затронутой реализации код впоследствии обрабатывает член объединения как value.sequence и разыменовывает его. Поскольку активный член не является последовательностью, UBSan обнаруживает доступ к члену через нулевой ASN1_STRING *.
Это несоответствие типов / отсутствие проверки исключительного состояния, а не переполнение буфера в куче или стеке.
poc.c — минимальный воспроизводительscripts/prepare.sh — генерирует ключ TSA, сертификат, запрос и валидный ответscripts/build.sh — компилирует с использованием ASan/UBSan сборки OpenSSLscripts/run.sh — запускает с настройками санитайзераopenssl.cnf — минимальная конфигурация провайдера/запросаtsa.conf — локальная конфигурация TSA по RFC 3161evidence/confirmed-output.txt — сокращённый подтверждённый след санитайзера4e254b48ad93cc092be3dd62d97015f33f73133a