Kort gezegd: FrankenPHP is een applicatieserver op basis van Caddy die PHP in zijn eigen programma inbedt. Voor de FrankenPHP beveiliging na PHP2Shell betekent dat: niet de PHP-pakketten van de distributie tellen, maar de PHP-versie in de FrankenPHP-binary of het containerimage. Bouw of haal een versie met gecorrigeerde PHP en herstart alle workers.
Waarom FrankenPHP anders wordt gepatcht
Bij klassieke opstellingen levert de distributie PHP als pakket en vervangt een update de bestanden. FrankenPHP daarentegen bevat PHP als ingebedde bibliotheek. Wie de officiële binary of een daarop gebaseerd containerimage gebruikt, krijgt PHP meegeleverd. Een apt upgrade op de host verandert daar niets aan.
PHP2Shell omvat CVE-2026-109618 en CVE-2026-109619, elk met CVSS v4.0 9.2. Het PHP-project noemt FrankenPHP uitdrukkelijk onder de getroffen uitvoeringsmodi. Verholpen zijn PHP 8.5.12, 8.4.27, 8.3.36 en 8.2.35. Beslissend is dus tegen welke PHP-versie uw FrankenPHP is gebouwd.
Workermodus en PHP2Shell
FrankenPHP kan toepassingen in de workermodus draaien. Daarbij wordt de toepassing eenmaal geladen en handelt ze daarna veel verzoeken achter elkaar af in hetzelfde proces. Dat levert snelheid op, maar verlengt de levensduur van elk proces.
CVE-2026-109619 beschrijft interne toestand van een verzoek die na het vrijgeven van het geheugen kan blijven bestaan; een later verzoek in dezelfde worker kan die gebruiken voordat ze wordt teruggezet. In de workermodus is het samenspel van veel verzoeken in één proces de normale situatie. Dat is geen reden om de workermodus te laten vallen, maar wel een duidelijke reden om updates en herstarts bijzonder zorgvuldig uit te voeren. Technische details vindt u onder CVE-2026-109619.
FrankenPHP beveiliging: versie controleren
Controleer de ingebedde PHP-versie rechtstreeks in het draaiende systeem. De volgende opdrachten lezen alleen; namen van diensten en containers zijn voorbeelden.
# Geïnstalleerde binary
frankenphp version
# In de draaiende container (containernaam als voorbeeld)
docker exec app frankenphp version
docker exec app php -v
# Welk image draait er werkelijk? (digest toont de exacte status)
docker inspect --format '{{.Image}} {{.Config.Image}}' app
Noteer de PHP-versie uit de uitvoer. Ligt die vóór de gecorrigeerde versies, dan is het systeem kwetsbaar. Controleer altijd de draaiende container, niet alleen het laatst gebouwde image, want een nieuw image werkt pas na vervanging van de containers.
Update doorvoeren en alle workers herstarten
Hoe de update eruitziet, hangt af van uw installatie:
- Binary op de host: nieuwe FrankenPHP-release met gecorrigeerde PHP-versie installeren, dienst herstarten.
- Container: basisimage met gecorrigeerde PHP-versie ophalen, eigen image opnieuw bouwen, zonder cache voor de basislaag, containers vervangen.
- Zelf gecompileerd: opnieuw bouwen tegen de gecorrigeerde PHP-versie, alle extensies met dezelfde versie opnieuw genereren.
# Voorbeeld hostinstallatie als systemd-dienst
systemctl restart frankenphp
# Voorbeeld Docker Compose: opnieuw bouwen zonder cache en containers vervangen
docker compose build --pull --no-cache
docker compose up -d --force-recreate
Controleer daarna opnieuw de PHP-versie in de draaiende container en de starttijd van de processen. In de workermodus moet elke worker zijn herstart. Bij Kubernetes gelden aanvullende stappen, beschreven onder PHP in Kubernetes patchen, voor containers in het algemeen onder PHP in Docker-containers patchen.
Een tag zoals latest of een hoofdversie in de imagenaam garandeert niet dat u de nieuwste versie hebt. Haal het basisimage actief opnieuw op en controleer daarna de PHP-versie in de draaiende container.
Overbruggingsmaatregelen en hardening
Kan de update niet meteen worden doorgevoerd, dan adviseert php.net overbruggingsmaatregelen die geen volledige bescherming bieden. Bij FrankenPHP stelt u de waarden in de php.ini in die FrankenPHP laadt, of via de PHP-instellingen in de Caddy-configuratie, niet via ini_set() in de toepassing.
; php.ini in de container of op de host
session.upload_progress.enabled = 0
post_max_size = 8M
upload_max_filesize = 6M
Met uploadfunctie noemt php.net post_max_size = 32M. Op PHP 8.5 komt fatal_error_backtraces=0 erbij. De geheugengrens hoort op containerniveau, bijvoorbeeld via de geheugenlimiet van de container, niet via RLIMIT_AS of RLIMIT_DATA. Herstart na elke wijziging alle workers.
Voor de langere termijn loont het images met een vaste digest te refereren, regelmatig geautomatiseerd opnieuw te bouwen en een imagescanner in de buildketen op te nemen. Een patch verwijdert bovendien geen schadelijke software die eerder is ingebracht. Bewaar logs vanaf 20-10-2026; bij containers betekent dat ze veiligstellen voordat u ze vervangt.
Wie FrankenPHP als statisch gebouwde binary gebruikt, moet weten dat daarin naast PHP ook alle extensies vast zijn ingebouwd. Een update betekent daarom altijd dat de hele binary wordt vervangen. Controleer na de vervanging de versie en de lijst van geladen extensies om te zien of alles beschikbaar is zoals voorheen, en test de toepassing voordat u de oude versie weggooit. In containeromgevingen is het aan te raden elk image te voorzien van de datum van de build. Zo kunt u altijd nagaan welke versie wanneer draaide en in geval van twijfel gericht teruggaan zonder opnieuw op een kwetsbare versie uit te komen. Leg de koppeling van image, PHP-versie en tijdstip vast in uw documentatie.
Hoe helpt PHP SOS concreet?
- Wij controleren welke PHP-versie werkelijk in uw FrankenPHP-binaries en draaiende containers zit.
- Via de PHP-patchservice bouwen we images opnieuw, vervangen we containers en herstarten we alle workers, met bewijs.
- Wij leggen logs vast vóór de vervanging en controleren de toepassing op sporen.
- Voor de langere termijn richten we geautomatiseerde rebuilds en imagecontroles in, in het kader van de serverhardening.
Veelgestelde vragen
Helpt een apt- of dnf-update bij FrankenPHP?
Alleen als FrankenPHP zelf uit die pakketbronnen komt en is gebouwd tegen de gepatchte PHP. Vaak zit PHP vast in de FrankenPHP-binary of in het containerimage. Dan moet u binary of image bijwerken.
Waarom is de workermodus bij PHP2Shell bijzonder belangrijk?
In de workermodus blijft de toepassing in het geheugen en handelt ze veel verzoeken achter elkaar af in hetzelfde proces. CVE-2026-109619 betreft juist interne toestand die tussen verzoeken in dezelfde worker kan blijven bestaan. Een herstart van alle workers na de update is daarom verplicht.
Hoe controleer ik welke PHP-versie in FrankenPHP zit?
De FrankenPHP-binary geeft bij het opvragen van de versie de ingebedde PHP-versie weer. In de container kunt u de opdracht uitvoeren via docker exec. Let erop de versie te controleren in de daadwerkelijk draaiende container, niet in het nieuw gebouwde image.
Zijn er voor FrankenPHP eigen overbruggingsmaatregelen?
De algemene aanwijzingen van php.net gelden. U stelt de waarden in de php.ini in die FrankenPHP laadt, of in de PHP-configuratie van het Caddy-bestand, niet via ini_set() in de toepassing. Herstart daarna alle workers.