
يفحص عمليات بناء curl/libcurl المحلية بحثًا عن التعرّض لثغرة CVE-2026-92392، وهي ثغرة استخدام بعد التحرير (use-after-free) في رفع HTTP/2، مع جرد سلبي، وفحص الصور المُثبَّتة (mounted-image)، وفحص PoC محدود عبر loopback.
يقيّم cve_2026_92392_check.py مكوّنات curl وlibcurl المحلية بحثًا عن
CVE-2026-92392، وهو ثغرة استخدام بعد التحرير (use-after-free) في رفع HTTP/2 في curl/libcurl.
يدعم الجرد المحلي السلبي، وتقييم البانر المقدَّم، وفحص الصور المُثبَّتة دون تنفيذ، وفحص محدود لبروتوكول HTTP/2 عبر واجهة الاسترجاع (loopback). الفحص دفاعي وغير مسلَّح. لا يحتوي على حمولة أوامر، أو shellcode، أو التلاعب بعناوين الذاكرة، أو منطق تسريب معلومات، أو حمولة RCE.
يرتبط الفحص النشط بـ 127.0.0.1 فقط، ولا يقبل أي عنوان URL أو مضيف هدف بعيد، ولا ينفّذ سوى ملف curl المحلي المحدد.
يفصل الفاحص بين أربعة مستويات مختلفة من الأدلة:
| مستوى الدليل | ما يثبته | ما لا يثبته |
|---|---|---|
| تصنيف البناء | ما إذا كان مكوّن curl/libcurl المؤهَّل بإصداره خارج النطاق المتأثر في المنبع، أو متأثرًا في المنبع بحالة ترقيع مورّد غير معروفة، أو متأثرًا مؤكَّدًا باستخدام أدلة حالة الترقيع المقدَّمة | ما إذا كان التطبيق يستخدم فعليًا مسار رفع HTTP/2 المتأثر |
| سياق التعرّض أثناء التشغيل | ما إذا كانت حقائق التطبيق المقدَّمة تشير إلى إمكانية وصول عمليات رفع HTTP/2 إلى نقطة نهاية يتحكم بها المهاجم | ما إذا كانت الثغرة قد أُطلقت |
| التحفيز البروتوكولي | ما إذا كانت أداة الاسترجاع المحلية قد سلّمت كلا متغيري إعادة الضبط الموثّقين مع عمليتي رفع على اتصال HTTP/2 واحد | استخدامًا بعد التحرير، أو سبب انهيار، أو تنفيذ شيفرة |
| نتيجة المُطهِّر المنسوبة إلى CVE | ما إذا كان قد لوحظ كلٌّ من: التسلسل المرشَّح، واستخدام بعد التحرير في كومة AddressSanitizer، وهوية مكوّن متأثر في المنبع، ومكدّس HTTP/2 مطابق | الموثوقية أو قابلية الاستغلال العملي على نظام آخر |
لا تُثبت الجولة النظيفة، أو الجولة البروتوكولية غير المكتملة، أو جولة المُطهِّر التي لا تنهار، أن البناء آمن.
تؤثر CVE-2026-92392 في معالجة رفع HTTP/2 في curl/libcurl. أثناء الرفع، يمكن لبناء متأثر أن يعالج إطار HTTP/2 من نوع RST_STREAM يحمل إما REFUSED_STREAM أو HTTP_1_1_REQUIRED. عندئذٍ يمكن تحليل بيانات الرفع المخزَّنة مؤقتًا كطلب جديد بعد فصل حالة HTTP/2 الخاصة بالنقل الأصلي. ويمكن لاستدعاء HTTP/2 لاحق أن يشير إلى مؤشر Curl_easy قديم.
أكّدت مقارنة REA المستخدمة لمراجعة هذا الفاحص فرق ترتيب التنظيف ذا الصلة:
Curl_conn_ev_data_done، ويعالج المقابض المعلّقة، ثم يستدعي Curl_req_done فقط بعد ذلك.Curl_req_done إلى req_flush، بينما يكون مسار اكتمال بيانات HTTP/2 قد مسح سياق التدفق بالفعل.Curl_req_done قبل Curl_conn_ev_data_done، مما يزيل ذلك الترتيب القديم.هذا دليل تنفيذي يدعم نموذج الإثبات لدى الفاحص. ولا تزال حالة ترقيع المورّد تتطلب تحققًا مستقلًا.
يحدد استشارة المنبع التنفيذ المعرَّض للخطر بأنه أُدخل في curl 8.12.0. يصنّف الفاحص إصدارات المنبع كما يلي:
| شرط الإصدار | التصنيف |
|---|---|
| أقدم من 8.12.0 | NOT AFFECTED |
| من 8.12.0 حتى 8.22.0، باستثناء الترقيعات الخلفية المُصلَحة | متأثر في المنبع |
| فرع 8.14 عند 8.14.3 أو أحدث | ترقيع خلفي مُصلَح |
| فرع 8.16 عند 8.16.2 أو أحدث | ترقيع خلفي مُصلَح |
| فرع 8.20 عند 8.20.2 أو أحدث | ترقيع خلفي مُصلَح |
| 8.23.0 أو أحدث | NOT AFFECTED |
| تطويري، أو snapshot، أو nightly، أو إصدار غامض | INDETERMINATE |
يمكن للمورّد أن يطبّق الترقيع خلفيًا دون تغيير سلسلة إصدار curl في المنبع. لذلك، فإن إصدار المنبع المتأثر هو دليل جرد، وليس إثباتًا قاطعًا على أن بناء المورّد غير مُرقَّع.
استخدم --patch-state فقط عندما تكون حالة الإصلاح الدلالي في المصب قد تحققت عبر استشارات المورّد، أو سجلات تغييرات الحزم، أو مقارنة الشيفرة المصدرية، أو أي طريقة أخرى موثوقة على مستوى المكوّن.
قيمة --patch-state | المعنى |
|---|---|
unknown | القيمة الافتراضية. إصدار upstream متأثر يُنتج UPSTREAM-AFFECTED VERSION. |
absent | تحقّق المشغّل بشكل مستقل من غياب الإصلاح في downstream. بناء متأثر يدعم HTTP/2 يُنتج AFFECTED BUILD. |
present | تحقّق المشغّل بشكل مستقل من وجود الإصلاح الدلالي في downstream. هذا تأكيد من المشغّل، وليس دليلاً تلقائياً على التكافؤ الثنائي مع إصلاح curl في upstream. |
--poc.--poc-proof asan.openssl فقط عند استخدام --tls.يرفض وضع PoC النشط السكربتات والأغلفة والملفات التنفيذية الأصلية غير المُعرَّفة وثنائيات PE/Windows. يظل التقييم السلبي متاحاً للبانرات وأنظمة الملفات المثبَّتة.
افحص ثنائي curl الموجود في PATH:
python3 cve_2026_92392_check.py
أخرج JSON:
python3 cve_2026_92392_check.py --json
تشغيل الاختبارات الذاتية الداخلية:
python3 cve_2026_92392_check.py --self-test
python3 -O cve_2026_92392_check.py --self-test
افحص ملف curl التنفيذي المحدد ومكتبة libcurl المشتركة:
python3 cve_2026_92392_check.py \
--curl-binary /opt/curl/bin/curl \
--libcurl-path /opt/curl/lib/libcurl.so \
--json
تقييم لافتة curl موثوقة دون تنفيذ ملف ثنائي:
python3 cve_2026_92392_check.py \
--version-string 'curl 8.12.0 libcurl/8.12.0 nghttp2/1.61.0' \
--json
لا تُقبل نسخة مجرّدة مثل 8.12.0 كدليل مُتحقَّق منه على هوية curl/libcurl.
لا يتصل المدقّق عن قصد بالمضيفين البعيدين. احصل على لافتة الإصدار (banner) عبر قناة إدارية مُصرَّح بها، واحفظها محليًا، ثم قيّمها محليًا:
ssh [email protected] 'curl --version' > host-curl-version.txt
python3 cve_2026_92392_check.py \
--version-file host-curl-version.txt \
--http2-use unknown \
--untrusted-upload unknown \
--https-certificate unknown \
--json
إذا أثبتت مراجعة التطبيق أو تتبّع موثوق أن عمليات الرفع تستخدم HTTP/2، ويمكنها الوصول إلى نقطة نهاية يتحكم بها المهاجم، وتقبل شهادتها HTTPS، فقدّم تلك الحقائق صراحةً:
python3 cve_2026_92392_check.py \
--version-file host-curl-version.txt \
--http2-use yes \
--untrusted-upload yes \
--https-certificate yes \
--patch-state unknown \
--json
بالنسبة إلى h2c النصي الصريح، استخدم --https-certificate not-applicable.
يحدد --http2-use yes استخدام HTTP/2 وقت التشغيل. وهو لا يثبت أن
البرنامج الثنائي قد جُمِّع بدعم HTTP/2. وبالمثل، يصف --untrusted-upload yes
تدفق بيانات التطبيق، بينما يسجل --https-certificate yes شرط الثقة
المنفصل الخاص بـ HTTPS.
استخدم --root لفحص صورة حاوية مُثبَّتة، أو صورة جهاز ظاهري، أو نظام ملفات
مُستخرَج دون تنفيذ الملفات المكتشفة:
python3 cve_2026_92392_check.py \
--root /mnt/rootfs \
--json
فحص الجذر:
curl وcurl.exe وlibcurl.INDETERMINATE.يُحدَّد حكم البناء بناءً على شرطين:
| الشرط المسبق | المعنى |
|---|---|
| P1 | هوية curl/libcurl وإصدارهما موثّقان ضمن النطاق المتأثر في المنبع، رهناً بحالة الترقيع الموثّقة في المصب |
| P2 | دعم HTTP/2 مُضمَّن في العنصر المُقيَّم |
يُقيَّم التعرض وقت التشغيل بشكل منفصل:
| الشرط المسبق | المعنى |
|---|---|
| P3 | التحميل المُقيَّم يتفاوض فعلياً على HTTP/2 |
| P4 | يمكن للتطبيق التحميل إلى نقطة نهاية HTTP/2 يتحكم بها المهاجم |
| P5 | تُقبل شهادة HTTPS عند استخدام HTTPS |
| P6 | تفاصيل بيئة خاصة بالاستغلال مثل المعمارية وlibc وسلوك تخصيص TLS وحزمة CA |
| P7 | تنسيق جانب الاستغلال مثل حجم التحميل والتزامن ونافذة الحمولة والتوقيت |
يحدد P1 وP2 قابلية تطبيق البناء. ويحدد P3 وP4 ما إذا كان الاستخدام المحتمل التأثر قد تم تحديده. ويؤثر P5 حتى P7 في ظروف الاستغلال عن بُعد، وليس في وجود ثغرة use-after-free في HTTP/2.