
مستودع يحتوي على نصوص برمجية للتحقق المُتحكَّم فيه من السلوكيات المرتبطة بالثغرتين CVE-2019-9511 وCVE-2019-9513، وكلتاهما مرتبطتان بنواقل رفض الخدمة في تطبيقات HTTP/2.
أُنشئت النصوص البرمجية لدعم عمليات التحقق الفنية في بيئات مُصرَّح بها، مما يتيح ملاحظة ما إذا كان الخادم يتفاوض على HTTP/2 ويستجيب لأنماط محددة مرتبطة بـ Data Dribble وPriority Churn، دون تنفيذ هجوم رفض الخدمة.
الهدف هو إثبات الناقل بطريقة خفيفة وآمنة، بحجم منخفض من الطلبات ودون هدف تعطيل البيئة.
| CVE | الاسم | النص البرمجي | الوصف |
|---|---|---|---|
CVE-2019-9511 | HTTP/2 Data Dribble | data_dribble_probe.py | يتحقق من سلوك التحكم في تدفق HTTP/2 عبر تحرير كميات صغيرة من البيانات بشكل مُتحكَّم فيه. |
CVE-2019-9513 | HTTP/2 Priority Churn / Resource Loop | priority_churn_probe.py | يتحقق من سلوك معالجة إطارات PRIORITY بكثافة منخفضة. |
تؤثر الثغرة CVE-2019-9511، المعروفة باسم HTTP/2 Data Dribble، على بعض تطبيقات HTTP/2 التي لا تعالج بكفاءة التعامل مع نافذة التدفق والتسليم التدريجي للبيانات.
في هذا السيناريو، يمكن للمهاجم طلب بيانات من الخادم والتلاعب بالتحكم في التدفق لإبقاء الاستجابة مفتوحة وتسليمها في كتل صغيرة، مثل حزم بحجم 1 بايت. اعتمادًا على التطبيق، قد يتسبب هذا السلوك في استهلاك مفرط لوحدة المعالجة المركزية أو الذاكرة أو موارد الاتصال، مما يؤدي إلى خطر رفض الخدمة.
في هذا المستودع، النص البرمجي المرتبط هو:
data_dribble_probe.py
الهدف من النص البرمجي هو التحقق من السلوك بطريقة خفيفة، دون توليد حمولة عدوانية ودون محاولة التسبب في تعطيل الخدمة.
المراجع:
تؤثر الثغرة CVE-2019-9513، المعروفة باسم HTTP/2 Priority Churn أو Resource Loop، على بعض تطبيقات HTTP/2 التي تعالج التغييرات المستمرة في شجرة أولويات التدفقات بطريقة مكلفة.
في هذا السيناريو، يمكن للمهاجم إنشاء تدفقات متعددة وتغيير الأولوية بينها بشكل متكرر، مما يسبب تقلبًا في شجرة الأولويات. اعتمادًا على التطبيق، قد يتسبب هذا السلوك في استهلاك مفرط لوحدة المعالجة المركزية ويؤدي إلى رفض الخدمة.
في هذا المستودع، النص البرمجي المرتبط هو:
priority_churn_probe.py
الهدف من النص البرمجي هو التحقق من قبول الخادم ومعالجته لإطارات PRIORITY، باستخدام كثافة منخفضة ودون تنفيذ هجوم DoS.
المراجع:
لا ترتبط الثغرتان CVE-2019-9511 وCVE-2019-9513 بإصدار واحد محدد من خوادم الويب، مثل nginx أو Apache أو Tomcat فقط.
بل تؤثران على تطبيقات HTTP/2 معينة في منتجات ومكتبات ووكلاء وموازنات تحميل وخوادم مختلفة. لذلك، يجب أن يأخذ التحقق في الاعتبار المكوّن الذي يتفاوض على HTTP/2 ويعالجه في البيئة التي يتم تحليلها.
أمثلة على المكونات التي قد تكون متورطة:
nginx
Apache HTTP Server
Envoy
HAProxy
Tomcat
Jetty
Node.js
Go net/http2
nghttp2
CDN
WAF
Load Balancer
Ingress Controller Kubernetes
المعيار الفني الأول هو تأكيد ما إذا كانت الخدمة تتفاوض على HTTP/2 عبر ALPN. إذا لم تتفاوض الخدمة على h2، فإن هذه النصوص البرمجية غير قابلة للتطبيق.
يجب تأكيد الثغرة حسب الإصدار استنادًا إلى النشرة الأمنية الرسمية الصادرة عن الشركة المصنِّعة للمكوّن المحدد.
قبل تنفيذ النصوص البرمجية، تحقق مما إذا كان الهدف يتفاوض على HTTP/2 عبر ALPN.
استخدم النطاق فقط في الأمر، دون https://.
openssl s_client -alpn h2 -connect exemplo.com.br:443 </dev/null 2>/dev/null | grep -i "ALPN"
يمكن أيضًا استخدامه مع placeholder:
openssl s_client -alpn h2 -connect <HOST>:443 </dev/null 2>/dev/null | grep -i "ALPN"
الخرج المتوقع:
ALPN protocol: h2
إذا أشار الخرج إلى h2، فإن الخدمة تتفاوض على HTTP/2 ويمكن أن تكون النصوص البرمجية قابلة للتطبيق.
إذا لم يكن هناك رد أو كان البروتوكول المتفاوض عليه مختلفًا، مثل http/1.1، فإن النصوص البرمجية غير قابلة للتطبيق على ذلك الـ endpoint.
الترتيب الأكثر منطقية لاستخدام النصوص البرمجية هو:
1. Pré-validação HTTP/2 com openssl
↓
2. priority_churn_probe.py
↓
3. data_dribble_probe.py
أولاً، استخدم الأمر مع openssl لتأكيد ما إذا كان الهدف يتفاوض على HTTP/2. بعد ذلك، استخدم priority_churn_probe.py للتحقق مما إذا كان الخادم يقبل ويعالج إطارات الأولوية. ثم استخدم data_dribble_probe.py لملاحظة سلوك الخادم تجاه نافذة تدفق مصغّرة، عبر تحرير كميات صغيرة من البيانات بشكل مُتحكَّم فيه.
كلا النصين البرمجيين مسباران خفيفان. لا يهدفان إلى التسبب في تعطيل الخدمة، بل إلى توليد دليل فني على السلوك الملاحَظ.
النص البرمجي priority_churn_probe.py هو إثبات مفهوم خفيف (PoC) للتحقق من السلوك المرتبط بالثغرة CVE-2019-9513، المعروفة باسم HTTP/2 Priority Churn.
ينشئ النص البرمجي اتصال HTTP/2 عبر TLS، ويفتح تدفقات HTTP صغيرة ويرسل تغييرات الأولوية عبر إطارات PRIORITY. ثم يقيس زمن الاستجابة قبل وبعد إرسال هذه الإطارات لملاحظة ما إذا كان هناك تباين في المعالجة.
PING؛PRIORITY بكثافة منخفضة؛استخدم هذا النص البرمجي عندما تكون هناك حاجة للتحقق مما إذا كان خادم HTTP/2 يقبل ويعالج إطارات الأولوية المرتبطة بناقل Priority Churn، دون تنفيذ اختبار DoS عدواني.
وهو مناسب للتحقق المُتحكَّم فيه في اختبارات الاختراق (pentests)، وتحليل التعرض HTTP/2، والإثبات الفني لسلوك ثغري أو حساس محتمل.
يستقبل النص البرمجي القيم عبر وسائط سطر الأوامر:
--host
--port
--paths
--shuffles
استخدم مسارات خفيفة وعامة ومنخفضة التأثير، مثل:
/
/robots.txt
/favicon.ico
/health
/login
تجنب المسارات التي تنفذ عمليات ثقيلة أو استعلامات معقدة أو توليد تقارير أو رفع ملفات أو بحثًا متقدمًا أو أي وظيفة تولّد حمولة على الواجهة الخلفية (backend).
python3 priority_churn_probe.py --host exemplo.com.br --port 443 --paths / /robots.txt /favicon.ico --shuffles 10
مثال على الخرج:
[OK] PING antes: 45.20 ms; após churn: 52.80 ms; shuffles=10
Sinal 9513: PRIORITY frames aceitos e processados; aumento sutil pós-churn evidencia o vetor (sem DoS).
إذا نجح النص البرمجي في التفاوض على HTTP/2 وفتح التدفقات وإرسال إطارات PRIORITY، فهذا يشير إلى أن الخادم يعالج هذا النوع من السلوك.
يمكن استخدام الزيادة الطفيفة في زمن الاستجابة بعد التقلب كدليل فني على أن الناقل موجود، لكن لا ينبغي تفسيرها وحدها كدليل على تأثير شديد. يعتمد التصنيف النهائي على السياق وإصدار الخادم والبنية وعوامل التخفيف وWAF/CDN وتكوين HTTP/2.
النص البرمجي data_dribble_probe.py هو إثبات مفهوم خفيف (PoC) للتحقق من السلوك المرتبط بالثغرة CVE-2019-9511، المعروفة باسم HTTP/2 Data Dribble.
ينشئ النص البرمجي اتصال HTTP/2 عبر TLS، ويفتح تدفقًا واحدًا ويتلاعب بنافذة التحكم في التدفق لتحرير كميات صغيرة من البيانات، محاكيًا سلوك التسليم التدريجي لإطارات DATA.
استخدم هذا النص البرمجي عندما تكون هناك حاجة للتحقق مما إذا كان خادم HTTP/2 يستجيب لنمط تحكم في التدفق مصغّر، مرتبط بناقل Data Dribble، دون تنفيذ حمولة عدوانية.
وهو مناسب للإثبات الفني المُتحكَّم فيه، خاصة عندما تشير الأدوات الآلية إلى تعرّض محتمل وتكون هناك حاجة للتحقق يدويًا بمخاطر تشغيلية أقل.
يستقبل النص البرمجي القيم عبر وسائط سطر الأوامر:
--host
--path
--port
--bytes
استخدم مسارًا بسيطًا أو ثابتًا أو منخفض التكلفة على الخادم، مثل:
/
/robots.txt
/favicon.ico
/health
/login
تجنب الـ endpoints التي تجري استعلامات على قاعدة البيانات أو مصادقة ثقيلة أو معالجة غير متزامنة أو توليد مستندات أو استدعاءات لأنظمة داخلية.
python3 data_dribble_probe.py --host exemplo.com.br --path / --port 443 --bytes 12
مثال على الخرج:
[OK] HTTP/2 negociado; DATA frames recebidos: 12; bytes liberados: 12; tempo(ms): 1450
Sinal 9511: múltiplos DATA minúsculos entregues sob janela=1 (prova do caminho 'dribble' sem stress).
إذا تفاوض النص البرمجي على HTTP/2 واستقبل إطارات DATA صغيرة وفقًا لتحرر نافذة التدفق، فهذا يشير إلى أن الخادم يعالج نمط التحكم في التدفق هذا.
يمكن استخدام هذا السلوك كدليل فني على الناقل، لكن يجب أن تأخذ الخطورة في الاعتبار السياق الفعلي للبيئة، مثل الخادم المستخدم والإصدار وحدود الاتصال وموازن التحميل وCDN وWAF وtimeout والحمايات ضد إساءة الاستخدام.
تتطلب النصوص البرمجية Python 3 ومكتبة h2.
python3
pip
h2
ssl
socket
argparse
تُعد المكتبات ssl وsocket وtime وargparse وselect جزءًا من المكتبة القياسية لـ Python.
التبعية الخارجية الرئيسية هي:
h2
التثبيت المباشر:
python3 -m pip install h2
التثبيت باستخدام بيئة افتراضية:
python3 -m venv venv
source venv/bin/activate
pip install h2
تحقق من التثبيت:
python3 -c "import h2; print('h2 instalado com sucesso')"
تعتمد النصوص البرمجية على التفاوض على HTTP/2 عبر ALPN.
قبل التنفيذ، تأكد من أن الخادم يدعم HTTP/2:
openssl s_client -alpn h2 -connect exemplo.com.br:443 </dev/null 2>/dev/null | grep -i "ALPN"
الخرج المتوقع:
ALPN protocol: h2
إذا لم يتفاوض الخادم على h2، فلن تكون النصوص البرمجية قابلة للتطبيق.
--hostلا تُدرج https:// في المعامل --host.
صحيح:
--host exemplo.com.br
غير صحيح:
--host https://exemplo.com.br
فضل المسارات البسيطة:
/
/robots.txt
/favicon.ico
/health
تجنب الـ endpoints الحساسة أو الثقيلة:
/relatorios
/export
/search
/upload
/api/processamento
الفكرة هي التحقق من سلوك HTTP/2، وليس إجهاد الواجهة الخلفية (backend).
استخدم قيمًا متحفظة:
بالنسبة إلى priority_churn_probe.py:
--shuffles 10
بالنسبة إلى data_dribble_probe.py:
--bytes 12
لا ترفع هذه القيم في بيئة الإنتاج دون إذن صريح.
openssl s_client -alpn h2 -connect exemplo.com.br:443 </dev/null 2>/dev/null | grep -i "ALPN"
python3 priority_churn_probe.py --host exemplo.com.br --port 443 --paths / /robots.txt /favicon.ico --shuffles 10
python3 data_dribble_probe.py --host exemplo.com.br --path / --port 443 --bytes 12
لتقليل المخاطر المرتبطة بهجمات HTTP/2 من نوع DoS، يُوصى بإبقاء خوادم الويب والوكلاء وموازنات التحميل ومكتبات HTTP/2 محدّثة، وتطبيق حدود على الاتصالات، وضبط timeouts مناسبة، والحد من عدد التدفقات المتزامنة، وتقييد إساءة استخدام إطارات HTTP/2، ومراقبة حالات شذوذ زمن الاستجابة، وتقييم تعطيل HTTP/2 في الخدمات التي لا تحتاج إلى هذا البروتوكول.
يُوصى أيضًا بالتحقق من الحماية في الطبقات مثل CDN وWAF وreverse proxy وingress controller وload balancer، لأن التعرض الفعلي يعتمد في كثير من الأحيان على الحافة (edge) أكثر من التطبيق النهائي.
يجب تأكيد الإصلاح بناءً على المكوّن الذي يُنهي HTTP/2 ويعالجه فعليًا في البيئة، مثل خادم الويب أو الوكيل أو موازن التحميل أو CDN أو ingress controller.
يجب استخدام هذه النصوص البرمجية فقط في بيئات مُصرَّح بها.
على الرغم من أنها كُتبت للتنفيذ الخفيف، إلا أنها تتفاعل مباشرة مع آليات HTTP/2 المرتبطة بنواقل DoS. لذلك، يجب أن يتوافق الاستخدام مع النطاق الرسمي للاختبار وقواعد الاشتباك والحدود التشغيلية المحددة مع المسؤول عن البيئة.
قبل التنفيذ في الإنتاج، تأكد من:
يُحظر استخدام هذه النصوص البرمجية ضد أنظمة دون إذن.
الغرض من هذا المستودع هو حصريًا دعم الأنشطة الأمنية المشروعة، مثل اختبار الاختراق المُصرَّح به، والتحقق المُتحكَّم فيه من الثغرات، والمختبر، والدراسة الفنية، والعرض الآمن للمخاطر.
| النص البرمجي | CVE المرتبطة | الهدف | متى يُستخدم |
|---|
data_dribble_probe.py | CVE-2019-9511 | التحقق من السلوك المرتبط بـ Data Dribble باستخدام التحكم في النافذة لتحرير كتل صغيرة من البيانات | يُستخدم عندما يدعم الخادم HTTP/2 وتكون هناك حاجة للتحقق من سلوك تسليم إطارات DATA بنافذة مصغّرة. |
priority_churn_probe.py | CVE-2019-9513 | التحقق من السلوك المرتبط بـ Priority Churn باستخدام إطارات PRIORITY بكثافة منخفضة | يُستخدم عندما يدعم الخادم HTTP/2 وتكون هناك حاجة للتحقق مما إذا كان يعالج تغييرات أولوية التدفقات. |
| المعامل | الوصف |
|---|
--host | الاسم المؤهل بالكامل (FQDN) للهدف المُصرَّح به. لا تُدرج https://. |
--port | منفذ TLS حيث تتوفر خدمة HTTP/2. الافتراضي: 443. |
--paths | قائمة بمسارات بسيطة لفتح تدفقات HTTP/2. |
--shuffles | عدد دورات تغيير الأولوية. أبقِه منخفضًا لاختبار آمن. |
| المعامل | الوصف |
|---|
--host | الاسم المؤهل بالكامل (FQDN) للهدف المُصرَّح به. لا تُدرج https://. |
--path | المسار الذي سيتم طلبه في الاختبار. |
--port | منفذ TLS حيث تتوفر خدمة HTTP/2. الافتراضي: 443. |
--bytes | إجمالي البايتات المحررة أثناء الاختبار. أبقِه منخفضًا لتحقق آمن. |