דלג לתוכן

PHP2Shell: שני פגמים קריטיים ב-PHP, ומה הם אומרים על ה-tenant שלכם ב-Microsoft 365

פורסם ב-23 באוקטובר 2026

ב-21 באוקטובר 2026 פרסם פרויקט PHP תיקונים לשתי פגיעויות קריטיות, ששתיהן מדורגות CVSS 9.2:

CVE מה משתבש
CVE-2026-109618 השחתת זיכרון כשבקשה מגיעה למגבלת הזיכרון, שמובילה להרצת קוד מרחוק
CVE-2026-109619 מצב שנשאר מבקשה קודמת נעשה בו שימוש חוזר בבקשה הבאה, מה שמוביל להרצת קוד מרחוק

הפרטים הודלפו יום לפני הפרסום, קוד הוכחת היתכנות (proof-of-concept) פומבי, וחוקרים מדווחים על ניסיונות ניצול נגד שרתים החשופים לאינטרנט. CERT-EU מעריך שניצול סביר. התייחסו לזה כאל דחוף.

כל התקנת PHP שמשרתת בקשות אינטרנט: PHP-FPM, Apache mod_php (הסיכון הגבוה ביותר, לפי צוות PHP), php-cgi, FrankenPHP ו-LiteSpeed. התקיפה עובדת לפני שמורץ קוד כלשהו של האפליקציה, ולכן אפליקציה כתובה היטב לא מגינה עליכם.

ענף PHP תוקן בגרסה
8.5 8.5.12
8.4 8.4.27
8.3 8.3.36
8.2 8.2.35
8.1 ומטה אין גרסה רשמית. שדרגו, השתמשו ב-backport של ספק, או בנו מקוד המקור עם תיקוני המקור של צוות PHP (7.4, 8.0, 8.1)

PHP נמצא לא פעם בתוך מוצרים שלא מפרסמים זאת: מערכות CMS כמו WordPress, פורטלים פנימיים, מערכות Help Desk, כלי ניטור ו-appliances. ה-NCSC ההולנדי מנהל רשימה של מוצרים שידוע שהם מכילים PHP (ראו מקורות).

  1. עדכנו את PHP לגרסה מתוקנת בכל שרת, החל בשרתים החשופים לאינטרנט. הפצות Linux קיבלו את התיקונים מראש; התקינו את החבילה המעודכנת של הספק שלכם.
  2. Azure App Service ב-Linux: Microsoft הפיצה את ה-images המובנים של PHP עם התיקון. ערוץ Latest מקבל תיקונים ראשון, Standard זמן קצר אחריו, ו-Extended אחרון. לאפליקציות החשופות לאינטרנט, עברו ל-Latest או ל-Standard (Configuration → Stack settings → Platform Release Channel). אשרו עם php --version בקונסולת ה-SSH של האפליקציה.
  3. Azure App Service ב-Windows: סביבות הריצה המובנות של PHP הגיעו לסוף חייהן (end-of-life) ולא יתוקנו. העבירו את האפליקציה ל-Linux, או הביאו סביבת PHP נתמכת משלכם.
  4. קונטיינרים וסביבות ריצה מותאמות: בנו מחדש את ה-images שלכם עם גרסת PHP מתוקנת. עדכון המארח לא מתקן את PHP בתוך קונטיינר.
  5. אי אפשר לעדכן היום? הציבו חומת אש ליישומי אינטרנט (WAF) לפני השרת והקטינו חשיפה. Microsoft מוסיפה כלל מנוהל ל-Azure Front Door WAF (ההפצה אמורה להסתיים עד 28 באוקטובר 2026) ופרסמה כלל זמני ל-Application Gateway. CERT-EU מפרט גם הגדרות PHP שמקטינות את הסיכון, כמו כיבוי session.upload_progress.enabled והקטנת post_max_size. האמצעים האלה עוזרים, אבל רק העדכון מתקן את הפגמים.

PHP2Shell אינו פגיעות ב-Microsoft 365. Entra ID ו-Exchange Online אינם מושפעים. הסיכון עקיף, וזה החלק שקל לפספס.

אפליקציות PHP רבות מתחברות ל-tenant שלכם: אתר ששולח מייל דרך Microsoft Graph, פורטל עם “Sign in with Microsoft”, או כלי שקורא משתמשים מ-Entra ID. האפליקציות האלה שומרות בדרך כלל client secret או תעודה של אפליקציית Entra בקובץ הגדרות על השרת. ברגע שתוקף שולט בשרת, הוא יכול לקרוא את ה-secret ולהשתמש בהרשאות האפליקציה מכל מקום, בלי שיעמוד בדרכו אתגר MFA או Conditional Access.

אם הרצתם אפליקציית PHP פגיעה שמתחברת ל-Microsoft 365:

  1. מצאו את רישומי האפליקציה (app registrations) שהיא משתמשת בהם. חפשו בקובצי ההגדרות של השרת את מזהה האפליקציה (client ID), ואז פתחו אותה ב-Entra admin center → App registrations.
  2. החליפו את האישורים שלה. צרו client secret או תעודה חדשים, פרסו אותם בשרת המעודכן, ואז מחקו את הישנים. עשו אותו דבר לכל סיסמה או מפתח API אחרים ששמורים בשרת.
  3. בדקו מה היא עשתה. ב-Entra admin center → Sign-in logs → Service principal sign-ins חפשו התחברויות של האפליקציה מכתובות IP לא צפויות מאז אמצע אוקטובר. בדקו ב-audit logs אילו שינויים היא ביצעה.
  4. צמצמו את ההרשאות שלה. אפליקציה ששולחת מייל בלבד לא צריכה Mail.ReadWrite לכל תיבות הדואר או Directory.ReadWrite.All. הסירו מה שהיא לא משתמשת בו, והגבילו גישה למייל לתיבות ספציפיות כשאפשר.

מצאו PHP במכשירים שלכם עם Microsoft Defender. אם השרתים שלכם מחוברים ל-Microsoft Defender for Endpoint, הריצו את השאילתה הזו ב-Advanced hunting. היא נבדקה על ידי מומחי האבטחה של Griffin31 ומציגה כל מכשיר עם כל סימן ל-PHP ב-30 הימים האחרונים: תוכנה מותקנת, תהליכים רצים, PHP שנטען בתוך שרת אינטרנט וקובצי PHP בדיסק. השוו את הגרסאות שהיא מוצאת לגרסאות המתוקנות למעלה.

// PHP in use: any device with ANY sign of PHP, last 30 days
let lookback = 30d;
let PhpExe = @"(?i)^php[\w.\-]*(\.exe)?$"; // php, php8.2, php-fpm8.3, php-cgi.exe, phpdbg
let PhpLib = @"(?i)^(libphp[\w.\-]*\.so|php\d*(ts)?\.dll|php\d*apache[\w.\-]*\.dll)$"; // PHP inside Apache/IIS
let Installed = DeviceTvmSoftwareInventory
| where SoftwareName has "php"
| project DeviceName, Signal = "Installed (inventory)", Detail = strcat(SoftwareName, " ", SoftwareVersion), Timestamp = datetime(null);
let Running = DeviceProcessEvents
| where Timestamp > ago(lookback)
| where FileName matches regex PhpExe or InitiatingProcessFileName matches regex PhpExe
| project DeviceName, Signal = "Running process", Detail = coalesce(FolderPath, FileName), Timestamp;
let Loaded = DeviceImageLoadEvents
| where Timestamp > ago(lookback)
| where FileName matches regex PhpLib
| project DeviceName, Signal = "Loaded in web server", Detail = strcat(InitiatingProcessFileName, " loads ", FileName), Timestamp;
let OnDisk = DeviceFileEvents
| where Timestamp > ago(lookback)
| where FileName =~ "php.ini" or FileName matches regex PhpExe or FileName matches regex PhpLib
| project DeviceName, Signal = "PHP files on disk", Detail = FolderPath, Timestamp;
union Installed, Running, Loaded, OnDisk
| summarize Signals = make_set(Signal), Details = make_set(Detail, 10), LastSeen = max(Timestamp) by DeviceName
| extend SignalCount = array_length(Signals)
| sort by SignalCount desc, LastSeen desc

Griffin31 בודקת את ההגדרות של Microsoft 365 שלכם, לא את שרתי האינטרנט, ולכן היא לא תדווח על גרסת PHP. היא מכסה את צד הזהויות באירוע הזה. אלה ההמלצות שכדאי לבדוק:

  1. Review unfamiliar or unneeded App Registrations: מצאו את האפליקציות שדרכן שרתי ה-PHP שלכם מתחברים, והסירו את אלה שאף אחד לא משתמש בהן.
  2. Application secrets approaching expiration: מראה אילו אפליקציות מחזיקות client secret, האישור שתוקף יכול לקרוא משרת שנפרץ.
  3. Application certificate maximum lifetime (180 days): תעודות קצרות טווח מגבילות את משך הזמן שבו אישור גנוב ממשיך לעבוד.
  4. Email notifications for vulnerabilities: Microsoft Defender שולח לכם מייל כשהוא מוצא פגם קריטי כמו זה במכשירים שלכם.