Изменения Nginx 1.26 в Apigee Edge 4.53.01

Обзор изменений 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-соединений для северных запросов.

Приложение

Пробелы в заголовках

Существует три основных изменения:

  1. Некоторые имена заголовков, которые ранее были разрешены, теперь запрещены в Nginx 1.26. Запросы с этими заголовками приведут к ошибке 400 Bad Request .
  2. Некоторые значения заголовков, которые ранее были разрешены, теперь запрещены в Nginx 1.26. Запросы с этими заголовками также приведут к ошибке 400 Bad Request .
  3. Некоторые заголовки, которые ранее принимались 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"}