PHP2Shell: שני פגמים קריטיים ב-PHP, ומה הם אומרים על ה-tenant שלכם ב-Microsoft 365
פורסם ב-23 באוקטובר 2026
מה קרה
Section titled “מה קרה”ב-21 באוקטובר 2026 פרסם פרויקט PHP תיקונים לשתי פגיעויות קריטיות, ששתיהן מדורגות CVSS 9.2:
| CVE | מה משתבש |
|---|---|
| CVE-2026-109618 | השחתת זיכרון כשבקשה מגיעה למגבלת הזיכרון, שמובילה להרצת קוד מרחוק |
| CVE-2026-109619 | מצב שנשאר מבקשה קודמת נעשה בו שימוש חוזר בבקשה הבאה, מה שמוביל להרצת קוד מרחוק |
הפרטים הודלפו יום לפני הפרסום, קוד הוכחת היתכנות (proof-of-concept) פומבי, וחוקרים מדווחים על ניסיונות ניצול נגד שרתים החשופים לאינטרנט. CERT-EU מעריך שניצול סביר. התייחסו לזה כאל דחוף.
מי מושפע
Section titled “מי מושפע”כל התקנת 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 (ראו מקורות).
מה לעשות עכשיו
Section titled “מה לעשות עכשיו”- עדכנו את PHP לגרסה מתוקנת בכל שרת, החל בשרתים החשופים לאינטרנט. הפצות Linux קיבלו את התיקונים מראש; התקינו את החבילה המעודכנת של הספק שלכם.
- Azure App Service ב-Linux: Microsoft הפיצה את ה-images המובנים של PHP עם התיקון. ערוץ Latest מקבל תיקונים ראשון, Standard זמן קצר אחריו, ו-Extended אחרון. לאפליקציות החשופות לאינטרנט, עברו ל-Latest או ל-Standard (Configuration → Stack settings → Platform Release Channel). אשרו עם
php --versionבקונסולת ה-SSH של האפליקציה. - Azure App Service ב-Windows: סביבות הריצה המובנות של PHP הגיעו לסוף חייהן (end-of-life) ולא יתוקנו. העבירו את האפליקציה ל-Linux, או הביאו סביבת PHP נתמכת משלכם.
- קונטיינרים וסביבות ריצה מותאמות: בנו מחדש את ה-images שלכם עם גרסת PHP מתוקנת. עדכון המארח לא מתקן את PHP בתוך קונטיינר.
- אי אפשר לעדכן היום? הציבו חומת אש ליישומי אינטרנט (WAF) לפני השרת והקטינו חשיפה. Microsoft מוסיפה כלל מנוהל ל-Azure Front Door WAF (ההפצה אמורה להסתיים עד 28 באוקטובר 2026) ופרסמה כלל זמני ל-Application Gateway. CERT-EU מפרט גם הגדרות PHP שמקטינות את הסיכון, כמו כיבוי
session.upload_progress.enabledוהקטנתpost_max_size. האמצעים האלה עוזרים, אבל רק העדכון מתקן את הפגמים.
למה זה חשוב ל-Microsoft 365
Section titled “למה זה חשוב ל-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:
- מצאו את רישומי האפליקציה (app registrations) שהיא משתמשת בהם. חפשו בקובצי ההגדרות של השרת את מזהה האפליקציה (client ID), ואז פתחו אותה ב-Entra admin center → App registrations.
- החליפו את האישורים שלה. צרו client secret או תעודה חדשים, פרסו אותם בשרת המעודכן, ואז מחקו את הישנים. עשו אותו דבר לכל סיסמה או מפתח API אחרים ששמורים בשרת.
- בדקו מה היא עשתה. ב-Entra admin center → Sign-in logs → Service principal sign-ins חפשו התחברויות של האפליקציה מכתובות IP לא צפויות מאז אמצע אוקטובר. בדקו ב-audit logs אילו שינויים היא ביצעה.
- צמצמו את ההרשאות שלה. אפליקציה ששולחת מייל בלבד לא צריכה
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 dayslet lookback = 30d;let PhpExe = @"(?i)^php[\w.\-]*(\.exe)?$"; // php, php8.2, php-fpm8.3, php-cgi.exe, phpdbglet PhpLib = @"(?i)^(libphp[\w.\-]*\.so|php\d*(ts)?\.dll|php\d*apache[\w.\-]*\.dll)$"; // PHP inside Apache/IISlet 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 עוזרת
Section titled “איך Griffin31 עוזרת”Griffin31 בודקת את ההגדרות של Microsoft 365 שלכם, לא את שרתי האינטרנט, ולכן היא לא תדווח על גרסת PHP. היא מכסה את צד הזהויות באירוע הזה. אלה ההמלצות שכדאי לבדוק:
- Review unfamiliar or unneeded App Registrations: מצאו את האפליקציות שדרכן שרתי ה-PHP שלכם מתחברים, והסירו את אלה שאף אחד לא משתמש בהן.
- Application secrets approaching expiration: מראה אילו אפליקציות מחזיקות client secret, האישור שתוקף יכול לקרוא משרת שנפרץ.
- Application certificate maximum lifetime (180 days): תעודות קצרות טווח מגבילות את משך הזמן שבו אישור גנוב ממשיך לעבוד.
- Email notifications for vulnerabilities: Microsoft Defender שולח לכם מייל כשהוא מוצא פגם קריטי כמו זה במכשירים שלכם.
נסו את Griffin31
Section titled “נסו את Griffin31”מקורות
Section titled “מקורות”- CERT-EU Security Advisory 2026-018: Critical vulnerabilities in PHP
- PHP project security announcement
- PHP advisory GHSA-w8hw-w9fx-j79w (CVE-2026-109618)
- PHP advisory GHSA-6wmf-4rv5-p3rp (CVE-2026-109619)
- Microsoft: PHP critical security release on App Service for Linux
- Microsoft: PHP2Shell upgrade guidance and Azure WAF mitigations
- Microsoft: Azure WAF custom rules for PHP2Shell mitigation
- Canadian Centre for Cyber Security alert AL26-026
- NCSC-NL php2shell: products that embed PHP
