PHP - safe_mode


Návody pro C4


Safe mode je konfigurační direktiva PHP, může nabývat dvou hodnot - buď zapnuto nebo vypnuto. Základním smyslem zapnutého safe_mode je lepší zabezpečení sdíleného hostingového serveru. Hlavní změna při zapnutém safe mode spočívá v tom, že PHP při operacích se soubory (např. otevření souboru pro čtení) kontroluje vlastníka běžícího skriptu (vlastníkem skriptu se myslí vlastník souboru jakožto systémový uživatel), který chce operaci provést a vlastníka souboru (resp. vlastníka adresáře, který příslušný soubor obsahuje), na kterém má být operace vykonána. Pokud vlastníci neodpovídají, tak PHP neprovede požadovanou operaci a vypíše chybovou hlášku. Kromě výše uvedeného porovnávání vlastníků souborů, mění zapnutý safe_mode chování PHP v některých dalších ohledech, např. nelze použít pátý parametr funkce mail(), znemožňuje použití funkce set_time_limit() atd.

Safe mode a Webhosting C4

Na PHP 5 serverech hostingu Webhosting C4 je safe mode zapnutý (safe_mode = On), avšak operace se soubory fungují stejně, jako kdyby safe mode byl vypnutý. Při vytváření souborů (adresářů) v PHP, není nutné přes FTP přenastavovat práva k souborům (adresářům). Rovněž upload souborů funguje bez problémů (bez nutnosti nastavovat na adresář práva 0777). Dokladem toho je např. redakční systém Joomla, jehož instalace je na PHP 5 serveru naprosto bezproblémová a to včetně instalace komponent.

Zákazníci, jejichž doména je umístěna na PHP 4 serveru, mohou v souvislosti se zapnutým safe mode zaznamenat problémy. Doporučujeme přechod na PHP 5 server - je to zdarma, stačí o to požádat. Pomocí formuláře na zjištění web serveru můžete snadno zjstit, na kterém web serveru (PHP 4 nebo PHP 5) je vaše doména umístěna, domény nových zákazníků jsou automaticky dávány na PHP 5 server.

Na všech web serverech Webhostingu C4 je safe_mode zapnutý a není možné ho přenastavit do režimu vypnuto.

Bezpečnost hostingového serveru

Na sdíleném hostingovém serveru mají soubory jednotlivých domén odlišné vlastníky. Proto poskytuje safe_mode určitý stupeň ochrany, neboť znemožňuje, aby skript z jedné domény mohl manipulovat se soubory (např. je číst) umístěnými v jiné doméně (jiného zákazníka). Safe mode není jediná konfigurační direktiva, která ovlivňuje bezpečnostní situaci na serveru, příkladem další takové direktivy je direktiva open_basedir.

Proč je vypnutý safe_mode nebezpečný?

Některé hostingové servery mají safe mode vypnutý (safe_mode = Off) nebo ho běžně na požádání vypínají. Je pravda, že vypnutý safe mode sám o sobě automaticky neznamená prolomení bezpečnostní ochrany, nicméně tvrdíme, že zapnutý safe mode může za určitých okolností znemožnit útok na server a ochránit zákazníky hostingových služeb před tím, aby útočník procházel jejich skripty nebo měnil údaje v databázích apod. Pojďme si to demonstrovat na konkrétním příkladu.

PHP je na webhostingových serverech často provozováno jako modul do web serveru Apache. Nastavení PHP je dáno hodnotami konfiguračních direktiv, které jsou umístěny jednak v globálním konfiguračním souboru php.ini a v konfiguračním souboru web serveru httpd.conf (v httpd.conf je možné nastavit hodnoty direktiv pro každý web samostatně). Předpokládejme, že v souboru php.ini jsou hodnoty direktiv safe_mode a open_basedir nastaveny takto:

safe_mode = Off
open_basedir =

Direktiva open_basedir obsahuje seznam adresářů, ve kterých je povolené dělat operace se soubory (číst ze souboru, upravit obsah souboru, apod.). Hodnotou direktivy open_basedir je obvykle cesta ke kořenovému (hlavnímu) adresáři webu, např. /www-data/www.evix.cz (pro web www.evix.cz). Vzhledem k tomu, že direktiva open_basedir má pro každý web odlišnou hodnotu (každý web má jinou cestu ke kořenovému adresáři), tak se hodnota direktivy open_basedir nastavuje v konfiguračním souboru web serveru httpd.conf - v části, která je určená pro konfiguraci příslušného webu:

<VirtualHost 192.168.100.112:80>
  ServerName www.evix.cz
  php_admin_value open_basedir /www-data/www.evix.cz

  ...

</VirtualHost>

Maksymilian Arciemowicz zveřejnil 9.9.2006 kritickou chybu ve funkci ini_restore() (pro PHP ve verzi 5.1.6 / 4.4.4) známou též jako CVE-2006-4625. Funkce ini_restore() má jeden parametr - název konfigurační direktivy a dle dokumentace obnovuje hodnotu konfigurační direktivy podle nastavení v konfiguračních souborech (php.ini a httpd.conf). Chyba se v našem případě projeví tak, že funkce ini_restore() bere v úvahu pouze hodnoty v php.ini a nastavení v httpd.conf ignoruje. Představme si, že na webu www.evix.cz je umístěn jednoduchý PHP skript:

<?php

ini_restore("open_basedir");
echo ini_get("open_basedir");

?>

Skript by měl vypsat /www-data/www.evix.cz (funkce ini_get() vrací nastavení konfigurační direktivy). Pokud ale PHP obsahuje výše zmíněnou chybu ve funkci ini_restore(), tak skript nevypíše nic, protože ini_restore nastaví open_basedir na prázdnou hodnotu (tj. na stejnou hodnotu jako v php.ini). Pokud je open_basedir nastaveno na prázdnou hodnotu, tak PHP skripty nemají žádné omezení na adresáře, ve kterých mohou manipulovat se soubory. Vzhledem k tomu, že safe_mode je vypnutý (v php.ini), nic nebrání k přístupu k systémovým souborům nebo souborům umístěných na jiných webech. Útočník to snadno zneužije:

<?php

ini_restore("open_basedir");
echo file_get_contents("/etc/passwd");

?>

Uvedený skript vypíše obsah systémového souboru /etc/passwd. Kromě toho může útočník procházet skripty jiných zákazníků, zjistit z nich hesla k databázím a následně modifikovat obsah databází. Jak vidíte sami, následky případného zneužití jsou pro sdílený hostingový server katastrofické. A přitom by stačilo (v tomto případě), aby v php.ini bylo safe_mode = On.

Month of PHP Bugs (MOPB)

Uvedená chyba je pouze jedna z velmi mnoha chyb, které se v PHP vyskytovaly, resp. vyskytují. Jako příklad za všechny uveďme tzv. Month of PHP Bugs (přeloženo: měsíc chyb v PHP) nebo též zkráceně MOPB. Stefan Essner zveřejňoval v průběhu měsíce března 2007 bezpečnostní chyby v PHP (u chyb, kde to mělo smysl, byly zveřejněny i expolity - PHP skripty umožňující jejich zneužití). Cílem jeho aktivity bylo upozornit na špatnou bezpečnostní situaci v PHP. Byly uveřejněny chyby od těch méně závažných (např. XSS chyba v phpinfo()) až po kritické chyby (např. MOPB-01-2007), které umožňují spouštět libovolný kód na serveru (ještě horší chyba než ini_restore() chyba, kterou jsme demonstrovali výše). Dodejme, že velkou část chyb bylo možné zneužít v tehdy aktuální verzi PHP a některé chyby nejsou v PHP opraveny dodnes (24.9.2007), tj. půl roku po zveřejnění.

Závěr

Zapnutý safe mode rozhodně není všelék, který vyřeší bezpečnost na hostingovém serveru. Nicméně je to jedna z bariér, která může útočníkovi znemožnit úspěšný útok na server. Bezpečnost je pro Webhosting C4 maximální prioritou, proto je safe_mode na všech web serverech zapnutý a nelze ho vypnout. Chceme zdůraznit, že na PHP 5 serverech je PHP nakonfigurováno tak, že zapnutý safe_mode nemá obvyklé negativní účinky - upload souborů a operace se soubory (včetně vytváření adresářů) fungují naprosto bez problémů, není nutné přenastavovat práva na adresářích. Instalace redakčních systémů je rovněž bezproblémová.

Související odkazy

Diskuzní fórum pro článek PHP - safe_mode

Nové diskuzní téma můžete založit v sekci PHP, MySQL.

Změny a kontroly

K dispozici je kompletní přehled všech změn a kontrol v tomto návodu.


Diskuzní fórum
  • Webové aplikace
  • Tvorba web stránek
  • PHP, MySQL

forum.c4.cz