Обзор изменений Nginx 1.26
С выпуском Nginx 1.26 было внесено несколько важных изменений для повышения безопасности и обеспечения соответствия стандартам HTTP. Ниже перечислены основные обновления:
Обработка пробелов в именах и значениях заголовков
Для повышения безопасности было усилено соблюдение RFC 7230, особенно в отношении обработки пробелов в заголовках. Подробнее об этих изменениях можно узнать в Приложении .
Обработка заголовков Content-Length
и Transfer-Encoding
Один из распространённых методов, используемых при атаках с подменой запросов, — это отправка HTTP-запросов с заголовками Content-Length
и Transfer-Encoding
. Хотя Apigee Edge уже был защищён от подобных атак, Nginx теперь явно блокирует запросы, содержащие оба заголовка. При отправке такого запроса Nginx выдаёт ошибку 400 Bad Request .
Поддерживаемые шифры
Список поддерживаемых шифров для северных запросов может измениться в этом выпуске. Вы можете проверить поддерживаемые OpenSSL шифры на вашем маршрутизаторе, чтобы получить актуальный список доступных шифров.
Поддерживаемые размеры ключей
Ранее ключи RSA, DSA и DH длиной менее 2048 бит, а также ключи ECC длиной менее 224 бит принимались по умолчанию. Однако с этим обновлением такие ключи больше не будут разрешены как для односторонних, так и для двусторонних TLS-соединений для северных запросов.
Приложение
Пробелы в заголовках
Существует три основных изменения:
- Некоторые имена заголовков, которые ранее были разрешены, теперь запрещены в Nginx 1.26. Запросы с этими заголовками приведут к ошибке 400 Bad Request .
- Некоторые значения заголовков, которые ранее были разрешены, теперь запрещены в Nginx 1.26. Запросы с этими заголовками также приведут к ошибке 400 Bad Request .
- Некоторые заголовки, которые ранее принимались Nginx, но вызывали сбои в обработке сообщений, теперь отклоняются Nginx напрямую. Хотя эти заголовки по-прежнему приводят к сбоям API, сообщения об ошибках HTTP изменятся.
В разделе ниже приведены примеры различных запрещённых имён и значений заголовков. Это лишь примеры, и список может быть неполным. Рекомендуется следовать рекомендациям RFC 7230 для заголовков.
Изменения в названиях заголовков
В этом разделе перечислены различные имена заголовков, которые были разрешены в Nginx 1.20.1, но теперь запрещены в Nginx 1.26.
Сценарий | Примеры названий заголовков |
---|---|
Управляющий символ в начале, конце или между именами заголовков | { '\u0001'Заголовок0, Значение0 } { Заголовок6'\u0002', Значение6 } { Заголовок'\u0005'4, Значение4 } |
Начальные и конечные пробелы в имени заголовка | {"Заголовок2", "Значение2"} {"Заголовок3", "Значение3"} {"Заголовок4", "Значение4"} |
Начальный и конечный HTAB в имени заголовка | {"\tЗаголовок11", "Значение11"} {"Заголовок12\t", "Значение12"} {"\tЗаголовок13\t", "Значение13"} |
Начальная и конечная комбинация HTAB, WS в имени заголовка | {"\t Заголовок24", "Значение24"} {" \tЗаголовок25", "Значение25"} {"Заголовок26 \t", "Значение26"} {"Заголовок27\t", "Значение27"} |
Новая строка (\n) между именем заголовка, за которым сразу следует WS или серия WS | {"Заголовок\n 57Многострочный", "Значение57"} {"Заголовок\n 58Многострочный", "Значение58"} |
Новая строка (\n) между именем заголовка, за которым сразу следует HTAB или серия HTAB | {"Заголовок\n\t73", "Значение73"} {"Заголовок\n\t\t74", "Значение74"} |
Возврат каретки (\r) и новая строка (\n) между именем заголовка, за которым сразу следует HTAB или серия HTAB | {"Заголовок\r\n\t69", "Значение69"} {"Заголовок\r\n\t\t70", "Значение70"} |
Возврат каретки (\r) и новая строка (\n) между именем заголовка, за которым сразу следует WS или серия WS | {"Заголовок\r\n 71", "Значение71"} {"Заголовок\r\n 72", "Значение72"} |
Изменения значений заголовков
В этом разделе показаны различные значения заголовков, которые были разрешены в Nginx 1.20.1, но запрещены в Nginx 1.26.
Сценарий | Примеры |
---|---|
\r\n или комбинация \r\n с WS или HTAB допускается между HEADERVALUE | {"Заголовок47", "Значение47\r\n Многострочное"}, {"Заголовок48", "Значение48\r\n Многострочное"}, {"Заголовок49b", "Значение49b\r\n \r\nМногострочный"}, {"Заголовок50", "Значение50 \r\n Многострочный"}, {"Заголовок51", "Значение51\r\n\tМногострочный"}, {"Заголовок52", "Значение52\r\n\t\tМногострочный"}, {"Заголовок53", "Значение53\t\r\n\tМногострочный"} |
\n или комбинация \n с WS или HTAB допускается между HEADERVALUE | {"Заголовок61", "Значение\n 61Многострочное"}, {"Заголовок62", "Значение\n 63Многострочный"}, {"Заголовок65", "Значение\n\t65"}, {"Заголовок66", "Значение\n\t\t66"}, {"Заголовок67", "Значение\n 67"}, {"Заголовок68", "Значение\n 68"} |
Изменение в ответе на ошибку HTTP
В этом разделе рассматриваются заголовки, которые были разрешены старой версией Nginx, но отклонены вышестоящим обработчиком сообщений, что приводило к коду статуса 400. Однако в Nginx 1.26 такие заголовки вызывают сбои непосредственно в Nginx, препятствуя пересылке запроса обработчику сообщений.
Для клиентов, отправляющих такие заголовки, код состояния HTTP останется 400. Однако тело ответа HTTP может измениться, поскольку теперь ошибка будет генерироваться Nginx, а не обработчиком сообщений.
Сценарий | Примеры |
---|---|
HTAB или WS между HEADERNAME Обработчик сообщений отклоняет такие запросы. В версии Nginx 1.26 эти запросы будут отклоняться самим Nginx. Потребитель API получит ответ с кодом ошибки 400 с сообщением об ошибке Nginx в теле запроса. | {"Заголовок 5", "Значение5"}, {"Заголовок\t14", "Значение14"}, {"Заголовок\t 32", "Значение32"}, {"Заголовок \t33", "Значение33"}, {"Заголовок- 36", "Значение36"}, {"Заголовок-\t40", "Значение40"}, {"Заголовок 4a", "Значение4a"}, {"Заголовок\t 59", "Значение59"}, {"Заголовок\t 60", "Значение60"} |