Podívejte se raději na online verzi přednášky, slajdy mohly být aktualizovány nebo doplněny.

Detail přednášky

Všechno je uživatelský vstup. Fakt, všechno, věřte mi.

Některý bezpečnostní chyby totiž nepotřebují CVE ídéčka, protože se vlastně nedají na nic použít. Myslím ty chyby, o těch se budeme bavit asi nejvíc. No, vlastně se dají použít na vytváření humoru, protože to S v „Security“ fakt neznamená „Serious“ a jestli si myslíte opak, tak na tuhle přednášku raději nechoďte. Budeme se totiž smát (nejčastěji sami sobě), až se budeme za sockety popadat. Kromě slz si z přednášky asi nic neodnesete, já jsem vás varoval.

Slajdy níže jsou hodně zkrácená verze přednášky, která nebyla nahrávána ani streamována, byla exkluzivní pro LinuxDays nejen jako poděkování pro všechny, kteří na mé přednášky chodí. Přednášku nebudu nikdy opakovat.

Detail přednášky na webu akce

Datum a akce

5. října 2019, LinuxDays 2019 (délka přednášky 20 minut, 9 slajdů)

Slajdy

Everything is User Input

#1 Co je to ten uživatelský vstup? Všechno, fakt, věřte mi.

Label: [<script>alert('XSS');</script>]

#2 V počítačovém oboru jsou jen dvě těžké věci: invalidace cache a pojmenovávání věcí, jak jednou prohlásil Phil Karlton. Já jsem to pojmenovávání vyřešil JavaScriptem. Pojmenujte to, pojmenujte tamto, všechno má mít nějaké jméno nebo název a já když nevím, tak píšu JavaScript. Přiznávám, že si tím ale vyrábím úplně jiné problémy.

The page at https://bitbucket.org says: XSS

#3 Bohužel, stále existují stránky, které ten můj JavaScript-as-a-Name spustí – jako např. Bitbucket v roce 2014. Tenhle problém jsem nahlásil, oni ho promptně opravili a jako poděkování mě zařadili do své Síně slávy.

<div><script>alert('XSS');</script></div>

#4 Takhle vypadalo jméno mého klíče, které se v nezměněné podobě vypsalo zpět do HTML, což je důvod, proč browser ten JavaScript spustil. Tento útok se jmenuje Cross-Site Scripting (XSS). Názvy, jména a vlastně všechny formulářová políčka jsou uživatelský vstup. A nejen to, uživatelským vstupem je třeba i registrační značka vozidla nebo název firmy.

Recently used devices: <script>alert(1);</script>

#5 Toto jsou má zařízení přihlášená k mému Google účtu (zkontrolujte si vaše zařízení). Vidíte tam něco podezřelého? Ano, i názvy zařízení jsou uživatelským vstupem. Takhle si jen tak mimochodem testuji služby, které používám a při vývoji vlastních služeb vám doporučuji to samé – nepoužívejte uživatelská jména jako test1, ale zkuste místo toho třeba ten JavaScript. Třeba nějakou chybu objevíte dřív než já.

On + ona = dítě

#6 Představte si, že mám child process. Jakpak se asi jmenuje, <script>alert('b4b33')</script>? Kdepak, to by bylo hloupé, jmenuje se Bobby, Little Bobby Tables' -- !!!, jak jinak. Jména lidí jsou také uživatelský vstup.

$_SERVER

#7 Pole $_SERVER v PHP je trochu zrádné. Půlka z těch hodnot v něm totiž pochází z klienta. Jako například HTTP hlavičky, jen se podívejte do výstupu z funkce phpinfo() (jen prosím její volání nedávejte do soubor info.php na produkční server) a všimněte si klíčů začínajících na HTTP_ – to jsou hlavičky z požadavku. Ale nejsou to jen hlavičky, uživatelským vstupem je dokonce i PHP_SELF. Berte to tak, že uživatelský vstup je všechno v poli $_SERVER.

Koukněte se na můj web v několika nástrojích, které zobrazují HTTP hlavičky z odpovědi serveru (jako např. developer tools ve vašem browseru nebo jakýkoliv online nástroj), určitě se vám budou líbit mé hlavičky Server a X-Powered-By. A taky mé DNS záznamy. V přednášce ukazuji k čemu se to dá použít.

Moat, high hard walls, limited entry points, guards check identity, watch towers

#8 Když budete navrhovat bezpečnost pro vaši aplikaci, tak si představte zámek. Vidíte tam těch několik vrstev obrany? Někdy se tomu říká „Defense in Depth“, někdy „Castle Approach“, ale v obou případech to znamená, že byste měli brát v potaz, že jedna vrstva selže a budete jich tedy potřebovat více. To jedno selhání by nemělo sundat celý systém. Pokud nepřátelská armáda překročí ten hradní příkop, tak je ještě čekají vysoké zdi, stráže a laserové střílny. V mé další přednášce vysvětluji „castle approach“ na XSS trochu více do detailů.

Jakub Vrána: Na konferenci http://devel.cz jsem přednášel o tom, jak v Google o programech dokazujeme, že nemají XSS a některé další zranitelnosti.

#9 Tento tweet od Jakuba Vrány se k tématu XSS pěkně hodí. Jakub pracuje pro Google a nedávno přednášel o tom, jak dokazují, že v kódu nemají XSS a nějaké další zranitelnosti: pokud vývojář použije nějaký nebezpečný (a tudíž zakázaný) přístup k DOMu nebo volání metody, tak se kód nezkompiluje. Ve světě PHP můžete použít nástroj PHPStan, statický analyzér od Ondřeje Mirtese, společně s mým rozšířením pro detekci zakázaných volání. Už nějakou dobu to tak používáme na Report URI.

Nerad bych se opakoval, ale prosím pamatujte, že všecko je uživatelský vstup.

Michal Špaček

Michal Špaček

Vyvíjím webové aplikace, zajímá mě jejich bezpečnost. Nebojím se o tom mluvit veřejně, hledám hranice tak, že je posouvám. Chci naučit webové vývojáře stavět bezpečnější a výkonnější weby a aplikace.

Veřejná školení

Zvu vás na následující školení, která pořádám a vedu:

Bezpečnost PHP aplikací
(prosinec 2019 Praha)

HTTPS pro vývojáře a správce
(prosinec 2019 Praha)