PHP2Shell in Docker beheben: PHP-Container neu bauen
Kurz gesagt: Ein Container wird nicht automatisch aktualisiert, auch wenn der Server selbst Updates bekommt. Sie müssen das Image neu herunterladen bzw. neu bauen und den Container neu starten. Erst dann läuft das abgesicherte PHP.
Für wen ist diese Anleitung?
Für alle, deren Website oder Anwendung in Docker oder einer ähnlichen Container-Umgebung (Podman, Kubernetes) läuft. Typisch sind Images wie php, wordpress, nextcloud, phpmyadmin oder dunglas/frankenphp.
Sie sind nicht technisch, aber Ihr Dienstleister hat erwähnt, dass Ihre Anwendung „in Docker läuft“? Dann leiten Sie diese Seite weiter. Wichtig für Sie: Updates des Servers allein reichen hier nicht.
Warum Container gesondert aktualisiert werden müssen
Ein Container bringt sein eigenes PHP mit. Dieses PHP stammt aus dem Image, das beim Bauen festgelegt wurde. Ein laufender Container ändert sich nie von selbst. Auch ein Server-Update ändert nichts an dem PHP im Container.
Abgesichert sind PHP 8.5.12, 8.4.27, 8.3.36 oder 8.2.35.
Schritt 1: Welche Images enthalten PHP?
docker ps --format '{{.Names}}\t{{.Image}}'
Prüfen Sie für jeden Container mit PHP die laufende Version:
docker exec <containername> php -v
Achtung: Auch fertige Anwendungs-Images enthalten PHP, ohne dass „php“ im Namen steht, zum Beispiel wordpress, nextcloud, matomo, phpmyadmin oder Shop-Systeme.
Schritt 2: Image aktualisieren
Fertige Images ohne eigenes Dockerfile (z. B. wordpress:php8.3-apache):
docker compose pull
docker compose up -d
Eigene Images mit FROM php:8.3-fpm oder ähnlich im Dockerfile:
docker compose build --pull --no-cache
docker compose up -d
--pull sorgt dafür, dass das neueste Basis-Image geholt wird. Ohne diese Option baut Docker oft mit dem alten, zwischengespeicherten Image.
Fest eingetragene Versionen: Steht im Dockerfile eine exakte Version wie FROM php:8.3.20-fpm, ändern Sie sie auf php:8.3.36-fpm bzw. die passende abgesicherte Version Ihres Versionszweigs.
Kubernetes: Neues Image bauen und bereitstellen, z. B. per kubectl rollout restart deployment/<name>, wenn das Image-Tag gleich bleibt und imagePullPolicy: Always gesetzt ist.
Schritt 3: Prüfen, ob die neue Version läuft
docker exec <containername> php -v
Die Ausgabe muss eine abgesicherte Version zeigen. Prüfen Sie auch, ob alte Container noch laufen (docker ps), etwa auf einem zweiten Server.
Alte Images ohne Updates
Offizielle php-Images für 7.4, 8.0 und 8.1 werden nicht mehr aktualisiert. Ein Neubau hilft dann nicht. Sie müssen auf ein Image mit mindestens PHP 8.2 wechseln. Siehe alte PHP-Version.
Welche Risiken hat das PHP-Update?
Neubau mit derselben PHP-Version (z. B. 8.3.20 auf 8.3.36) ist risikoarm. Typische Stolpersteine:
- Andere Pakete ändern sich mit. Das Basis-Image enthält auch Betriebssystem-Pakete. Bei
--no-cachewerden zudem alle Schritte im Dockerfile neu ausgeführt, also auch Paketinstallationen undcomposer install. Deshalb können sich andere Bibliotheken mit ändern. - Fehlender Tag: Nutzt Ihr Dockerfile
php:latest, kann ein Neubau unbemerkt auf eine neue Hauptversion springen. - Kurze Unterbrechung, während der Container ersetzt wird.
- Daten im Container gehen verloren, wenn sie nicht in einem Volume liegen. Prüfen Sie vorher, wo Uploads und Datenbanken gespeichert sind.
Wechsel auf eine neue Hauptversion (z. B. php:7.4 auf php:8.2):
- Alter Programmcode kann Fehlerseiten auslösen oder einzelne Funktionen lahmlegen.
- Erweiterungen (
docker-php-ext-install …) müssen für die neue Version gebaut werden. Ältere PECL-Erweiterungen gibt es manchmal nicht für neue PHP-Versionen.
So senken Sie das Risiko:
- Altes Image markieren, damit Sie zurück können:
docker tag meinbild:aktuell meinbild:vor-update. - Volumes sichern, bevor Sie Container ersetzen.
- Erst in einer Testumgebung bauen und testen, dann in der Produktion.
- Feste Versionen verwenden, z. B.
php:8.3-fpmstattphp:latest. So kommen nur Sicherheitsupdates, keine Versionssprünge. - Notfallplan: Das markierte alte Image wieder starten. Nur als kurze Übergangslösung, denn es ist angreifbar.
Regelmäßig neu bauen
Richten Sie einen regelmäßigen Neubau ein, zum Beispiel wöchentlich in Ihrer CI-Pipeline oder mit Werkzeugen wie Renovate oder Dependabot. So kommen Sicherheitsupdates künftig automatisch an.
So prüfen Sie, ob es geklappt hat
Neben php -v im Container prüfen Sie die öffentlich erreichbare Website mit unserem kostenlosen Check. Viele Container senden den Header X-Powered-By mit der PHP-Version. Dann zeigt der Check die Version direkt an.
Fragen oder Probleme beim Update?
Sie sind unsicher, ob Ihre Website das Update verträgt, oder nach dem Update funktioniert etwas nicht mehr? Schreiben Sie uns. Wir sehen uns Ihre Website an und sagen Ihnen ehrlich, was zu tun ist, auch wenn Sie das Update am Ende selbst machen.