Griffin31
ENקביעת הדגמה
EN
בלוג

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

23 באוקטובר 2026

פגיעויות

שני פגמים קריטיים ב-PHP, שזכו לכינוי PHP2Shell, מאפשרים לתוקף להשתלט על שרת אינטרנט עם בקשה אחת שאינה דורשת אימות. עדכנו את PHP לגרסה 8.5.12, 8.4.27, 8.3.36 או 8.2.35 עכשיו. אחר כך בדקו למה השרת הזה היה יכול להגיע ב-Microsoft 365: אפליקציות PHP רבות מתחברות ל-Entra ID עם secret שמור, ושרת שנפרץ מדליף אותו.

מה קרה

ב-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.58.5.12
8.48.4.27
8.38.3.36
8.28.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. האמצעים האלה עוזרים, אבל רק העדכון מתקן את הפגמים.

למה זה חשוב ל-Microsoft 365

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 עוזרת

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 שולח לכם מייל כשהוא מוצא פגם קריטי כמו זה במכשירים שלכם.

רוצים לדעת אילו אפליקציות אצלכם מחזיקות secrets ששרת פרוץ יכול להדליף? Griffin31 בודק את רישומי האפליקציות, ה-secrets וההרשאות בטננט שלכם באופן רציף ומראה מה לתקן קודם.

מקורות