Apache (DELSI)
Michal Kubecek
mike na mk-sys.cz
Středa Říjen 27 12:17:50 CEST 2004
On Wed, Oct 27, 2004 at 10:54:01AM +0200, oldfrog.linux na volny.cz wrote:
> Uvedu podobne tri priklady. Nasledujici kod
>
> if ($authorized) {
> include "/highly/sensitive/data.php";
> }
>
> obsahuje stejnou chybu jako kod
>
> if ($_GET['authorized']) {
> include "/highly/sensitive/data.php";
> }
>
> Chyba spociva v tom, ze se program rozhoduje na zaklade hodnoty, kterou muze
> pripadne rucne zadat utocnik. V druhem prikladu muze hodnotu zadat utocnik
> vzdy
Problém je ale v tom, že to druhé nikdo nenapíše, protože je z toho na
první pohled vidět, že se jedná o hodnotu od uživatele. To první už jsem
několikrát viděl. Samozřejmě je chybou použít neinicializovanou
proměnnou, ale takové chyby lidé čas od času dělají. Málokdo má
error_reporting nastaveno na E_ALL (já ano), aby mu to hlásilo i takové
chyby jako právě použití neinicializované proměnné. Proto je původní
koncepce PHP (s automatickou registrací) velmi nebezpečná - umožňuje
totiž útočníkovi inicializovat jakoukoli proměnnou na jakoukoli hodnotu.
Přirovnal bych to k různým technikám ochrany proti buffer overflow, ať
už příznak nespustitelnosti u AMD64 nebo různé chytré třídy, které
hlídají přetečení mezí. Také by se dalo říci, že jsou všechny zbytečné,
protože je-li program napsán správně, žádný buffer overflow nemůže
vzniknout. Praxe nás ale opakovaně přesvědčuje, že chyby se dělají.
Michal Kubeček
Další informace o konferenci Linux