סקירה כללית של השינויים ב-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 במארח הנתב.
גדלי מפתחות נתמכים
בעבר, מערכת Google Play קיבלה כברירת מחדל מפתחות 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'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"} |
תו NewLine (\n) בין שם הכותרת לבין WS או סדרה של WS | {"Header\n 57Mutiline", "Value57"} {"Header\n 58Mutiline", "Value58"} |
תו NewLine (\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"} |
תו חזרה לתחילת השורה (\r) או תו מעבר שורה (\n) בין שם הכותרת לבין רווח לבן או סדרה של רווחים לבנים | {"Header\r\n 71", "Value71"} {"Header\r\n 72", "Value72"} |
שינויים בערכים של הכותרות
בקטע הזה מוצגים ערכים שונים של כותרות שהיו מותרים ב-Nginx 1.20.1 אבל לא מותרים ב-Nginx 1.26.
תרחיש | דוגמאות |
---|---|
\r\n או שילוב של \r\n עם WS או HTAB מותרים בין HEADERVALUE |
{"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 או שילוב של \n עם WS או HTAB מותרים בין HEADERVALUE |
{"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 הישן אבל נדחו על ידי מעבד ההודעות במעלה הזרם, וכתוצאה מכך נוצר קוד סטטוס 400. עם זאת, ב-Nginx 1.26, כותרות כאלה גורמות לכשלים ישירות ב-Nginx, ומונעות את העברת הבקשה למעבד ההודעות.
עבור לקוחות ששולחים כותרות כאלה, קוד הסטטוס של HTTP יישאר 400. עם זאת, יכול להיות שגוף התגובה של HTTP ישתנה כי עכשיו השגיאה תיווצר על ידי Nginx במקום על ידי מעבד ההודעות.
תרחיש | דוגמאות |
---|---|
HTAB או WS בין HEADERNAME
מעבד ההודעות דוחה בקשות כאלה. ב-Nginx 1.26, הבקשות האלה יידחו על ידי Nginx עצמו. צרכן ה-API יקבל תגובת שגיאה 400 עם הודעת שגיאה של Nginx בגוף התגובה. |
{"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"} |