שינויים ב-Nginx 1.26 ב-Apigee Edge 4.53.00

סקירה כללית של השינויים ב-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 בגודל קטן מ-2,048 ביט ומפתחות 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'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"}
קו חדש (\n) בין שם הכותרת ואחריו מיד WS או סדרה של WS {"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"}
תו חזרה לתחילת השורה (\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 הישן, אבל נדחו על ידי מעבד ההודעות במקור (upstream), וכתוצאה מכך הוחזר קוד הסטטוס 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"}