
באפריל 2025, Orange Cyberdefense גילתה פגיעות קריטית ב-Craft CMS במהלך חקירת תקרית, שכעת מסומנת כ- CVE-2025-32432 . הפגם מאפשר ביצוע קוד מרחוק (RCE) לא מאומת עם ציון חומרה מקסימלי של 10.0 (קריטי) ב-CVSS v3.1 על פי NVD (National Vulnerability Database).
כחלק מתוכנית המלגות לבוגרי אבטחת סייבר בתשתיות קריטיות OPSWAT , עמיתינו ערכו מחקר מקיף על פגיעות זו, כולל שחזור הניצול, אימות השפעתה, הערכת סיכונים ארגוניים וניתוח אסטרטגיות הגנה מומלצות.
בלוג זה מספק סקירה מעמיקה ומקיפה של CVE-2025-32432, מנתח את שורש הבעיה, זרימת הניצול וההשלכות האבטחתיות הרחבות יותר, תוך מתן הנחיות מעשיות לארגונים להתגונן מפני איום זה.
מבוא ל-CVE-2025-32432
CVE-2025-32432 משפיע על גרסאות 3.0.0-RC1 עד 3.9.14, 4.0.0-RC1 עד 4.14.14, ו-5.0.0-RC1 עד 5.6.16 של Craft CMS. הפגם, המסווג כ-CWE-94: הזרקת קוד, נובע מטיפול לא תקין בקלט לא אמין, מה שמאפשר בסופו של דבר RCE לא מאומת.

ניהול תוכן קראפט ומסגרת Yii
Craft CMS היא מערכת ניהול תוכן מודרנית המאפשרת למפתחים ולצוותי תוכן לבנות אתרים גמישים ומותאמים אישית לחלוטין, במקום להסתמך על תבניות נוקשות ומוגדרות מראש. עם אימוץ ביותר מ-46,000 אתרים ברחבי העולם, היא נמצאת בשימוש נרחב וגם במטרה תכופה עבור תוקפים המחפשים פגיעויות בעלות השפעה גבוהה.
Craft CMS בנוי על גבי Yii Framework , מסגרת PHP מהירה וחזקה שנועדה לפיתוח אתרים מודרני. Yii מספקת את המבנה והכלים המרכזיים, בעוד ש-Craft CMS מרחיב אותו כדי לספק מערכת ניהול תוכן גמישה.

אחת התכונות המרכזיות של מסגרת Yii היא הזרקת התלויות (DI) שלה. הזרקת התלויות היא תבנית עיצוב המספקת לרכיבים את המשאבים הדרושים להם, במקום לדרוש מהם לבנות את המשאבים הללו בעצמם. הזרקת התלויות של Yii גמישה מאוד, ומסוגלת לבנות אובייקטים מורכבים מכללי תצורה פשוטים יחסית.
עם זאת, גמישות זו מגיעה עם סיכון. במקרה של CVE-2025-32432, נעשה שימוש לרעה במכולת ה-DI בשילוב עם קלט משתמש לא מהימן, מה שיצר נתיב להרצת קוד מרחוק. מקרה זה מדגים שאפילו תכונות מסגרת בטוחות וחזקות עלולות להפוך למסוכנות אם הן משולבות ללא הבנה מלאה של השלכות האבטחה שלהן.
צלילה מעמיקה לתוך CVE-2025-32432
Craft CMS כולל תכונה בשם Image Transforms , שנועדה לייעל את הביצועים על ידי יצירת תמונות בגודל שונה ישירות בשרת. במקום לספק תמונה גדולה של 4.5 מגה-בייט להצגה כתמונה ממוזערת של 300×300, Craft CMS יוצר ומגיש אוטומטית גרסה קטנה יותר ומותאמת. גישה זו מפחיתה את ניצול רוחב הפס ומשפרת משמעותית את מהירות טעינת העמוד.
כדי להפוך פונקציונליות זו לזמינה באופן נרחב, Craft CMS חושף את נקודת הקצה actions/assets/generate-transform ללא צורך באימות. אמנם זה מבטיח שמשתמשים מאומתים ואנונימיים כאחד יוכלו ליהנות מתמונות אופטימליות, אך הוא גם מציג משטח תקיפה נגיש לציבור שבו כל אחד יכול לספק קלט מעוצב לאפליקציה.

באמצעות ניתוח מפורט של תהליך עבודה זה, עמיתינו זיהו כי המתודה AssetsController::actionGenerateTransform מופעלת בכל פעם שנשלחת בקשת POST לנקודת הקצה החשופה. פונקציה זו מאחזרת את פרמטר ה-handle ישירות מגוף הבקשה ומעבירה אותו במורד הזרם לעיבוד נוסף בשלב הבא.

בשלב הבא, נקראת המתודה ImageTransforms::normalizeTransform() . מתודה זו לוקחת את פרמטר ה-handle שסופק על ידי המשתמש וממירה אותו לאובייקט ImageTransform . מכיוון שהאובייקט נוצר ישירות מקלט לא מהימן, זה מייצג נקודת סיכון קריטית בזרימת הביצוע.

במהלך תהליך זה, כל זוגות המפתח-ערך מהמערך $transform הנשלט על ידי המשתמש (שמקורו בפרמטר handle) ממוזגים למערך תצורה. לאחר מכן, המתודה normalizeTransform מעבירה מערך זה ל- Craft::createObject() , האחראית על יצירת אובייקט ImageTransform חדש.

הפגיעות נובעת מהאופן שבו Craft::createObject() (עוטף את Yii::createObject() של Yii ) מעבד מערכי תצורה. מכיוון שמנגנון זה משתמש במכולת DI כדי ליצור מופעים ולקבוע תצורה של אובייקטים ישירות מהמערך הלא מאומת, תוקפים עלולים להשיג שליטה על תהליך בניית האובייקטים.

כאשר מועבר מטען זדוני, בנאי האובייקט (שהועבר בירושה ממחלקת Model ) מפעיל את המתודה App::configure() .

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

When App::configure() assigns properties from the attacker-controlled configuration array, most keys are mapped directly onto the object. However, if a key begins with the prefix as, the assignment is routed through Component::__set, Yii’s magic setter. This method interprets as <name> as an instruction to attach a behavior (mixin) to the object.
ניתן ליצור מטען זדוני אחד כזה כדי לנצל את האופן שבו Component::__set מעבד מאפיינים עם קידומת as , כגון exploit :

מהניתוח שלנו, המימוש של Component::__set כולל אמצעי הגנה: כאשר התנהגות מצורפת דרך מאפיין כזה, המסגרת מאמתת שהמחלקה שצוינה במערך התצורה היא תת-מחלקה תקפה של yii\base\Behavior . בדיקה זו נועדה למנוע צירוף מחלקות שרירותיות ישירות לרכיבים.

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

התוקף יכול ליצור מטען עבור התנהגות הניצול הכולל שני מפתחות:
- 'class' => '\craft\behaviors\FieldLayoutBehavior' - מחלקה לגיטימית שמרחיבה את yii\base\Behavior. ערך זה קיים אך ורק כדי לספק את בדיקת is_subclass_of ב-Component::__set, מה שמאפשר לביצוע להמשיך מבלי לגרום לשגיאה.
- '__class' => '\yii\rbac\PhpManager' - המטרה בפועל של התוקף. זוהי מחלקת ה"גאדג'ט" שהם רוצים ליצור.
כאשר הקוד מבוצע, Component::__set עובר את בדיקת האבטחה מכיוון שהוא בודק רק את מפתח המחלקה. עם זאת, כאשר ה-framework קורא מאוחר יותר ל-Yii::createObject כדי לצרף את ההתנהגות, הוא נותן עדיפות ל-__class, וכתוצאה מכך נוצר אובייקט \yii\rbac\PhpManager שבחר התוקף במקום זאת.
השימוש ב- \yii\rbac\PhpManager הוא מכוון. יצירת אובייקט בלבד אינה מספיקה לניצול; השגת RCE דורשת מחלקת גאדג'ט עם תופעות לוואי שניתן להפוך לנשק. PhpManager הוא מטרה נפוצה בהתקפות POI (PHP Object Injection) בגלל זרימת האתחול שלו. לאחר ההפעלה, המתודה init() קוראת ל- load() , אשר לאחר מכן מפעילה את loadFromFile($this->itemFile) . עם שליטה על $this->itemFile , תוקף יכול לאלץ את האפליקציה לטעון קובץ זדוני, ולהפוך יצירת אובייקט להרצת קוד.

הסכנה טמונה במתודה loadFromFile. ב-PHP, קוד requirement מבצע את קובץ היעד כקוד, כך שאם תוקף שולט בנתיב הקובץ, הוא יכול להפעיל ביצוע קוד שרירותי.
כדי להציב קוד זדוני בשרת, התוקף מנצל קבצי session של PHP . על ידי הזרקת PHP לפרמטר בקשה, Craft CMS שומר את המטען לקובץ session במהלך תהליך ההפניה. מאוחר יותר, כאשר PhpManager טוען קובץ זה, ניתן יהיה לבצע את קוד התוקף.

שרשרת ההתקפה המלאה פועלת בשלושה שלבים. ראשית, התוקף שותל PHP זדוני על ידי שליחת כתובת URL מעוצבת, אותה Craft CMS שומר בקובץ session. לאחר מכן, הוא מנצל את עקיפת __class בנקודת הקצה של transform image כדי לטעון את גאדג'ט PhpManager ולכוון אותו לעבר קובץ ה-session המורעל. לבסוף, כאשר PhpManager טוען את הקובץ, המטען של התוקף מבוצע, ומעניק RCE ושליטה מלאה בשרת - לעתים קרובות באמצעות webshell או reverse shell.



הפחתה ותיקון
כדי למתן ביעילות את הסיכונים הקשורים ל-CVE-2025-32432, ארגונים זקוקים לנראות ושליטה על רכיבי הקוד הפתוח שלהם. ללא מלאי ברור של רכיבים, תיקון קוד הופך לניחושים.
OPSWAT SBOM , טכנולוגיה קניינית בפלטפורמת MetaDefender® , עונה על צורך זה על ידי מתן רשימה של כל רכיבי התוכנה, הספריות, מכולות Docker והתלויות הנמצאות בשימוש. היא מאפשרת לארגונים לעקוב, לאבטח ולעדכן את הרכיבים שלהם באופן יזום.


בדוגמה לעיל, טכנולוגיית SBOM ב MetaDefender Core™ סרק את חבילת nginx-ingress-controller שהכילה את הפגיעות CVE-2025-32432. המערכת סימנה אוטומטית את הבעיה כקריטית וסיפקה הנחיות לגבי גרסאות מתוקנות זמינות, מה שאפשר לצוותים לתעדף ולתקן במהירות את הפגיעות לפני שניתן יהיה לנצל אותה.
OPSWAT SBOM זמין ב- MetaDefender Core וב- MetaDefender Software Supply Chain™ , ומאפשר לצוותי אבטחה לזהות ולפעול על פגיעויות מהר יותר . OPSWAT SBOM, צוותי אבטחה יכולים:
- איתור מהיר של רכיבים פגיעים - זהה באופן מיידי את רכיבי הקוד הפתוח שנפגעו מהתקפות ביטול סריאליזציה. זה מבטיח פעולה מהירה בתיקון או החלפת הספריות הפגיעות.
- ודא תיקון ועדכונים פרואקטיביים - ניטור רציף של רכיבי קוד פתוח באמצעות OPSWAT SBOM כדי להקדים את תהליכי ביטול הסידורים בנוגע לפגיעויות. OPSWAT SBOM יכול לזהות רכיבים מיושנים או לא מאובטחים, מה שמאפשר עדכונים בזמן והפחתת החשיפה להתקפות.
- לשמור על תאימות ודיווח – OPSWAT SBOM מסייעת לארגונים לעמוד בדרישות התאימות, כאשר מסגרות רגולטוריות מחייבות יותר ויותר שקיפות בשרשראות אספקה של תוכנה.
מוכנים לחזק את שרשרת האספקה של התוכנה שלכם מפני איומים מתפתחים?
