Änderungen in Nginx 1.26
Mit der Veröffentlichung von Nginx 1.26 wurden mehrere wichtige Änderungen eingeführt, um die Sicherheit zu verbessern und die Einhaltung der HTTP-Standards zu gewährleisten. Hier sind die wichtigsten Änderungen:
Umgang mit Leerzeichen in Headernamen und ‑werten
Um die Sicherheit zu verbessern, wurde die Einhaltung von RFC 7230 verstärkt, insbesondere im Hinblick auf die Verarbeitung von Leerzeichen in Headern. Weitere Informationen zu diesen Änderungen finden Sie im Anhang.
Umgang mit Content-Length
- und Transfer-Encoding
-Headern
Eine der gängigen Techniken bei Smuggling-Angriffen besteht darin, HTTP-Anfragen mit Content-Length
- und Transfer-Encoding
-Headern zu senden. Apigee Edge war bereits gegen solche Angriffe geschützt, aber Nginx blockiert jetzt explizit Anfragen, die beide Header enthalten. Wenn eine solche Anfrage gesendet wird, antwortet Nginx mit dem Fehler 400 Bad Request.
Unterstützte Chiffren
Die Liste der unterstützten Verschlüsselungsverfahren für Anfragen von Kunden zu Google kann sich mit dieser Version ändern. Sie können die von OpenSSL auf Ihrem Routerhost unterstützten Chiffren prüfen, um eine aktuelle Liste der verfügbaren Chiffren zu erhalten.
Unterstützte Schlüsselgrößen
Bisher wurden RSA-, DSA- und DH-Schlüssel mit weniger als 2.048 Bit sowie ECC-Schlüssel mit weniger als 224 Bit standardmäßig akzeptiert. Mit diesem Update sind solche Schlüssel jedoch weder für unidirektionale noch für bidirektionale TLS-Verbindungen für Northbound-Anfragen mehr zulässig.
Anhang
Leerzeichen in Überschriften
Es gibt drei Hauptänderungen:
- Bestimmte Headernamen, die zuvor zulässig waren, sind in Nginx 1.26 nicht mehr zulässig. Anfragen mit diesen Headern führen zu einem 400 Bad Request-Fehler.
- Bestimmte Headerwerte, die zuvor zulässig waren, sind in Nginx 1.26 nicht mehr zulässig. Anfragen mit diesen Headern führen ebenfalls zu einem 400 Bad Request-Fehler.
- Einige Header, die zuvor von Nginx akzeptiert wurden, aber im Nachrichtenprozessor zu Fehlern geführt haben, werden jetzt direkt von Nginx abgelehnt. Auch wenn diese Header weiterhin zu API-Fehlern führen, ändern sich die HTTP-Fehlermeldungen.
Im folgenden Abschnitt finden Sie Beispiele für verschiedene Headernamen und Headerwerte, die nicht zulässig sind. Hierbei handelt es sich lediglich um Beispiele. Es besteht kein Anspruch auf Vollständigkeit. Es wird empfohlen, die Richtlinien von RFC 7230 für Header einzuhalten.
Änderungen an Headernamen
In diesem Abschnitt sind verschiedene Headernamen aufgeführt, die in Nginx 1.20.1 zulässig waren, in Nginx 1.26 aber nicht mehr zulässig sind.
Szenario | Beispiele für Headernamen |
---|---|
Steuerzeichen am Anfang, Ende oder in der Mitte des Headernamens | { '\u0001'Header0, Value0 } { Header6'\u0002', Value6 } { Header'\u0005'4, Value4 } |
Führende und nachgestellte Leerzeichen im Headernamen | {"Header2 ", "Value2"} {" Header3", "Value3"} {" Header4 ", "Value4"} |
Führender und abschließender HTAB im Headernamen | {"\tHeader11", "Value11"} {"Header12\t", "Value12"} {"\tHeader13\t", "Value13"} |
Anfangs- und Endkombination von HTAB und WS im Headernamen | {"\t Header24", "Value24"} {" \tHeader25", "Value25"} {"Header26 \t", "Value26"} {"Header27\t ", "Value27"} |
Ein Neulinenzeichen (\n) zwischen dem Headernamen und einem oder mehreren Leerzeichen | {"Header\n 57Mutiline", "Value57"} {"Header\n 58Mutiline", "Value58"} |
Neue Zeile (\n) zwischen dem Headernamen und HTAB oder einer Reihe von HTABs | {"Header\n\t73", "Value73"} {"Header\n\t\t74", "Value74"} |
Zeilenvorschub (\r) und Neuzeile (\n) zwischen dem Headernamen, gefolgt unmittelbar von HTAB oder einer Reihe von HTAB | {"Header\r\n\t69", "Value69"} {"Header\r\n\t\t70", "Value70"} |
Zeilenvorschub (\r) und Zeilenumbruch (\n) zwischen dem Headernamen, gefolgt unmittelbar von WS oder einer Reihe von WS | {"Header\r\n 71", "Value71"} {"Header\r\n 72", "Value72"} |
Änderungen an Headerwerten
In diesem Abschnitt werden verschiedene Headerwerte aufgeführt, die in Nginx 1.20.1 zulässig waren, in Nginx 1.26 jedoch nicht mehr.
Szenario | Beispiele |
---|---|
\r\n oder eine Kombination aus \r\n mit WS oder HTAB ist zwischen HEADERVALUE zulässig. |
{"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"} |
\n oder eine Kombination aus \n mit WS oder HTAB ist zwischen HEADERVALUE zulässig. |
{"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"} |
Änderung der HTTP-Fehlerantwort
In diesem Abschnitt werden Header beschrieben, die vom alten Nginx-Server zugelassen, aber vom Upstream-Nachrichten-Prozessor abgelehnt wurden, was zu einem Statuscode 400 führte. In Nginx 1.26 führen solche Header jedoch direkt zu Fehlern in Nginx, sodass die Anfrage nicht an den Message Processor weitergeleitet wird.
Bei Clients, die solche Header senden, bleibt der HTTP-Statuscode 400. Der HTTP-Antworttext kann sich jedoch ändern, da der Fehler jetzt von Nginx und nicht vom Message Processor generiert wird.
Szenario | Beispiele |
---|---|
HTAB oder WS zwischen HEADERNAME
Der Message Processor lehnt solche Anfragen ab. Bei Nginx 1.26 werden diese Anfragen von Nginx selbst abgelehnt. Der API-Nutzer erhält eine 400-Fehlerantwort mit einer Nginx-Fehlermeldung im Textkörper. |
{"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"} |