Nginx 1.26 の変更の概要
Nginx 1.26 のリリースに伴い、セキュリティを強化し、HTTP 標準への準拠を確保するために、いくつかの重要な変更が導入されました。主な更新内容は次のとおりです。
ヘッダー名と値の空白文字の処理
セキュリティを強化するため、RFC 7230 への準拠が強化されました。特に、ヘッダー内の空白文字の処理に関する準拠が強化されています。これらの変更について詳しくは、付録をご覧ください。
Content-Length
ヘッダーと Transfer-Encoding
ヘッダーの処理
リクエスト スマグリング攻撃で使用される一般的な手法の 1 つに、Content-Length
ヘッダーと Transfer-Encoding
ヘッダーの両方を含む HTTP リクエストを送信する方法があります。Apigee Edge はこのような攻撃に対してすでに強化されていますが、Nginx は両方のヘッダーを含むリクエストを明示的にブロックするようになりました。このようなリクエストが送信されると、Nginx は 400 Bad Request エラーを返します。
サポートされている暗号
このリリースでは、ノースバウンド リクエストでサポートされる暗号のリストが変更される可能性があります。ルーターホストで OpenSSL がサポートする暗号を確認して、使用可能な暗号の最新リストを取得できます。
サポートされている鍵のサイズ
以前は、2,048 ビット未満の RSA 鍵、DSA 鍵、DH 鍵、および 224 ビット未満の ECC 鍵はデフォルトで受け入れられていました。ただし、この更新により、このような鍵は、ノースバウンド リクエストの双方向 TLS 接続と一方向 TLS 接続の両方で許可されなくなります。
付録
ヘッダー内の空白文字
主な変更点は次の 3 つです。
- 以前は許可されていた特定のヘッダー名が、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'Header0, Value0 } { Header6'\u0002', Value6 } { Header'\u0005'4, Value4 } |
ヘッダー名の先頭と末尾の空白文字 | {"Header2 ", "Value2"} {" Header3", "Value3"} {" Header4 ", "Value4"} |
ヘッダー名の先頭と末尾の HTAB | {"\tHeader11", "Value11"} {"Header12\t", "Value12"} {"\tHeader13\t", "Value13"} |
ヘッダー名に HTAB と WS の組み合わせが先頭または末尾にある | {"\t Header24", "Value24"} {" \tHeader25", "Value25"} {"Header26 \t", "Value26"} {"Header27\t ", "Value27"} |
ヘッダー名の直後に WS または一連の WS が続く NewLine(\n) | {"Header\n 57Mutiline", "Value57"} {"Header\n 58Mutiline", "Value58"} |
ヘッダー名の間に改行(\n)があり、その直後に HTAB または一連の HTAB が続く | {"Header\n\t73", "Value73"} {"Header\n\t\t74", "Value74"} |
ヘッダー名の間に改行(\r)と改行(\n)があり、その直後に HTAB または一連の HTAB が続く | {"Header\r\n\t69", "Value69"} {"Header\r\n\t\t70", "Value70"} |
ヘッダー名の直後に WS または一連の WS が続く改行(\r)改行(\n) | {"Header\r\n 71", "Value71"} {"Header\r\n 72", "Value72"} |
ヘッダー値の変更
このセクションでは、Nginx 1.20.1 では許可されていたが、Nginx 1.26 では許可されていないさまざまなヘッダー値を示します。
シナリオ | 例 |
---|---|
HEADERVALUE の間に \r\n または \r\n と WS または HTAB の組み合わせが許可されています |
{"Header47", "Value47\r\n MultiLine"}, {"Header48", "Value48\r\n MultiLine"}, {"Header49b", "Value49b\r\n \r\nMultiLine"}, {"Header50", "Value50 \r\n MultiLine"}, {"Header51", "Value51\r\n\tMultiLine"}, {"Header52", "Value52\r\n\t\tMultiLine"}, {"Header53", "Value53\t\r\n\tMultiLine"} |
HEADERVALUE の間に \n または \n と WS または HTAB の組み合わせが許可されます |
{"Header61", "Value\n 61Multiline"}, {"Header62", "Value\n 63Multiline"}, {"Header65", "Value\n\t65"}, {"Header66", "Value\n\t\t66"}, {"Header67", "Value\n 67"}, {"Header68", "Value\n 68"} |
HTTP 失敗レスポンスの変更
このセクションでは、以前の Nginx では許可されていたが、アップストリームの Message Processor では拒否され、400 ステータス コードが返されたヘッダーについて説明します。ただし、Nginx 1.26 では、このようなヘッダーは Nginx で直接エラーを引き起こし、リクエストが Message Processor に転送されなくなります。
このようなヘッダーを送信するクライアントの場合、HTTP ステータス コードは 400 のままになります。ただし、エラーがメッセージ プロセッサではなく Nginx によって生成されるため、HTTP レスポンスの本文が変更される可能性があります。
シナリオ | 例 |
---|---|
HEADERNAME の間に HTAB または WS がある Message Processor はこのようなリクエストを拒否します。Nginx 1.26 では、これらのリクエストは Nginx 自体によって拒否されます。API コンシューマーは、本文に Nginx エラー メッセージを含む 400 エラー レスポンスを受け取ります。 |
{"Header 5", "Value5"}, {"Header\t14", "Value14"}, {"Header\t 32", "Value32"}, {"Header \t33", "Value33"}, {"Header- 36", "Value36"}, {"Header-\t40", "Value40"}, {"Header 4a", "Value4a"}, {"Header\t 59", "Value59"}, {"Header\t 60", "Value60"} |