
OpenSSL における CVE-2025-69420 のクラッシュ専用実験室再現器。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 は null の 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 signing-certificate 属性が無効なポインタまたは NULL ポインタの参照外しを引き起こします。
所有しているか評価を許可された 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 は null の 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