Next.js הוא אחד מכלי הפיתוח הנפוצים לבניית אתרים ואפליקציות ווב מעל React. בגרסאות מ-13.4.0 ועד 15.5.24 ו-16.3.3 התגלתה בו חולשה שמאפשרת לבקשה שמגיעה מהרשת לקרוא קבצים פנימיים של האפליקציה, ומשם להגיע להרצת קוד. תנאי אחד מצמצם אותה מאוד: היא רלוונטית רק כשהאפליקציה מתארחת על שרת Windows.

מה החולשה?

כדי לא לבנות כל עמוד מחדש בכל בקשה, Next.js שומר תוצאות מוכנות בתיקיית מטמון על הדיסק, ומרכיב את שם הקובץ מתוך הנתיב שהמבקר ביקש. זה אומר שטקסט שמגיע מהאינטרנט הופך לחלק משם של קובץ, ולכן הוא חייב לעבור ניקוי מתווים שמשמעותם לצאת תיקייה אחורה. Next.js אכן ניקה את התו הרגיל שמפריד תיקיות, אבל לא טיפל באופן עקבי בקו הנטוי ההפוך, שעל Windows הוא מפריד תיקיות בדיוק כמו הראשון.

מכאן זה פשוט. בקשה שנושאת מפרידי נתיב של Windows בצורה מקודדת מצליחה לטפס מחוץ לתיקיית המטמון ולקרוא קבצים אחרים. לסוג הבאג הזה קוראים מעבר בין תיקיות, והוא מסווג כ-CWE-22. לפי הרשומה שני הקבצים שבהם נמצאת הבעיה הם escape-path-delimiters.ts ו-file-system-cache.ts.

מה שהופך את זה מדליפת מידע להשתלטות הוא מה שיושב שם בחוץ. בין הקבצים שנחשפים נמצאים נתוני בנייה פרטיים של האפליקציה, ובהם מפתח ההצפנה של server-reference-manifest. לפי הרשומה, חשיפה של המפתח הזה יכולה לאפשר הרצת קוד באפליקציה. הציון שנקבע לחולשה הוא 9 מתוך 10, כשהמורכבות של התקיפה מסומנת כגבוהה.

מי מושפע?

אפליקציות Next.js מגרסה 13.4.0 ומעלה שקודמות ל-15.5.24 בענף 15, ולאפליקציות בענף 16, כל גרסה שקודמת ל-16.3.3. מעבר לגרסה נדרשים עוד שני תנאים: האפליקציה משתמשת ב-Pages Router, או ב-App Router בלי Cache Components, והיא מתארחת על שרת Windows.

התנאי האחרון הוא זה שקובע. אם האפליקציה שלכם רצה על Linux או בקונטיינר מבוסס Linux, החולשה הזאת לא נוגעת אליכם, גם אם הגרסה שלכם בטווח. מי שכן צריך לבדוק הוא ארגון שמארח את האתר שלו על שרת Windows פנימי.

האם מנוצלת בפועל?

החולשה אינה מופיעה בקטלוג ה-KEV של סוכנות הסייבר האמריקאית CISA, הרשימה שמרכזת חולשות שיש עליהן ראיות לניצול בשטח, ולכן אין נכון לעכשיו אישור רשמי שמישהו השתמש בה. זה לא אומר שהיא לא נוצלה, רק שלא דווח על כך.

מה שכן, התיקונים שלה יצאו כשחרורי גרסה רגילים של הפרויקט, ושני הקומיטים שסוגרים אותה מצורפים לרשומה וגלויים לכל. כשמישהו רוצה להבין מה בדיוק תוקן, הוא לא צריך לנחש.

מה עושים?

בדקו איזו גרסה של Next.js רשומה בפרויקט שלכם, בקובץ package.json ובקובץ הנעילה. אם אתם בענף 15, עדכנו לגרסה 15.5.24; אם אתם בענף 16, עדכנו לגרסה 16.3.3. אלה שתי הגרסאות שסוגרות את החולשה.

אם העדכון לא יכול לקרות מיד, שווה לזכור שהתנאי המכריע הוא אירוח על Windows. אפליקציה שמועברת לריצה על Linux מאבדת את התנאי הזה, וזו הקלה אמיתית לתקופת הביניים.

ואם יש לכם סיבה לחשוב שהאפליקציה הייתה יעד לניסיון כזה, התייחסו למפתח שהרשומה מזכירה כאל מפתח שנחשף והחליפו אותו. מפתח שדלף לא מפסיק לעבוד רק בגלל שהבאג שחשף אותו תוקן.