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, 内存安全, 安全, 安全测试工具, 客户端加密, 拒绝服务, 暴力破解, 漏洞验证, 超时处理, 配置错误