CVE-2025-55182 היא פגיעות קריטית המאפשרת הרצת קוד מרחוק לפני אימות ב-React Server , עם ציון CVSS של 10.0 – דירוג החומרה הגבוה ביותר האפשרי. במסגרת תוכנית המלגותOPSWAT , ערכו עמיתינו ניתוח טכני מקיף של פגיעות זו, ובחנו את הגורם השורשי שלה בפרוטוקול ה-deserialization של React Flight, את שרשרת הניצול המלאה ואת השפעתה הנרחבת על המערכת האקולוגית המודרנית של האינטרנט. בלוג זה מציג את ממצאינו לצד הנחיות מעשיות למגינים.

React הפכה לאחת מספריות ה-front-end הנפוצות ביותר בעולם, והיא עומדת בבסיס חלק ניכר mobile האינטרנט mobile המודרניים. סקרי מפתחים של Stack Overflow מדרגים את React באופן עקבי בין מסגרות האינטרנט המובילות, עם אימוץ העולה על 40% מהמפתחים המקצועיים ברחבי העולם. במקביל לצמיחה זו, צוות React הציג את React Server (RSC) כתכונה מרכזית ב-React 19 – שינוי פרדיגמה המעביר את לוגיקת הרינדור מהלקוח לשרת, ומאפשר ביצועים מיטביים ושילוב הדוק יותר בין קוד בצד השרת לקוד בצד הלקוח.
עם זאת, התפתחות ארכיטקטונית זו יצרה נקודת תורפה קריטית חדשה. ב-29 בנובמבר 2025, חוקר האבטחה לקלן דייווידסון דיווח על פגיעות בלוגיקת הפיכת הנתונים למבנה סריאלי בצד השרת של React לתוכנית Bug Bounty של Meta. הפגיעות, שפורסמה בפומבי ב-3 בדצמבר 2025 תחת המספר CVE-2025-55182, מאפשרת הרצת קוד מרחוק ללא אימות באמצעות בקשת HTTP אחת שתוכננה במיוחד. הפגיעות, המסווגת כ-CWE-502 (Deserialization of Untrusted Data), אינה דורשת אימות, אינטראקציה מצד המשתמש או תצורה מיוחדת של היישום – פריסת create-next-app ברירת המחדל, המיועדת לייצור, ניתנת לניצול מיידי.

ההשפעה הייתה מיידית וחמורה. בתוך 48 שעות מרגע החשיפה לציבור, נצפו מספר רב של מתקפות ניצול בשטח. על פי נתוני קרן Shadowserver, זוהו למעלה מ-77,000 כתובות IP ציבוריות כפגיעות פוטנציאליות. נתוני הטלמטריה של Cloudflare תיעדו יותר מ-582 מיליון ניסיונות ניצול בשבוע שלאחר החשיפה, עם עוצמת התקפה ממוצעת של יותר מ-3,500 כתובות IP ייחודיות בשעה ושיא של 16,585 כתובות IP תוקפות בו-זמנית. Wiz Research דיווחה כי 39% מסביבות הענן הכילו מופעים פגיעים. CISA הוסיפה את הפגיעות לקטלוג הפגיעות המנוצלות הידועות (KEV) שלה ב-5 בדצמבר 2025.
גורמי האיום פעלו במהירות ובמגוון מרשימים. Trend Micro תיעדה מספר קמפיינים – בהם קמפייני רשתות הבוטים "emerald" ו-"nuts" – שהפעילו משואות Cobalt Strike, שתלים מסוג Sliver, סוכן הניטור Nezha, מנהרות Fast Reverse Proxy (FRP) ומטען חדשני בשם "Secret-Hunter", שהפך לכלי נשק כלי איסוף אישורים בקוד פתוח כגון TruffleHog ו-Gitleaks. Google Threat Intelligence זיהתה אשכולות איומים מובהקים הקשורים לסין (UNC6600, UNC6586, UNC6588, UNC6603) שהפעילו כלים מיוחדים – כולל מנהרת ה-MINOCAT, תוכנת ההורדה SNOWLIGHT, דלת האחורית COMPOOD ודלת האחורית HISONIC – לצד גורמים הקשורים לאיראן וקבוצות המונעות משיקולים כלכליים המנהלות קמפיינים לכריית מטבעות קריפטוגרפיים. AWS תיעדה קבוצות הקשורות לסין המנסות קוד ניצול כבר ב-4 בדצמבר, לפני שקוד הוכחת היתכנות מלא היה זמין לציבור.
אודות Server ב-React
React היא ספריית JavaScript לבניית ממשקי משתמש, המתוחזקת על ידי Meta וקהילת קוד פתוח רחבה. React Server (RSC), שהוצגו עם React 19, מייצגים שינוי מהותי באופן שבו יישומים של React מטפלים בעיבוד. בניגוד לרכיבי לקוח מסורתיים, הפועלים כולם בדפדפן, רכיבי השרת פועלים בשרת, ומייצרים ייצוג סדרתי של ממשק המשתמש, המועבר ללקוח. תכנון זה מצמצם את כמות ה-JavaScript המועברת לדפדפן, משפר את מדדי זמן התגובה, ומאפשר גישה ישירה למשאבים בצד השרת, כגון מסדי נתונים ומערכות קבצים.

RSC מסתמך על פרוטוקול סריאליזציה מותאם אישית בשם "Flight" לצורך קידוד והעברת נתונים בין הלקוח לשרת. כאשר לקוח קורא Server (שכונתה בעבר " Server "), הדפדפן אורז את ארגומנטי הפונקציה לבקשת HTTP מובנית באמצעות פורמט Flight. השרת מבצע דה-סריאליזציה של מטען זה, מבצע את הפונקציה המבוקשת ומעביר את התוצאה בחזרה ללקוח. הצימוד ההדוק הזה בין הלקוח לשרת (למרות שהוא אלגנטי מבחינה ארכיטקטונית) פירושו שכל פגם בלוגיקת הדה-סריאליזציה עלול לגרום לתוצאות מיידיות וקטסטרופליות, כפי שמדגים CVE-2025-55182.
הפגיעות משפיעה לא רק על React עצמה, אלא על כל המערכת האקולוגית של המסגרות שנבנו עליה. Next.js (שקיבלה הודעה נפרדת, CVE-2025-66478, שנדחתה מאוחר יותר ככפילה), React Router, Waku, תוסף ה-RSC של Parcel, תוסף ה-RSC של Vite ו-RedwoodSDK כולם מושפעים. אפילו יישומים שאינם מגדירים במפורש Server עשויים להיות פגיעים אם תמיכה ב-RSC מופעלת במסגרת העבודה.
רקע טכני
לפני שנבחן את הפגיעות, יש לציין כי שלושה מושגים בסיסיים עומדים בבסיס שרשרת הניצול: התנהגות ה-await של JavaScript עם אובייקטים thenable, מעבר על שרשרת הפרוטוטיפים, ומודל הנתונים מבוסס-החלקים של פרוטוקול React Flight.
ה-await של JavaScript ואובייקטים הניתנים ל-Then
מפעיל ה-await מעכב את ביצועה של פונקציה אסינכרונית עד שהביטוי הממתין ייקבע. כאשר ה-await נתקל ב-Promise מקורי, הוא ממתין להשלמתו ומחזיר את הערך שהתקבל. עם זאת, ה-await אינו מחייב שימוש ב-Promise מקורי – כל אובייקט בעל שיטת .then(), המכונה "thenable", מטופל כמבנה הדומה ל-Promise.
כאשר `await` נתקל ב-`thenable`, הוא קורא לשיטת `.then()` של האובייקט, ומעביר לה פונקציות החזרה `resolve` ו-`reject` שמסופקות על ידי המערכת. הערך המועבר ל-`resolve` הופך לתוצאת ביטוי ה-`await`. חשוב לציין כי אם הערך שהוחזר הוא עצמו thenable, שיטת ה-.then() של אותו אובייקט מקונן נקראת באופן רקורסיבי עד שמגיעים לערך פרימיטיבי או ל-Promise שהושלם. התנהגות פתרון רקורסיבית זו היא מרכזית לניצול CVE-2025-55182.
מעבר על שרשרת אב טיפוס
כל אובייקט ב-JavaScript שומר על קישור פנימי לפרוטוטיפ שלו, הנגיש באמצעות המאפיין __proto__. כאשר מתבצע גישה למאפיין באובייקט, מנוע ה-JavaScript בודק תחילה את המאפיינים של האובייקט עצמו. אם המאפיין לא נמצא, המנוע עובר לאורך שרשרת הפרוטוטיפים — עולה לאורך כל קישור __proto__ — עד שהמאפיין נמצא או שהשרשרת מסתיימת ב-undefined.
תוקף יכול לנצל מנגנון ירושה זה כדי לגשת למאפיינים שמחוץ להיקף המיועד של אובייקט. על ידי שילוב __proto__ בנתיבי הגישה למאפיינים, תוקף יכול להגיע למתודות ולבוני-אובייקטים פנימיים שהיישום מעולם לא התכוון לחשוף. ב-JavaScript, הביטוי obj.__proto__.constructor.constructor מחזיר את בונה-האובייקטים הגלובלי Function, שיכול ליצור ולהפעיל פונקציות שרירותיות מתוך קלט מחרוזת.
פרוטוקול React Flight ומודל נתונים מבוסס-חלקים
When a client invokes a Server Function, the browser sends an HTTP POST request with a multipart/form-data body. Each form field contains a numbered “chunk” of serialized data. The Flight protocol uses special string prefixes to encode data types: $<id> references the resolved value of another chunk, $@<id> references the raw chunk object itself, $W<id> represents a Set, $K<id> represents FormData, and $B<id> triggers the blob handler.
הבה נבחן Server המוגדרת כך:

בקשת ה-HTTP המתאימה מכילה מספר שדות טופס, שכל אחד מהם מורכב ממפתח וערך: שדה 0 מכיל את מערך הארגומנטים עם הפניות כגון "$W1" ו- "$K2", בעוד ששדות 1 ו-2_* מכילים את הנתונים שאליהם מתייחסות הפניות אלה. השרת מעבד כל שדה עם הגעתו, ומאחסן תוצאות ביניים באובייקטים המכונים "chunks".

Chunk הוא אובייקט מסוג Thenable הכולל ארבע תכונות מרכזיות: status (מצב ההחלטה), value (הנתונים המאוחסנים), reason (מידע על השגיאה) ו-_response (הפניה לאחור לאובייקט התגובה האב). כאשר השרת נתקל ב-await chunk, מתבצעת קריאה לשיטת ה-.then() של ה-chunk. אם הסטטוס של ה-chunk הוא INITIALIZED, פונקציית ה-resolve callback מקבלת את chunk.value. אם הסטטוס הוא PENDING, BLOCKED או CYCLIC, פונקציות ה-callback מועברות לתור לביצוע מאוחר יותר.

Chunk 0 מייצג בדרך כלל את מערך הארגומנטים של Server שהופעלה. לאחר קבלת כל שדות הטופס ופתרון כל ההפניות הפנימיות, chunk_0.value מכיל את מערך הארגומנטים המורכב במלואו, אשר מועבר לאחר מכן לפונקציית היעד.
טיפול בבקשות מקצה לקצה (Next.js → פיענוח נתונים ב-React Flight)
להלן תיאור של האופן שבו Next.js מעבד בקשת Server נכנסת בתנאים רגילים, החל משכבת ה-HTTP ועד למנוע הפיענוח של React Flight.

הפונקציה handleAction() - Next.js
כאשר מתבצעת קריאה Server , הבקשה נכנסת לפונקציית `handleAction`. פונקציה זו מאמתת את המטא-נתונים, בודקת את הכותרות ואת אסימוני ה-CSRF, ומאשרת שהבקשה היא פעולת אחזור חוקית. לאחר מכן נוצר זרם בשם busboyStream כדי לנתח את גוף הטופס המורכב ממספר חלקים. הפונקציה decodeReplyFromBusboy מקשרת משדרי אירועים לזרם זה, ומפעילה את פונקציות הטיפול בפירוק הסדר ServerReact עם קבלת הנתונים הגולמיים. ערך ההחזרה של decodeReplyFromBusboy הוא chunk_0; האופרטור await פותר אותו ומעביר את הערך המורכב שלו Server שהופעלה.

הפונקציה getChunk מחזירה את ה-chunk המתאים למזהה נתון. אם ה-chunk הזה עדיין לא קיים, היא יוצרת ResolvedModelChunk (אם הנתונים כבר קיימים ב-response._formData) או PendingChunk (אם עדיין לא התקבלו נתונים עבור אותו מזהה).

כאשר decodeReplyFromBusboy מחזירה את chunk_0, ה-chunk עדיין נמצא במצב PENDING. אופרטור await קורא ל-chunk_0.then() ומאחסן באופן זמני את פונקציות ה-callback resolve ו-reject ב-chunk_0.value וב-chunk_0.reason. פונקציות ה-callback הללו מופעלות מחדש על ידי הפונקציה wakeChunk לאחר השלמת פתרון ההפניות.

תהליך ביטול הסידור - React Server
כאשר busboyStream מקבל שדה נתונים גולמי שלם, הוא מפעיל את משדר האירועים 'field', קורא לפונקציית resolveField ומתחיל את תהליך הפירוק – המרה של נתוני טופס גולמיים לאובייקטי JavaScript בנויים במלואם. הפונקציות הבאות מנהלות תהליך זה.
resolveField(תגובה, מפתח, ערך)

המפתח והערך מתווספים ל-response._formData. לאחר מכן, הפונקציה משיגה את ה-chunk המתאים ל-ID התואם למפתח. אם ה-chunk הזה כבר קיים, מתבצעת קריאה לפונקציית resolveModelChunk כדי לשחזר אותו. פתרון נדחה זה נחוץ מכיוון שערך עשוי להכיל הפניות לשדות שטרם התקבלו הנתונים הגולמיים שלהם; במקרה כזה, Server React Server PendingChunk עם פונקציות callback מותאמות אישית ל-resolve ו-reject, כדי לטפל בהפניות אלה בהמשך.
resolveModelChunk(chunk, value, id)

resolveModelChunk יוצר אובייקט ResolvedModelChunk במצב RESOLVED_MODEL ומזריק אליו את הנתונים הגולמיים. לאחר מכן, הוא משחזר את ה-chunk באמצעות initializeModelChunk וקורא לפונקציית wakeChunk כדי להפעיל את כל פונקציות ה-callback של resolve ו-reject שנמצאות בתור, ובכך משלים את תהליך ההחלטה לגבי האובייקט או ההפניה.
initializeModelChunk(chunk)

הפונקציה `initializeModelChunk` מעבירה את מצב ה-chunk למצב CYCLIC — המציין כי מתבצע פתרון הפניות — ומתחילה בתהליך הפיכת הנתונים למבנה. היא בונה אובייקט JavaScript גולמי מתוך `chunk.value` באמצעות `JSON.parse`, ולאחר מכן מעבירה אובייקט זה לפונקציית `reviveModel`.
reviveModel(תגובה, אובייקט-אב, מפתח-אב, ערך, הפניה)

הפונקציה reviveModel מעבדת באופן רקורסיבי כל רכיב בתוך האובייקט שנותח. כאשר היא נתקלת בערך מסוג מחרוזת, היא קוראת לפונקציה parseModelString כדי לטפל בו.
parseModelString(תגובה, אובייקט, מפתח, ערך, הפניה)

הפונקציה `parseModelString` מבצעת חלוקה לפי קידומת המחרוזת כדי לטפל בסוגים מקודדים שונים. עבור הפניות המתחילות ב-$, הפונקציה `getOutlinedModel` נקראת כדי לפתור את ההפניה בין-קטעים.
getOutlinedModel(תגובה, הפניה, אובייקט-אב, מפתח, מפה)

הפונקציה getOutlinedModel מחלקת את ההפניה לפי המפריד":" כדי ליצור נתיב גישה למאפיין, ולאחר מכן עוברת על נתיב זה באובייקט ה-chunk היעד כדי להחזיר את הערך המופנה. כפי שמפורט בניתוח הפגיעות להלן, היעדר אימות של שמות המאפיינים הללו הוא בדיוק הנקודה שבה קיימת הפגיעות.
ניתוח פגיעויות
הגורם השורשי
CVE-2025-55182 originates from insufficient input validation in the getOutlinedModel() function within React’s server-side Flight reply handler (ReactFlightReplyServer.js). When a chunk reference includes a property path - such as $<id>:<prop1>:<prop2> - the function resolves it by traversing the specified properties on the target chunk object, computing the result as chunk[prop1][prop2].

הפגם הקריטי הוא ששמות המאפיינים הללו אינם עוברים אימות לעולם. השרת אינו בודק אם המאפיינים המבוקשים הם מאפיינים של האובייקט עצמו או מאפייני אב טיפוס שעברו בירושה. לפיכך, תוקף יכול לכלול את __proto__ בנתיב המאפיין כדי לעבור על שרשרת האב טיפוס ולהגיע לשיטות פנימיות שאסור שיהיו נגישות מקלט הנשלט על ידי המשתמש. לדוגמה, ההפניה $1:__proto__:then מתפרשת כ-Chunk.prototype.then – פונקציה שהתוקף יכול להפעיל עם ארגומנטים בשליטתו.

קוד פגיע
שרשרת הניצול מנצלת שני מסלולי קוד נפרדים בלוגיקת הפיכת ה-Flight לנתונים ב-React.
הראשון הוא Chunk.prototype.then, הקובע כיצד מתנהגים החלקים (chunks) כ-thenables. כאשר מפעילים את `await` על חלק הנמצא במצב INITIALIZED, מתבצעת קריאה ל-resolve(chunk.value). אם chunk.value הוא עצמו thenable (אובייקט בעל שיטת .then() ), מפעיל אופרטור ה-await באופן רקורסיבי את chunk.value.then(). פתרון רקורסיבי זה הוא המנגנון שבאמצעותו תוקף מכוון את הביצוע לפונקציה שרירותית.
השני הוא מטפל הקידומת $B (blob) בתוך הפונקציה parseModelString():

במקרה $B, הפונקציה קוראת ל-response._formData.get(response._prefix + id). הן _formData.get והן _prefix הן תכונות של אובייקט ה-_response המאוחסן בתוך ה-chunk. על ידי שליטה בתכונות אלה באמצעות מעבר על שרשרת הפרוטוטיפים, תוקף יכול להפנות קריאה זו כך שתפעיל את בונה הפונקציות הגלובלי (Function constructor) עם קוד שרירותי כטיעון.
ניצול
Through prototype chain traversal, an attacker reaches the global Function constructor via the path <any_object>.constructor.constructor. Because Chunk.prototype.then is a function, the path $1:constructor:constructor resolves to the global Function constructor, which accepts a string and returns a callable function containing that code.

כדי להדגים את ההשפעה הפוטנציאלית בעולם האמיתי, החוקרים שלנו פיתחו מטען הוכחת היתכנות התואם לניתוח שתועד באופן עצמאי על ידי מספר צוותי מחקר בתחום האבטחה. הניצול פועל בשני שלבים:
שלב 1 - בניית ה"חתיכה" המדומה:
The object delivered in field 0 acts as a fake chunk. Its then property is set to Chunk.prototype.then via the reference path $1:__proto__:then, allowing the Flight deserialization engine to invoke prototype-level behavior on this attacker-constructed object. The _response._formData.get property is pointed at the global Function constructor via $1:constructor:constructor, and _response._prefix is set to the malicious JavaScript code. The value field contains the string {"then": "$B0"}, instructing the blob handler to invoke itself on the same chunk when resolved. The status field is set to resolved_model so that initializeModelChunk is triggered when .then() is called, causing value to be parsed and the blob handler to fire.
מכיוון שבשלב זה שדה 1 טרם התקבל, Server React יוצר Server פונקציות callback מסוג resolve ו-reject כדי לטפל בהפניה הממתינה.
שלב 2 – פתרון הגורם המפעיל:
ברגע ששדה 1 — המכיל את "$@0", הפניה גולמית לחתיכה 0 — מועבר, החתיכה הממתינה נפתרת ומצביעה ישירות על החתיכה המזויפת. פעולה זו מפעילה את `wakeChunk`, אשר מעבד את פונקציות ה-callback בתור ומתחיל במעבר על שרשרת האב-טיפוס במהלך פתרון ההפניות. ברגע שה-chunk המזויף נפתר במלואו, wakeChunk נקרא שוב. מכיוון שקריאת החזרה לפתרון עבור ה-chunk המזויף היא פונקציית הפתרון המרומזת של Node.js, היא קוראת לשיטת ה-.then() של ה-chunk ומפתרת את ערכו - ובסופו של דבר בונה ומבצעת את הקוד הזדוני שהוזרק באמצעות בונה הפונקציות (Function constructor).
הניצול המלא דורש בקשת HTTP אחת בלבד:

Replacing {{COMMAND}} with any JavaScript code executes it on the server. The reason: -1 field prevents a toString() error during processing. The Next-Action header may contain any arbitrary value - even x - because the vulnerable deserialization occurs before the server validates the requested Server Function. This is what makes the vulnerability pre-authentication: the payload is processed during the deserialization phase, before any application-level authentication or authorization logic is reached.
במקרה של ניצול מוצלח, התוקף זוכה להקשר ביצוע מלא של Node.js בשרת, כולל גישה ל-child_process לצורך ביצוע פקודות שורת פקודה, למשתני סביבה המכילים פרטי הזדהות למסד נתונים API , למערכת הקבצים המקומית, ולנקודות קצה של מטא-נתונים בענן המאפשרות תנועה רוחבית.
הוכחת קונספט
חברינו הצליחו לשחזר את הפגיעות בסביבה מעבדתית מבוקרת, באמצעות יישום Next.js סטנדרטי שנוצר באמצעות create-next-app ונבנה ליישום בייצור – ללא שינויים בתצורה המוגדרת כברירת מחדל. השחזור אישר כי מטען הניצול המבוסס על בקשה אחת, המתואר לעיל, מאפשר ביצוע קוד מרחוק באופן אמין.


ההדגמה המבוקרת הראתה שתוקף בעל גישה לרשת לשרת Next.js פגיע יכול להריץ קוד Node.js שרירותי – כולל יצירת מעטפת הפוכה (reverse shell) באמצעות child_process.exec(), קריאת משתני סביבה וגישה למערכת הקבצים המקומית – מבלי לספק אישורים כלשהם או להפעיל בדיקות אימות ברמת היישום. הערך השרירותי המקובל עבור כותרת Next-Action מאשר עוד יותר את אופי הפגם כפגום לפני אימות: השרת מעבד ומבצע דה-סריאליזציה של המטען לפני ביצוע כל חיפוש פעולה או בדיקת הרשאה.
הֲקָלָה
צוות React פרסם תיקונים ב-3 בדצמבר 2025 – באותו היום שבו נחשפה הפגיעות לציבור. הגרסאות המתוקנות זמינות כ-React 19.0.1, 19.1.2 ו-19.2.1. התיקון מוסיף אימות קפדני של מאפיינים ב-getOutlinedModel() וב-reviveModel(), וחוסם במפורש את פתרון המאפיינים של אב-טיפוס שעברו בירושה - כולל __proto__, constructor ו-prototype - מנתיבי הפניה הנשלטים על ידי המשתמש במטעני Flight.
על הארגונים לנקוט בצעדים הבאים באופן מיידי:
- שדרגו את חבילות React לגרסה שתוקנה (19.0.1, 19.1.2 או 19.2.1) על ידי הפעלת הפקודה npm install react-server-dom-webpack@latest, react-server-dom-parcel@latest או react-server-dom-turbopack@latest, לפי הצורך.
- שדרוג תלותי המסגרות - Next.js, React Router, Waku ומסגרות אחרות שנפגעו פרסמו תיקונים מתאימים. יש לעיין בהודעת צוות React לקבלת הנחיות לשדרוג עבור גרסאות ספציפיות.
- אל תסתמכו אך ורק על אמצעי ההגנה של ספקי האחסון – אמנם ספקים כמו Vercel יישמו כללי WAF זמניים לאחר חשיפת הפרצה, אך מדובר בצעדי חירום בלבד, והם אינם מהווים תחליף לתיקון החבילות הבסיסיות.
- בדקו את יומני השרת בחיפוש אחר בקשות POST הנושאות כותרות Next-Action עם גופי הודעה מסוג multipart/form-data המכילים תבניות $@ או __proto__, ועקבו אחר קריאות בלתי צפויות של child_process או execSync ביומני היישום.
הפחתת סיכונים באמצעות OPSWAT
OPSWAT , טכנולוגיה קניינית בפלטפורמת MetaDefender™, מספקת את השקיפות והשליטה הדרושות להגנה מפני פגיעויות כגון CVE-2025-55182. מכיוון שהפגם הזה נמצא בחבילות npm בקוד פתוח (react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack), על ארגונים לערוך תחילה רשימה מלאה של המקומות שבהם רכיבים אלה פרוסים בתשתית שלהם, לפני שניתן יהיה לבצע תיקון יעיל.

OPSWAT מייצר רשימה מקיפה של כל רכיבי התוכנה, הספריות, הקונטיינרים והתלות הנמצאים בשימוש. בעת סריקת יישומים או תמונות קונטיינר הכוללות חבילות React פגיעות, המערכת מסמנת אוטומטית את CVE-2025-55182 כ"קריטי" ומספקת הנחיות לגבי גרסאות מתוקנות זמינות, מה שמאפשר לצוותי האבטחה לקבוע סדרי עדיפויות ולתקן את הבעיה לפני שתתבצע ניצול.
OPSWAT זמין הן MetaDefender – לסריקת יישומים בודדים ותמונות קונטיינר – והן MetaDefender Software Chain™ – לשקיפות ברמת הצינור לאורך כל מחזור החיים של הפיתוח. יחד, הם מאפשרים לצוותי האבטחה:
- איתור מהיר של רכיבים פגיעים - זיהוי מיידי של היישומים והמכולות הכוללים את חבילות react-server-dom-* בגרסאות הפגיעות, כדי להבטיח שלא יוחמץ אף פריסה.
- הקפידו על התקנת תיקונים באופן יזום – עקבו באופן רציף אחר התלות בקוד פתוח כדי לאתר חבילות מיושנות או לא מאובטחות עם פרסום הודעות אבטחה חדשות, ובכך לצמצם את פרק הזמן שבו המערכת חשופה לסיכונים.
- שמירה על תאימות ושקיפות בשרשרת האספקה - עמידה בדרישות הרגולטוריות באמצעות ניהול תיעוד הניתן לביקורת של כל רכיבי התוכנה ונקודות התורפה הידועות שלהם.
המהירות וההיקף של ניצול הפגיעות CVE-2025-55182 – למעלה מ-582 מיליון ניסיונות כבר בשבוע הראשון בלבד – מדגישים מדוע תיקון תגובותי כבר אינו מספיק. הידיעה מה יש ברשותכם, היכן הוא פועל ומתי הוא הופך לפגיע היא הבסיס להגנה יזומה. נראות זו מתחילה ב-SBOM.
הפניות
- צוות React - פגיעות אבטחה קריטית Server של React
- Wiz Research - React2Shell (CVE-2025-55182): פגיעות קריטית ב-React
- Trend Micro - CVE-2025-55182: ניתוח React2Shell, תקיפת הוכחת היתכנות (PoC) של Chaos, וניצול בפועל
- Akamai - CVE-2025-55182: Server ב-React וב-Next.js – RCE כתוצאה מביטול סריאליזציה
- Google Cloud גורמים עוינים רבים מנצלים את React2Shell (CVE-2025-55182)
- AWS - קבוצות איום סייבר הקשורות לסין מנצלות במהירות את React2Shell
- NVD - CVE-2025-55182
- הבנת Server של React - טוני אליסאה
- MDN Web Docs - אופרטור await
- קוד המקור של React - ReactFlightReplyServer.js (גרסה 19.0.0)
- קוד המקור של Next.js - action-handler.ts (גרסה 16.0.0)
