Re: нормализация uri

Gena Makhomed gmm на csdoc.com
Вт Авг 18 08:16:43 UTC 2020


On 17.08.2020 17:58, Maxim Dounin wrote:

> HTTP response splitting предоставляет атакующему контроль над
> ответом, и XSS - одно из прямых и наиболее очевидных следствий.

>> И почему nginx не может закодировать "\n" or "\r" перед тем,
>> как применять $uri для построения проксированого запроса?
>> Это выглядит как не закрытая security vulnerability в nginx.

> Ничего не мешает, равно как и, скажем, заменить в отправляемом
> перенаправлении A на B.  Тут и в остальных подобныых директивах
> (return, add_header, proxy_set_header, proxy_pass) nginx ожидает
> корректно закодированне значения.

Если эти ожидания не оправдались - nginx ведь может понять,
что ему не предоставили корректно закодированные значения.

И в таком случае - он может ведь вернуть 500 ошибку вместо
того, чтобы предоставлять атакующему возможность сделать XSS.

Например, проведите голосование среди пользователей nginx+,
какую реакцию nginx+ они предпочитают - 500 ошибку или XSS?
Я почти уверен, что никто не захочет, чтобы у них была XSS.

Просканировать строку на предмет наличия в ней символов
"\n" или "\r" окажет влияне на производительность
на уровне статистической погрешности, около нуля.

Почему нет? Ведь тогда nginx станет неуязвим к атаке
вида HTTP response splitting - разве это того не стоит?

Наверное нет смысла делать в nginx отдельную директиву
HTTP_response_splitting_security_vulnerability on/off;

> В случае директивы rewrite дополнительно гарантируется, что
> переменные $1..$9, полученные из раскодированного URI запроса с
> помощью регулярного выражения в первом параметре, будут
> рассматриваться как раскодированные.

Может быть имеет смысл для каждой переменной в nginx добавить
поле статуса, показывающее, является ли эта переменная
корректно закодированной или корректно раскодированной?

Тогда nginx смог бы сам на лету превращать раскодированные
переменные в закодированные, например, при использовании их
в тех директивах, где необходимо корректно закодированное
значение переменной.

>>>> Насколько высока вероятность того, что патч, реализующий
>>>> дополнительную функциональность merge_slashes redirect;
>>>> или normalize_uri on; будет принят в основную ветку nginx?
>>
>>> Задача не кажется типичной. Если очень хочется решать её силами
>>> nginx'а - я бы рекомендовал начать с инкапсуляции нужных
>>> перенаправленый в отдельных include-файлах, и/или решений на
>>> скриптовых языках, или же отдельного модуля для нормализации.
>>
>> Что написать в include-файлах вместо
>>
>>      if ($request_uri ~ "^[^?]*?//") {
>>          rewrite "^" $scheme://$host$uri permanent;
>>      }
>>
>>      if ($http_host ~ "\.$") {
>>          rewrite "^" $scheme://$host$uri permanent;
>>      }
>>
>> чтобы не было XSS ?
> 
> rewrite ^(.*) $scheme://$host$1 permanent;

Спасибо. Получился такой конфиг:

if ($request_uri ~ "^[^?]*?//") { rewrite ^(.*) $scheme://$host$1 
permanent; }
if ($http_host ~ "\.$") { rewrite ^(.*) $scheme://$host$1 permanent; }

Похоже, что это максимум из того, что можно выжать из nginx
в его современном виде и эту ситуацию уже никак улучшить нельзя?

Например, путем создания в nginx директивы normalize_uri со значением
по умолчанию on. Тогда все работало бы так как надо прямо из коробки.

Задача является более, чем типичной, вот например, такая проблема:
http://mailman.nginx.org/pipermail/nginx-ru/2014-April/053860.html
Здесь бы тоже normalize_uri on; было бы решением проблемы.

Случаев, когда normalize_uri on; будет создавать проблемы
при включенном merge_slashes on; не обнаружено ни одного.

-- 
Best regards,
  Gena



Подробная информация о списке рассылки nginx-ru