Hlavní navigace

JavaScript může přistoupit do vnitřní sítě a obejít same-origin policy

Petr Krčmář

Existuje způsob, jakým může být JavaScript na libovolném webu zneužit pro útok na vnitřní sít okolo uživatelova počítače. Dovoluje to slabina v mechanismu same-origin policy, který by tomu měl bránit.

Doba čtení: 5 minut

Sdílet

JavaScript je dnes jedním z nejpoužívanějších programových jazyků, protože ho najdeme na většině webových stránek. Aby nemohl uživateli jednoduše škodit, je svázán celou řadou přísných pravidel, která prosazuje samotný prohlížeč. Jedním z nich je i same-origin policy, což je mechanismus bránící jedné stránce k přístupu k datům jiných stránek.

Libovolná stránka si tak nemůže ve vašem prohlížeči procházet obsah stránky s vašim webmailem nebo posílat zprávy přes sociální síť, ke které jste přihlášení. Jsou to oddělené světy, které k sobě nemají přístup. Výjimku tvoří stránky, které leží na stejné doméně a používají stejný protokol i port (same origin = stejný původ). Je to logické: web může k vlastním datům.

Nic není dokonalé

Bohužel už se v praxi několikrát ukázalo, že tato pravidla nejsou dokonalá a lze je obejít. Příkladem může být například DNS rebinding. Zde popisovaná metoda umožňuje záškodnické stránce využít prohlížeče jako proxy a získat tak přístup k zařízením ve vnitřní síti. Ta může kontaktovat, zkoumat a v nejhorším případě zneužít bezpečnostní slabiny v nich a napadnout je.

Potíž je, že zmíněnou metodu same-origin policy nepokrývá a nebrání jí ani firewall na hranici sítě, protože počítač může obvykle kontaktovat své sousedy ve stejné síti. Pokud toho dokáže JavaScript přímo využít, může například v místní síti objevit router s výchozími přístupovými údaji, změnit jeho nastavení a unést provoz k útočníkovi.

Princip zneužití je zajímavý v tom, že obchází bariéry pomocí postranních kanálů. Nemůže přímo nahlédnout mimo svůj prostor, může ale sledovat jisté signály, které mu můžou načrtnout překvapivě přesný obraz světa za zdí.

Použitá metoda není nová, ale mimo bezpečnostní komunitu není příliš známá. Útočníci o ní samozřejmě vědí. Je proto důležité, aby i obránci věděli, že je něco takového možné. Podrobnosti zveřejnila na svém blogu společnost Forcepoint (plná zpráva v PDF).

Když jen vysíláte

Technika využívá faktu, že same-origin policy neomezuje vkládání objektů z cizích domén, ani odesílání požadavků na ně. Jen si JavaScript nedokáže přečíst odpověď, přístup k ní je mu zablokován. Výsledkem je tak jednosměrný přenos informací bez zpětné vazby. Vytvořený nástroj může těžko něco zkoumat, když nezíská zpětnou vazbu.

JavaScript ovšem umí generovat chybové hlášky, které jsou při zkoumání vnitřní sítě velmi užitečné. Útočnému skriptu pak stačí požadavky do sítě slepě odesílat a sledovat stav pomocí chybových hlášení. Nemusí mít přístup přímo k odpovědím.

Takto je možné v síti provést sken zařízení, projít otevřené porty a poznat na nich jednotlivé služby. Je také možné provádět omezený fingerprinting a zaměřit se pak na konkrétní napadnutelné zařízení. Výsledkem může například být, že úspěšně napadený router prozradí útočníkovi skutečnou IP adresu, přestože původně komunikoval uživatelův prohlížeč skrze síť Tor.

Skenování počítačů

V první řadě je možné zjistit místní IP adresu počítače, což útočníkovi pomůže v provádění dalších skenů ve správných rozsazích. Prakticky k tomu lze využít rozhraní WebRTC, jak ukazuje jednoduché demo na net.ipcalf.com. JavaScript pak může samozřejmě zjištěnou hodnotu odeslat do internetu útočníkovi.

Dále je možné ve vnitřní síti nalézt další funkční zařízení. Využít lze úspěšně to, že sítě obvykle využívají několik málo typických rozsahů jako 192.168.0.0/24, 192.168.1.0/24, 172.16.0.0/24 či 10.0.0.0/24. Využít lze také doménová jména jako mail, print, git, nas a podobně.

Útočníka ve skutečnosti nezajímají přímo cílová zařízení, ale služby na nich. Vytipované rozsahy proto prověří tak, že provede skenování portů. JavaScript sice nemůže nijak přímo přistupovat k cílovým portům a sledovat jejich stav, může se ale pokusit z daných adres stáhnout nějaký objekt – například obrázek.

Tady právě přichází na řadu už zmíněná chybová hlášení. Útočný skript naslepo odešle dotaz na skenovaný port a poté sleduje reakci prohlížeče. Pokud je vyvolána událost onerror nebo onload, je port pravděpodobně otevřený. Pokud je výsledkem timeout, považujeme port za zavřený. Takový sken není samozřejmě dokonalý a může docházet k falešné pozitivitě. Není ovšem potřeba zkoumat příliš mnoho portů, obvykle stačí 80, 443 a 8080, případně porty speciálních služeb jako 631 pro CUPS.

Výsledkem je seznam potenciálně zajímavých portů na objevených strojích. Takový seznam je opět možné snadno odeslat útočníkovi, který tak má k dispozici docela dobrý přehled o topologii sítě.

Objevení specifických služeb

Podobnou metodu je pak možné využít k identifikaci jednotlivých služeb. Provedeme při tom jakýsi fingerprinting pomocí souborů, které daná služba skutečně obsahuje. Pokud například lze na daném portu vyžádat soubor /images/jenkins.png nebo /images/cups-postscript-chain.png, získá útočník jasnou představu o použité službě.

Same-origin policy sice stále skript oslepuje, ale přesto se lze opět spolehnout na chybové stavy. Pokud načtení obrázku vyvolá událost onload, daný obrázek existuje. Pokud se naopak objeví onerror, obrázek načten nebyl. Pro úspěšnou detekci je samozřejmě potřeba mít databázi podobných obrázků běžně se vyskytujících v instalacích různých služeb. Na internetu jsou takové databáze už dostupné.

Výsledkem je seznam služeb, který může být opět triviálně odeslán do světa. Všimněte si, že se služby na doménách schodují se službami na některých IP adresách. Z toho lze usuzovat, že se jedná o stejná zařízení, jen objevená různými způsoby.

V takové situaci má útočník všechny informace a může nezabezpečenou aplikaci napadnout například pomocí cross-site request forgery či dalších podobných útoků. Pokud je nic netušící uživatel ke službě přihlášen, může prohlížeč známou nezabezpečenou službu naslepo ovládat.

Jak se bránit

K využití těchto a dalších nastíněných útoků nejsou potřeba žádné objevené chyby v kódu, stačí využití běžně dostupných javascriptových funkcí. Žádná snadná obrana v tuto chvíli neexistuje. Je na tvůrcích prohlížečů, aby zabránili JavaScriptu kontaktovat místní IP adresy – tedy ve směru zvenčí dovnitř. Mělo by být považováno za podezřelé, když se webová stránka načtená z veřejných zdrojů snaží kontaktovat místní IP adresy.

Obvykle se předpokládá, že počítače ve vnitřní uživatelské síti nemohou dostávat požadavky z internetu. Podle tvůrců zprávy ze společnosti Forcepoint pravděpodobně neexistuje legitimní důvod, proč by se takto měl prohlížeč chovat.

Před zneužitím podobných vlastností ale chrání především stále opakovaná pravidla: mějte záplatovaný software, i ve vnitřní síti používejte silná hesla, od kritických služeb se po jejich použití odhlašujte.