Kha-Beleh/PoC-CVE-2025-69420

GitHub: Kha-Beleh/PoC-CVE-2025-69420

用于复现 OpenSSL CVE-2025-69420 类型混淆漏洞的仅崩溃 PoC,通过篡改 TimeStamp Response 中的 ESS 属性类型触发空指针解引用。

Stars: 0 | Forks: 0

# CVE-2025-69420 — OpenSSL TimeStamp Response 类型混淆 PoC 用于在 OpenSSL 中复现 CVE-2025-69420 的仅崩溃(Crash-only)实验室复现代码。该 PoC 会加载一个有效的 RFC 3161 TimeStamp Response,在内存中将已签名的 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 签名证书属性会导致无效或 NULL 指针解引用。 ## 范围 仅限在隔离环境中,针对您拥有或被授权评估的 OpenSSL 构建版本进行测试。这是一个仅用于触发崩溃的复现代码。 ## 要求 - Linux 和 GCC - 使用 ASan 和 UBSan 编译的受影响的 OpenSSL 构建版本 - 构建树中的 OpenSSL 开发头文件 默认构建路径: ``` /home/vedroid/rpmbuild/BUILD/openssl-3.0.7-asan ``` 在需要时覆盖它: ``` export OPENSSL_BUILD=/path/to/openssl-asan-build ``` ## 用法 ``` git clone cd PoC-CVE-2025-69420 export OPENSSL_BUILD=/home/vedroid/rpmbuild/BUILD/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` 的情况下,进程会在首次检测到未定义操作时终止。 ## 已修复构建版本上的预期结果 格式错误的属性应该被正常拒绝,而不会触发 sanitizer 报告或导致进程崩溃。然后 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` — 使用 sanitizer 设置运行 - `openssl.cnf` — 最小化的 provider/request 配置 - `tsa.conf` — 本地 RFC 3161 TSA 配置 - `evidence/confirmed-output.txt` — 精简的已确认 sanitizer 跟踪记录 ## 参考 - NVD: CVE-2025-69420 - OpenSSL 修复:commit `4e254b48ad93cc092be3dd62d97015f33f73133a`
标签:Maven, OpenSSL, PoC, 内存安全, 安全, 安全测试工具, 客户端加密, 拒绝服务, 暴力破解, 漏洞验证, 超时处理, 配置错误