Stručně: Oficiální image PHP na Docker Hubu existuje v mnoha tagách, které kombinují verzi, variantu (například cli, fpm, apache) a základní systém. Tag je ukazatel, který se po nových sestaveních přesouvá na nové stavy; právě jeden stav označuje jen digest. Proti PHP2Shell potřebujete image s PHP 8.5.12, 8.4.27, 8.3.36 nebo 8.2.35, ověřený pomocí php -v, a na něm nové sestavení vlastních imagí.
Proč tag sám o sobě říká málo
Mnoho týmů napíše do svého Dockerfile řádek jako FROM php:8.3-fpm a pak na něj zapomene. Funguje to, dokud se nikdo neptá, jaká verze PHP vlastně běží. Od PHP2Shell se ptá každý.
Odpověď nestojí v Dockerfile. Tag jako 8.3-fpm ukazuje v okamžiku stažení na nejnovější stav této větve. Pokud byl image stažen před 21. říjnem a od té doby neobnoven, obsahuje zranitelnou verzi, ačkoli tag dnes ukazuje na opravený stav. Podle zásad Docker Official Images se image aktivně sestavují znovu, i při bezpečnostních opravách. Váš lokální stav se tím ale nedotkne.
Celý postup od nového sestavení po nově vytvořený kontejner popisuje Záplatování PHP v kontejnerech Docker. Zde jde o předběžnou otázku: Který image je správný a jak doložíte jeho stav?
Tagy image PHP Docker: jak jsou složeny
Tagy se skládají až ze tří částí. Docker Hub ukazuje příklady jako php:8.2-cli, php:8.2-fpm-alpine nebo php:8.4.27-zts-alpine3.24.
| Součást | Příklad | Význam |
|---|---|---|
| Údaj o verzi | 8.4.27 nebo 8.4 |
úplná verze zůstává u tohoto stavu, údaj o větvi se posouvá s novými záplatami |
| Varianta | cli, fpm, apache, zts |
provozní režim PHP v kontejneru |
| Základní systém | alpine3.24, bookworm, trixie |
podkladová verze Alpine nebo Debianu |
Varianty nejsou pro PHP2Shell rovnocenné. fpm provozuje PHP-FPM, apache provozuje PHP jako modul Apache, tedy mod_php. Tento provozní režim tým PHP hodnotí nejvýše, protože tam byl exploit předveden ještě předtím, než se vůbec spustí kód aplikace. Více v článku Proč je mod_php zvlášť ohrožen. Varianta cli je určena pro úlohy příkazové řádky.
I základní systém má důsledky. Image Alpine jsou malé, ale používají jinou knihovnu C než image Debianu; některá rozšíření nebo předkompilované knihovny se tam chovají jinak. Základní systém proto neměňte mimochodem při bezpečnostní aktualizaci, ale zůstaňte nejprve u toho, co vaše aplikace zná.
Důležité pro pochopení: V oficiálním image PHP nepochází z balíčků základní distribuce. Docker Hub popisuje, že zdrojové kódy PHP leží v image a rozšíření se vkládají pomocnými skripty jako docker-php-ext-install. Aktualizace balíčků základního systému ve vlastním Dockerfile proto na verzi PHP nic nemění. Rozhodující je jediné: na jakém stavu oficiálního image stavíte.
Tag, nebo digest: co se kdy mění
Digest je kontrolní součet obsahu image, zapisovaný jako sha256: s dlouhým řetězcem znaků. Mění se s každým novým sestavením. Proto se hodí jako důkaz: kdo zná digest, ví přesně, který stav běží.
V praxi se osvědčuje dělba práce:
- V Dockerfile použít tag větve, například
php:8.4-fpm, aby nové sestavení automaticky dostalo nejnovější záplatu této větve. - Při nasazení použít digest hotového vlastního image, aby bylo jednoznačné, co se dodává.
- V dokumentaci zachytit obojí: tag, digest a verzi ověřenou pomocí
php -v.
Kdo místo toho napevno zadá tag s plnou verzí, například 8.3.35-fpm, nikdy automaticky záplatu nedostane. To může být záměr, vyžaduje to ale proces, který tag zvýší při každém bezpečnostním oznámení.
PHP2Shell: ověřit image před nasazením
Následující příkazy stáhnou image a přečtou informace. Neovlivňují žádné běžící kontejnery.
# Stáhnout aktuální stav tagu větve
docker pull php:8.4-fpm
# Jaká verze PHP je v image?
docker run --rm php:8.4-fpm php -v
# Zobrazit digest staženého image
docker image inspect php:8.4-fpm --format '{{index .RepoDigests 0}}'
# Dotázat se na digest a platformy přímo v registru
docker buildx imagetools inspect php:8.4-fpm
Dotaz pomocí imagetools ukáže u image pro více platforem nadřazený digest a pod ním pro každou platformu, například linux/amd64 nebo linux/arm64, vlastní. Zdokumentujte digest, který vaše servery skutečně stahují, a mějte na paměti, že vývojářské počítače s jinou architekturou dostanou jiný digest platformy.
Pokud php -v neukazuje alespoň opravenou verzi dané větve, je image zastaralý nebo pochází z mezipaměti. Zkontrolujte pak, zda vaše prostředí nepoužívá zrcadlo registru, které dodává staré stavy.
Pro PHP 8.1 a starší projekt PHP už nevydává oficiální verze. Oficiální image těchto větví proto nemůže obsahovat řádnou opravenou verzi. Tagy, které se už neudržují, zůstávají podle zásad Dockeru dostupné, ale už se neaktualizují.
Image podle Docker Hubu obsahuje php.ini-development a php.ini-production a pro produkční provoz naléhavě doporučuje produkční verzi. Vlastní nastavení ukládejte jako soubor do $PHP_INI_DIR/conf.d/, i přechodné hodnoty od php.net.
Typické chyby při výběru image
- Varianta z návyku: Zvolí se varianta apache, protože se snadno spouští, přestože by bylo možné fpm s odděleným webovým serverem.
- Žádné nové sestavení vlastních imagí: Základní image je aktuální, aplikační image z něj sestavený ne.
- Přehlédnuté vícestupňové buildy: V Dockerfile s několika řádky
FROMse upraví jen jeden. - Zapomenuté vedlejší image: Workery, kontejnery cron a administrační nástroje používají vlastní tagy.
- Spoléhání jen na
latest: Tag neříká nic o větvi a variantě a může při nové hlavní větvi nečekaně skočit.
Jak nová sestavení automatizovat, aby zastaralý image vůbec nebyl dlouho v provozu, popisuje CI/CD: automaticky znovu sestavovat image PHP. Základy PHP v kontejnerech vysvětluje PHP v kontejnerech.
Jak konkrétně pomáhá PHP SOS?
- Zkontrolovat stav: Zjišťujeme, jaké tagy, digesty a verze PHP jsou ve vašich imagích a běžících kontejnerech.
- Posoudit variantu: Ověřujeme, zda je mod_php nutný, nebo zda riziko sníží fpm s odděleným webovým serverem.
- Znovu sestavit a doložit: S PHP Patch Service znovu sestavujeme image na opraveném základu a dokumentujeme tag, digest a verzi.
- Zakotvit proces: Dockerfily a nasazení nastavíme tak, aby další záplata dorazila plánovaně.
Časté dotazy
Jaký je rozdíl mezi tagem a digestem?
Tag jako php:8.4-fpm je název, který po každém novém sestavení může ukazovat na nový stav. Digest je kontrolní součet, který označuje právě jeden neměnný stav. Pro důkazy a reprodukovatelná nasazení je digest spolehlivějším údajem.
Který tag obsahuje opravu PHP2Shell?
Opraveny jsou PHP 8.5.12, 8.4.27, 8.3.36 a 8.2.35. Tag s úplným číslem verze ukazuje stav přímo. U kratších tagů jako 8.4-fpm po stažení ověřte pomocí php -v, jaká verze je skutečně obsažena.
Existuje zaplatovaný oficiální image pro PHP 8.1?
Projekt PHP pro 8.1 a starší už nevydává oficiální verze. Oficiální image těchto větví proto nemůže obsahovat řádnou opravenou verzi. Naplánujte přechod na podporovanou větev.
Je varianta apache rizikovější než fpm?
Varianta apache provozuje PHP jako modul Apache, tedy mod_php. Tento provozní režim tým PHP u PHP2Shell hodnotí nejvýše. Obě varianty potřebují aktualizaci; u mod_php je spěch obzvlášť na místě.