
مُعيد إنتاج مخبري يسبب الانهيار فقط (Crash-only) لثغرة CVE-2025-69420 في OpenSSL. يقوم إثبات المفهوم بتحميل استجابة طابع زمني صالحة وفق 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
يتوافق ذلك مع وصف الثغرة: تصل استجابة طابع زمني مشوّهة إلى TS_RESP_verify_response()، وتؤدي سمة شهادة توقيع ESS من نوع مختلف عن 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، تُنهى العملية عند أول عملية غير محددة يتم اكتشافها.
يجب أن تُرفَض السمة المشوّهة برفض نظيف دون اكتشاف من المُنقّي أو انهيار للعملية. عندها يطبع إثبات المفهوم:
[+] Malformed response rejected without a crash
قيمة نوع السمة الأصلية 16 هي V_ASN1_SEQUENCE. يغيّرها إثبات المفهوم إلى V_ASN1_NULL. في التنفيذ المُتأثّر، يتعامل الكود لاحقًا مع عضو الاتحاد بوصفه value.sequence ويلغي مرجعيته. ولأن العضو النشط ليس تسلسلًا، يكتشف UBSan وصولًا إلى عضو عبر مؤشر ASN1_STRING * فارغ.
هذا التباس في النوع / نقص في فحص الحالة الاستثنائية، وليس تدفّقًا للمخزن المؤقت في الكومة أو المكدس.
poc.c — مُعيد إنتاج أدنىscripts/prepare.sh — يولّد مفتاح TSA وشهادة وطلبًا واستجابة صالحةscripts/build.sh — يترجم ضد بناء OpenSSL مع ASan/UBSanscripts/run.sh — يشغّل مع إعدادات المُنقّيopenssl.cnf — إعداد أدنى للمزوّد/الطلبtsa.conf — إعداد TSA محلي وفق RFC 3161evidence/confirmed-output.txt — تتبّع مُنقٍّ مؤكَّد ومختصَر4e254b48ad93cc092be3dd62d97015f33f73133a