Štítekbezpečnost3

Pro PHP2Shell tu nic není

Ve středu vydalo PHP mimořádné opravy dvou chyb ve svém jádru, CVE-2026-109618 a CVE-2026-109619, kterým se dohromady říká PHP2Shell. Jediný požadavek od někoho, kdo se nikdy nepřihlásil, může stačit ke spuštění kódu na webovém serveru, a týká se to každé instalace PHP, která obsluhuje webové požadavky, ať na ní běží cokoli. Opravené verze jsou 8.5.12, 8.4.27, 8.3.36 a 8.2.35; cokoli staršího potřebuje opravu od dodavatele, nebo záplatu sestavenou ze zdrojů.

Web postavený na ./blog.sh nemá, do čeho by se trefila. Není v něm žádné PHP, za ním žádná databáze a před ním žádná administrace. Webový server rozdává soubory, které sestavení zapsalo předem: stránky, styl, rejstřík pro hledání, obrázky. Požadavek si může o jeden z nich říct a dostane ho, a to je všechno, co požadavek umí; nic na serveru se nespustí proto, že se někdo zeptal. Není to zabezpečení, na které si někdo vzpomněl. Je to to, co článek Postaveno záměrně pro jeden blog myslel větou „nic nepotřebuje bezpečnostní záplatu v úterý“. Tentokrát to byla středa.

Neznamená to, že nikdy nic nepotřebuje aktualizaci. Potřebuje ji webový server, který soubory rozdává, SSH, pokud píšeš z telefonu, a Ruby na stroji, kde se web sestavuje. Článek Co zbývá pokazit ten krátký seznam prochází. Je jen mnohem kratší než seznam celé sestavy s PHP a nic z něj tenhle týden nehořelo.

Číst dál

Dveře pro programy

Do 1.9 měl engine pro programy jedny dveře, a byly úzké. Telefon jimi doručil příspěvek: zkratka poslala soubor přes SSH, na druhé straně ho převzal receive.sh a odpověděl jedním objektem. Dva příkazy držely tenhle slib – add --json a publish --yes --json. Všechno ostatní byla obrazovka pro člověka: výpis, vlastnosti příspěvku, fronta, koš. Program, který se chtěl podívat, co je v archivu, neměl co zavolat.

1.10 otevírá dveře dokořán, a právě proto si dává záležet na tom, co jimi smí projít.

Každá obrazovka jako data

Každá obrazovka, kterou si člověk přečte, než něco udělá, a každá akce, kterou mu nabídne, má teď tvar --json: jeden objekt na standardním výstupu a nic jiného, každý klíč vždy přítomný. Odmítnutí je také objekt, {"ok": false, "error": "not_found", …}, a vrací nulu – návratový kód říká, jestli odpověď vůbec přišla, objekt říká, jaká byla. Program, který musí zkoušet, zda klíč existuje, si píše vlastní parser; tomu se tady předchází.

Číst dál

Co zbývá pokazit

Na tomto webu není /admin. Žádný přihlašovací formulář, na kterém by šlo zkoušet hesla, žádná relační cookie, kterou by šlo ukrást, žádný seznam pluginů, který by bylo nutné porovnávat s CVE z minulého měsíce – ne proto, že by je někdo podle kontrolního seznamu odstranil, ale proto, že nic z toho nikdy nevzniklo.

Architektonické poznámky enginu říkají zbytek bez obalu: model hrozeb je statický web bez vlastního serveru. Nic tu neposlouchá na žádném portu. Cílem nikdy nebylo zabezpečit složitý systém proti všemu, co se v něm může pokazit. Cílem bylo žádný takový systém nepotřebovat.

Seznam toho, co zbývá pokazit, je pak kratší než u běžného blogu – co nesou stránky, co leží v pracovním adresáři, a ta jediná věc, která vstupuje zvenčí.

Jediná věc, která vstupuje zvenčí

Psaní z telefonu znamená, že jedny dveře přece jen přijímají bajty z cizího zařízení: scripts/receive.sh, spuštěný jako vynucený příkaz SSH klíče. Neposlouchá nikde – žádný socket, žádný démon, jen klíč, který smí spustit přesně tento skript a nic jiného.

Číst dál