Hosted Power biedt PHP-bescherming waar officiële patch ontbreekt
Terwijl de internationale IT-wereld zich opmaakt voor de officiële beveiligingsupdates rond de zogeheten 'php2shell'-kwetsbaarheden, waarschuwen experts dat een omvangrijke groep servers buiten de boot dreigt te vallen. De officiële herstelpatches van de PHP-ontwikkelaars zijn enkel voorzien voor ondersteunde versies (PHP 8.2 tot en me 8.5). Naar schatting draaien wereldwijd zo'n 884.000 aan het internet gekoppelde servers op oudere, niet-ondersteunde PHP-versies, waarvoor geen officiële updates meer verschijnen.
Om deze kwetsbare omgevingen te beschermen, heeft de Belgische managed hostingprovider Hosted Power op eigen initiatief een beveiligingsextensie ontwikkeld. CEO Jo Goossens en zijn team hebben het kwetsbare codepad geanalyseerd binnen alle PHP-broncodes van versie 5.6 tot en met 8.5 en dit vergeleken met beschikbare proof-of-concept-analyses. Op basis hiervan bouwden zij een gerichte patch die de problematische session upload-progress handler direct bij de opstart van PHP uitschakelt.
Open-source 'veiligheidsgordel' voor verouderde PHP-omgevingen
De ontwikkelde oplossing is uitgebracht als een compacte extensie van zo'n 60 regels code onder de naam php_uploadprogress_guard en is door Hosted Power als open-source software beschikbaar gesteld via GitHub.
In tegenstelling tot veelzijdige instellingen in het configuratiebestand php.ini kan deze oplossing niet door individuele websites of gebruikers worden omzeild, wat beheerders van grootschalige hostingomgevingen extra zekerheid biedt. Het Belgische bedrijf heeft de extensie inmiddels uitgerold op al zijn beheerde Debian-, cPanel- en DirectAdmin-servers.
Goossens benadrukt dat de eigen extensie moet worden gezien als een noodzakelijke veiligheidsgordel en niet als een volledige vervanging van de officiële patches. Omdat de exacte technische details van het lek pas later op de dag definitief bekend worden gemaakt door het PHP-coreteam, controleert het bedrijf de werking van hun extensie zodra de officiële advisories verschijnen.
Voor organisaties die gebonden zijn aan oudere PHP-omgevingen biedt het initiatief echter een cruciale eerste verdedigingslinie tegen mogelijke misbruikpogingen.
Update
Goossens meldt in een update: "Na de officiële advisories van vanmiddag hebben we versie 3 van de extensie uitgebracht. Op een typische PHP-FPM-hosting sluit die de aanvalsroutes die de advisories beschrijven vóór de applicatiecode start. De upload-parser draagt nu PHP's eigen hardening mee, zodat hij niet meer zonder geheugen kan vallen. De boodschap blijft dezelfde: een veiligheidsgordel. De officiële update (8.5.12, 8.4.27, 8.3.36, 8.2.35, of een backport van je leverancier) blijft de enige volledige oplossing."
Update 2
Versie 3.1 is nu uit. De extensie spiegelt nu de volledige officiële fix van PHP, onderdeel voor onderdeel, en niet alleen de upload-route. In onze tests per PHP-versie, van 5.6 tot en met 8.5, dekt ze daarmee de volledige gepubliceerde aanvalsketen af op een server die de update nog niet heeft. Ze herkent ook automatisch wanneer een server de officiële fix al heeft, ook de backports van leveranciers zoals Sury voor oudere PHP-versies, en stapt dan vanzelf opzij. De officiële update blijft de aanbevolen weg, maar wie die nog niet kan installeren, is nu veel beter beschermd.
Update 3
Versie 3.2.1 van de open-source PHP-module is nu uitgebracht. Die vangt de twee problemen op die sinds de noodpatch van woensdag opdoken, en waarvoor PHP nog geen release heeft:
De "incomplete patch": een use-after-free in unserialize() (https://github.com/php/php-src/issues/24481). Die zit in alle PHP-versies, ook in 8.5.12, 8.4.27, 8.3.36 en 8.2.35. Ze is alleen misbruikbaar als een applicatie unserialize() loslaat op invoer van buitenaf, of via code die al op de server draait. Er is nog geen CVE.
Een crash die de noodpatch zelf veroorzaakte: op 8.4.27 en 8.5.12 geeft SimpleXML zijn geheugen twee keer vrij, met "zend_mm_heap corrupted" en een gecrashte PHP-worker als gevolg (https://github.com/php/php-src/issues/24488). De fix is goedgekeurd, maar nog niet uitgebracht. Ontwikkelaars melden al kapotte productie-pipelines.
De module werkt op gepatchte én ongepatchte PHP, van 5.4 tot 8.5, zonder PHP opnieuw te bouwen. "We testten ze met Valgrind op alle vijf getroffen versies en met PHP's eigen testsuites. Ons advies: update PHP, en laat de module staan tot PHP zelf de fixes uitbrengt", aldus Goossens.