Spouštění programů v PHP 6

Školení, která pořádám

V PHP 6 dojde k odstranění safe módu spolu se všemi souvisejícími direktivami včetně safe_mode_exec_dir.

Přestože se vždy snažím přímému spouštění programů z PHP vyhnout (nebo ho rovnou zakázat pomocí disable_functions=shell_exec, exec, system, passthru, popen, proc_open, pcntl_exec), tak chápu, že někdy to jinak jít nemusí. V tom případě přijde zmíněná direktiva k duhu, protože okruh spouštěných programů omezí jen na nezbytné minimum. Myslím, že se za to na vývojáře PHP snese vlna kritiky, a tato direktiva (byť třeba pod jiným jménem) se do PHP vrátí. Snad to bude ještě před vydáním ostré verze. Direktiva v PHP 6 možná zůstane.

Přijďte si o tomto tématu popovídat na školení Bezpečnost PHP aplikací (13.3.2018, Praha).

Jakub Vrána, Ze zákulisí, 23.3.2007, diskuse: 25 (nové: 0)

Diskuse

Jakub:

safe_mode a open_basedir jsou hlavne direktivy, ktere jsou spatnym pristupem k bezpecnosti. snad uz si to vyvojari uvedomili a pod tlakem mesice PHP chyb zmeni svou politiku a implementuji neco pouzitelnejsiho

ikona Jakub Vrána OpenID:

Direktiva safe_mode dobrá opravdu není. Naproti tomu k open_basedir mám jedinou výhradu - měla by být součástí už webového serveru a ne až skriptovacího jazyka. Ale vzhledem k tomu, že ve webových serverech taková direktiva není (vím, že existují moduly pro chroot, ale nejsou příliš rozšířené), tak jsem rád, že je alespoň v PHP.

ikona error414:

> Myslím, že se za to na vývojáře PHP snese vlna kritiky, a tato direktiva (byť třeba pod jiným jménem) se do PHP vrátí.

Takze to neni jiste? Ja jsem zacal pouzivat php scripty se scite. Je vnich pouzito i volani systemovych prikazu. To si delaji srandu ze to oddelaji.

ikona Jakub Vrána OpenID:

Momentálně se to jako jisté jeví. To ale neznamená, že se to pod patřičným tlakem nemůže změnit.

Aby nedošlo k nedorozumění - spouštění systémových programů zakázané nebude (pokud to nenastavím sám). Zmizí možnost omezit spouštění programů pouze z určitého adresáře.

ikona error414:

aha tak to jsem spatne pochopil.

Arnošt:

Nevím nevím, který hosting by nabízel php6 bez safe mode open base dir apod.

ikona Jakub Vrána OpenID:

safe_mode nepřináší nic dobrého, jenom svým názvem přivádí webhostery na scestí. open_basedir zachován zůstane.

Jakub:

existuji hostingy, co maji vypnuty safe_mode :-) bohuzel direktiva open_basedir je v soucasnosti tak derava, ze jeji pouziti je sice velmi dobre, ale pro zdatnejsiho utocnika neucinne :(

nick:

Nezbývá než doufat že v PHP6 bude důslednější.

BydP:

A z jakého důvodu 'safe_mode nepřináší nic dobrého'? Já si myslim, že je to jeden z hlavních důvodů proč webhostingy nabízejí PHP a nic jiného.

ikona Jakub Vrána OpenID:

Viz http://php.vrana.cz/bezpecnost-weboveho-serveru.php. safe_mode neumožňuje skriptům pracovat s jimi vytvořenými soubory, takže znemožňuje např. cachování do souborů nebo manipulaci s obrázky nahranými uživatelem. Naopak skriptům nahraným přes webové rozhraní dovoluje pracovat se stejně nahranými soubory všech uživatelů. open_basedir těmito neduhy netrpí.

Další vlastnosti safe_mode (omezení spouštění programů jen z určitého adresáře, zakázání změny doby maximálního běhu skriptu, přidání UID do realm autentizace) mohou být podle mého užitečné a jejich zrušení mi vadí - přimlouval bych se k jejich zachování (každou nastavitelnou pokud možno zvlášť).

BydP:

No, ale to není o funkci safe_mode, ale o nastavení serveru. Pokud má pro daný web apache i ftp stejného uid, tak to dělá přesně co má. A pak je to super.

ikona Jakub Vrána OpenID:

Problém nastává, když na serveru běží jeden Apache a PHP je v něm dostupné přes modul. A to je pokud vím nejběžnější konfigurace.

Pepa:

nestacilo by hodit prislusneho ftp uzivatele do skupiny ve ktere bezi webserver a pridelit ji na skripty a adresare prislusna prava?

Michal Illich:

To se mi nezdá - my máme safe_mode všude a cache generovanou přes PHP používáme...

ikona Jakub Vrána OpenID:

Je to možné za těchto okolností:

Webový server běží pod stejným uživatelem, kterému patří skripty. To může být zajištěno buď tím, že PHP běží jako FastCGI spouštěné pod daným uživatelem, nebo skripty patří skutečně stejnému uživateli, pod kterým běží webový server.

Nebo jsou soubory po zpracování webovým serverem převlastněny tomu, kdo je vytvořil.

Další možnost je, že se vygenerované soubory nenačítají přes PHP, ale servíruje je rovnou webový server (což je výkonnější, ale ne vždy možné).

karel:

> safe_mode neumožňuje skriptům pracovat s jimi vytvořenými soubory, takže znemožňuje např. cachování do souborů nebo manipulaci s obrázky nahranými uživatelem.

Co přesně tímhle tím myslíte? Na serveru mám safe_mode a cachování i manipulaci s obrázky uploadovanými uživateli bez problému používám.

ikona Jakub Vrána OpenID:

Nenapsal jsem to správně. safe_mode dovoluje pracovat i se soubory, které jsou v adresáři, jehož vlastník je stejný jako u spuštěného skriptu. Takže uvedené omezení by platilo pouze v případě, že bychom skriptem vytvářeli adresáře, do kterých bychom zapisovali soubory – s těmito by pak nešlo pracovat.

Naopak možnost pracovat s nahranými soubory jiných uživatelů zůstává – safe_mode kontroluje vlastníka souboru i jeho adresáře a spokojí se, když libovolný z nich je stejný jako u spuštěného skriptu.

Ondrej Ivanic:

To nie je dobre povedane, ide len o to ako to je nastavene a vacsinou je to nastavene zle. Safe mod sa da viazat na UID, alebo GID. V apache je moznostu su_exec-u, ale su to len zbytocne komplikacie a vyrabat kazdemu userovy UID, alebo GID je nezmysel. Bezpecnost tiez trpi, lebo vsetci uzivatelia maju ten isty UID/GID.

Co sa tyka pristupu k suborom, mozem ich tam dostat cez web (vtedy to bude ok), alebo cez FTP a vtedy nastane problem ak ma web a ftp server rozneho vlastnika a zalezi len na UID. Nastavenie rovnakeho UID pre web a FTP je vacsinou na hadku s adminom, okrem pripadu ze tym adminom som ja. Jedine rozumne je mat rovnaku skupinu (napr. www) do ktorej bude patrit web aj ftp server a overovanie safemodu na GID. potom je este dobre nastavit s-gid bit root adresary uzivatela.

tiez som rad ze safe mode ide prec, ale mozno (= je mi to jedno) uvital by som nieco ako open_exec_basedir

ikona Jakub Vrána OpenID:

Problém je, že když safe_mode nastavím příliš benevolentně (třeba všichni uživatelé ve stejné skupině jako webový server a safe_mode_gid), tak přijdu o jeho hlavní smysl a to sice ten, že si uživatelé nepolezou do zelí.

BydP:

výhoda je i to, že nemůžou spouštět všechny binárky - tudíž, že případný hacker nemůže zneužít chybu v nějákém programu na serveru. A už jenom kvůli tomu to má smysl. Další zneužívaná funkce je include($promena) ;)

ikona Jakub Vrána OpenID:

Já binární programy nespouštím, proto si mohu dovolit je zcela vypnout. Nicméně chápu, že je někdo může potřebovat, proto mi přijde zrušení safe_mode_exec_dir nerozumné. O tom je ostatně tento článek.

include se dá zneužít i se zapnutým safe_mode. K jeho omezení se hodí spíše allow_url_include a samozřejmě open_basedir.

Pepa:

Na to, ze si nepolezou do zeli tu mame prece open_basedir :)

ikona finc:

Když jsme u toho PHP6. Kdy se reálně počítá s vypuštěním této verze? Koukal jsem, že MySQL už ma v alfa verzi "MySQL native driver for PHP - mysqlnd". Ještě aby dochytali ten Falcon engine :)
Pokud chci spuštět programy z PHP, většinou to používám v projektech, které nejsou pouštěny přes klasické webhostingy, ale přes vlastnoručně nastavený server, takže si myslím, že ten strach je neoprávněný.

ikona Kalda:

Asi bych to viděl na tento patch: http://www.kyberdigi.cz/projects/execdir/
Předpokládám, že jeho vývoj bude pokračovat i v pro další verze PHP.

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.