הודעת האבטחה של צוות React מדצמבר 2025 מסמנת שינוי פרדיגמה באבטחת יישומי אינטרנט. עם אימוץ מהיר של טכנולוגיית Server-Side Rendering (SSR) באמצעות React Server Components (RSC) בתעשייה, שטח התקיפה עבר מ-DOM של הלקוח לגבול הסידור הסדרתי של השרת. CVE-2025-55184 אינו באג טריוויאלי של מיצוי משאבים; זהו באג מתוחכם מורכבות אלגוריתמית מניעת שירות מכוון לארכיטקטורה הבסיסית של לולאת האירועים של Node.js. על ידי ניצול של דה-סריאליזציה רקורסיבית של Promises בתוך פרוטוקול טיסה, תוקף לא מאומת יכול לגרום ל רעב בתור משימות מיקרו, מה שמביא את תהליך השרת למצב של תרדמת תוך שמירה על יציאות TCP פתוחות. מדריך מקיף זה מנתח את הפגיעות ברמת התקשורת, בוחן את מנגנון הרקורסיה "Ouroboros" ומדגים כיצד Penligent מנצל פוזינג דיפרנציאלי מבוסס AI כדי לאמת פגם זה מבלי לשבש את זמינות הייצור.

הארכיטקטורה של קריסה: RSC, Flight ו-Event Loop
כדי להבין את חומרת CVE-2025-55184, עלינו תחילה לפרק את שכבת התקשורת הקניינית המפעילה את Next.js App Router ו-React 19: ה- פרוטוקול טיסה.
פורמט חוט פרוטוקול הטיסה
בניגוד ל-REST או GraphQL, שמחזירים בדרך כלל JSON סטטי, RSC משתמש בפורמט הזרמה היברידי מבוסס שורות, שנועד לפתור עצי רכיבים באופן הדרגתי.
זרם תגובה טיפוסי של Flight נראה כך:
HTTP
1:I{"id":134,"chunks":["app/page.js"],"name":"default"} 2:{"title":"Welcome","content":"$@1"} 3:{"$":"$@2"}
- קו 1: מייבא מודול (רכיב לקוח).
- קו 2: מגדיר אובייקט JSON המתייחס לחלק 1.
- קו 3: מגדיר הפניה לחלק 2.
התכונה הקטלנית: סידוריות אסינכרונית
React מאפשר למפתחים להעביר Promises מהשרת ללקוח. כאשר הסריאלייזר נתקל ב-Promise הממתין, הוא פולט מחזיק מקום. הדסריאלייזר (בצד המקבל, שיכול להיות גם שרת בארכיטקטורות מדורגות) מתוכנת להמתין עד שה-Promises יפתרו.
דרישה זו מחייבת אסטרטגיית פתרון רקורסיבית: אם Promise A נפתר ל-Promise B, ה-deserializer חייב להירשם ל-Promise B. הרקורסיה הזו היא המקור לפגיעות.
Node.js פנימי: מחסור בתור משימות מיקרו
מדוע ניצול זה כה הרסני בהשוואה לניצול סטנדרטי? while(true) לולאה? התשובה טמונה בתזמון המשימות של מנוע V8.
- משימות מאקרו: טיימרים (
setTimeout), קריאות חוזרות של קלט/פלט,setImmediate. - מיקרו-משימות: החזרות הבטחה (
.ואז,.לתפוס),process.nextTick.
מכונאי הרעב:
לולאת האירועים של Node.js פועלת על פי כלל עדיפות קפדני: תור המיקרו-משימות חייב להתרוקן לחלוטין לפני שלולאת האירועים יכולה להמשיך לשלב הבא.
בניצול CVE-2025-55184, התוקף שולח מטען שבו Promise נפתר לעצמו (או שרשרת המובילה חזרה לעצמו).
- הממיר מתזמן
.then()לטיפול בהחלטה. - הקריאה החוזרת פועלת, מזהה את הרקורסיה ומתזמנת אותה. אחר
.then(). - חשוב לציין, זה קורה באופן סינכרוני בנוגע לעיבוד התור. אורך התור לעולם אינו מגיע לאפס.
- השפעה: קריאות החזרה של קלט/פלט רשת (טיפול בבקשות חדשות), בדיקות תקינות וסימנים של מערכת ההפעלה נחסמים לצמיתות. התהליך פעיל (PID קיים), היציאות פתוחות (SYN-ACK פועל ברמת מערכת ההפעלה), אך היישום אינו מתפקד.
הנדסה לאחור של הניצול
המטען "אובורוס"
הפגיעות קיימת ב react-server-dom-webpack (והגרסאות שלו עבור Parcel/Turbopack). ה- processValue הפונקציה לא כללה הגבלת עומק או זיהוי מחזור עבור סוגי התייחסות.
תוקף יכול לנצל זאת על ידי בניית גרף מחזורי מכוון (DCG) בתוך מטען הטיסה.
קוד ניצול קונספטואלי (ברמת הפרוטוקול)
אמנם הקידוד הבינארי בפועל הוא מורכב, אך המבנה הלוגי של וקטור ההתקפה הוא פשוט ואלגנטי:
JavaScript
// ייצוג JSON של מבנה Flight הזדוני // יעד: נקודת קצה של נתב האפליקציה Next.js (POST /)
{ "id": "root", "chunks": [], "value": { // אנו מגדירים אובייקט Promise באופן ידני באמצעות תחביר Flight "$": "$Promise", "status": "fulfilled", "value": { // הערך של הבטחה זו הוא... עצמה. "$": "$@root" } } }`
כאשר השרת מפרש את זה:
- הוא רואה הבטחה שהתגשמה.
- זה חושף את הערך.
- הוא רואה הפניה לאובייקט השורש (שהוא ה-Promise).
- הוא מתזמן מיקרו-משימה כדי לפתוח את האובייקט השורש שוב.
- GOTO 1.
לולאה זו מתרחשת כולה בזיכרון, תוך עקיפת WAFs מסורתיים המחפשים חתימות הזרקת SQL או גופי בקשה גדולים. המטען הוא לרוב קטן מ-1KB.
הסאגה של "התיקון הבלתי שלם" (CVE-2025-67779)
חשוב לציין כי התיקון הראשוני לפגיעות זו עוקף תוך מספר ימים. התיקון הראשון ניסה לעקוב אחר עומק הרקורסיה, אך לא הצליח להתחשב בווריאציות מסוימות של מבנים מקוננים (לדוגמה, עטיפת המחזור בתוך מפה או הגדר). זה הוביל ל CVE-2025-67779. לכן, "עדכון" בלבד אינו מספיק; יש לוודא שהם נמצאים ב סופי גרסאות מתוקנות (React 19.0.3+ / Next.js 15.0.6+).
השותף השקט: CVE-2025-55183 (חשיפת קוד מקור)
בעוד 55184 הורס את הזמינות, CVE-2025-55183 פוגע בסודיות. פגיעות נלווית זו נחשפה במקביל.
מנגנון הדליפה:
פעולות שרת הן פונקציות פנימיות. עם זאת, אם תוקף מבקש פעולת שרת לפי מזהה כערך (במקום להפעיל אותה), הסריאלייזר הפגיע מתייחס אליה כאובייקט נתונים. בכך, הוא מסריאלייז את גוף הפונקציה המורכבת כמחרוזת.
השפעה:
- חילוץ לוגי: תוקפים יכולים לקרוא את לוגיקת האימות האחורית שלך (
if (!user.isAdmin) ...). - גירוד סודי: מפתחות API קבועים או נקודות קצה פנימיות נחשפים.
- גילוי ממשק API של Shadow: פעולות שרת שאינן בשימוש או מוסתרות הופכות למטרות התקפה גלויות.
אימות מתקדם: גישת Penligent
בסביבה שבה ההימור גבוה, "לנסות להפיל את השרת" כדי להוכיח את קיומה של פגיעות אינו מקצועי ומסוכן. Penligent משתמשת ב-AI ניצול בטוח אסטרטגיות לאימות CVE אלה ללא זמן השבתה.
אסטרטגיה 1: בדיקת רקורסיה מוגבלת (Safe DoS)
במקום לולאה אינסופית, הסוכן המלאכותי Penligent AI Agent בונה מטען עם עומק רקורסיה סופי ($N=5000$).
- החללית: שרשרת Promise רקורסיבית שמסתיימת לאחר 5000 איטרציות.
- ניתוח היוריסטי:
- פגיע: השרת מעבד את השרשרת. Penligent מזהה סטיית חביון (לדוגמה, זמן תגובה = בסיס + 200 מילי-שניות) ועלייה זמנית בשימוש בערימה.
- מתוקן: מנגנון האבטחה החדש ב-React 19 זורק מיד שגיאת "Cyclic Reference" (הפניה מעגלית). התגובה היא כמעט מיידית (500 Internal Server Error).
- סיכום: אם זמן ההשהיה מתואם עם העומק ($T \propto N$), הפגיעות מאושרת מבלי לתלות את התהליך.
אסטרטגיה 2: פוזינג דיפרנציאלי עבור דליפות מקור (CVE-2025-55183)
כדי לאתר את פגיעות חשיפת קוד המקור:
- טביעת אצבע: Penligent מזהה מזהי פעולות שרת זמינים מחבילות לגיטימיות בצד הלקוח.
- הזרקה רפלקטיבית: הסוכן שולח בקשות טיסה ששונו בניסיון "להדהד" מזהים אלה כמאפייני נתונים.
- התאמת תבניות AI: זרם התגובה מנותח. אם ה-AI מזהה חתימות פונקציות JavaScript (לדוגמה,
פונקציה אסינכרונית $...,var _0x...) בתוך תגובת JSON, הוא מסמן דליפת מידע קריטי.

תוכנית הפעולה והתיקון של המהנדס
חלון ההזדמנות לניצול פתוח לרווחה. בוטים אוטומטיים כבר סורקים אחר מופעים חשופים של Next.js 15.0.x.
1. מטריצת השדרוג (אכיפה קפדנית)
עליך לוודא שעץ התלות שלך מתייחס לגרסאות הבטוחות. אל תסתמך על סימני semver (^) בלבד; בדוק את pnpm-lock.yaml או package-lock.json.
| חבילה | טווח פגיע | גרסה בטוחה (מינימום) |
|---|---|---|
| react-server-dom-webpack | < 19.0.3 | 19.0.3 |
| Next.js | 15.0.0 – 15.0.5 | 15.0.6+ (או 14.2.34+ עבור v14) |
2. עקיפת פתרון תלות
מכיוון ש react-server-dom-webpack הוא לעתים קרובות תלות מקוננת, עליך לכפות את ההחלטה ב- package.json כדי למנוע מגרסאות ישנות יותר להתגנב פנימה:
JSON
// package.json { "pnpm": { "overrides": { "react-server-dom-webpack": "19.0.3", "react-server-dom-turbopack": "19.0.3" } } }
3. אימות רציף
אבטחה אינה תיקון חד-פעמי. השתמש Penligent לפקח באופן רציף על הפריסה שלכם. עם הופעתן של עקיפות חדשות (כמו זו שנראתה ב-CVE-2025-67779), מודלי ה-AI של Penligent מתעדכנים כדי לבדוק את הווריאציות הללו, ומבטיחים שההיקף שלכם יישאר בלתי חדיר בפני מתקפות לוגיות מתפתחות.
הפניות וקישורים לסמכויות:
- הודעת אבטחה של React: מניעת שירות וחשיפת קוד מקור
- עדכון אבטחה רשמי של Next.js (דצמבר 2025)
- מסמכי Node.js: לולאת האירועים, טיימרים ו-process.nextTick()
- NIST NVD – CVE-2025-55184 פרטים


