Vágjunk bele:
A same origin policy egy modern böngészőkben implementált hozzáférés szabályozás, amely megakadályozza, hogy az egyik helyen lévő script egy másik helyen lévő dokumentumhoz férhessen hozzá. Ennélfogva nem lehetséges egy távoli helyről információt szerezni, vagy ott információt megváltoztatni. Ezen megkötés áthágásával természetesen sokáig kísérleteztek, az eredmények egyike az ún. Anti DNS-Pinning illetve az Anti-Anti-Anti DNS Pinning.
Érdemes tehát megnézni, hogy mi is tulajdonképpen maga a DNS Pinning. Ha valaki meglátogatja mondjuk a www.example.com weboldalt, a böngésző először egy DNS lookupot kell hogy végrehajtson, hogy megtudja a domainhez rendelt IP címet. A továbbiakban a böngésző az ezen az IP címen található géppel kommunikál.
Tegyük fel, hogy a DNS lookup eredménye szerint a www.example.com-hoz tartozó IP cím a 111.111.111.111! A böngésző által az oldalnak küldött kérés valahogy így nézhet ki:
Itt jön be a képbe a DNS Pinning. A böngésző úgy kísérli meg kivédeni az Anti DNS Pinninget, hogy az ablaka bezárásáig eltárolja a hostnév-IP párost, függetlenül a DNS szerveren beállított TTL-től. Az alábbi ábrán az a forgatókönyv látható, amely ellen a DNS pinning véd. Ebben az esetben a támadó a 222.222.222.222 IP című attacker.com-ot futtatja.
Teljes hozzáférése van ezen kívül a DNS bejegyzéshez is, melynek TTL-je 1 másodpercre van állítva. Az oldal megtekintésekor egy JavaScript töltődik be, amely utasítja a böngészőt, hogy 2 másodperc múlva kapcsolódjon újra a jelenlegi oldalhoz, majd a visszakapott adatokat töltse át egy másik, a támadó által irányított szerverre.
1) A felhasználó böngészője csatlakozik a www.attacker.com-hoz és DNS lekérdezést hajt végre, megkapva a 222.222.222.222-es IP címet 1 másodperces TTL-lel
2) Két másodperccel ez után a JavaScript utasítja a böngészőt, hogy kapcsolódjon újra a www.attacker.com-hoz (a TTL lejárt!)
3) Mivel a DNS már nem érvényes, a böngésző újabb DNS lookupot hajt végre
4) A DNS szerver azonban ezúttal 111.111.111.111-el válaszol, ami a www.example.com IP címe
5) A böngésző kapcsolódik a www.example.com-hoz, és egy ilyesmi fejlécet küld:
Érdemes észrevenni, hogy a host www.attacker.com-ra változott www.example.com helyett, valamint hogy eltűnt a süti. A cache-elt hostnév-IP párok segítségével a DNS Pinning megakadályozza az IP cím újbóli lekérését, és ezzel ellehetetleníti ez a támadást.
Anti DNS Pinning
2006. augusztus 14-én Martin Johns egy új ötlettel állt elő. Felfedezte, hogy a DNS Pinning csak akkor működik, ha a kérdéses webkiszolgáló online és elérhető. Ez azért érdekes, mert ha a kiszolgáló nem elérhető, új DNS lekérdeuzést kell végrehajtani, hogy kiderüljön, hogy valamilyen módon más helyre került-e a szerver. A támadó pedig bármikor "leállíthatja" a szerverét, és ezzel új DNS lookupra kényszerítheti a célpont böngészőt. Ábrával szemléltetve:
1) A felhasználó böngészője csatlakozik a www.attacker.com-hoz és DNS lekérdezést végez, melynek eredményeként a 222.222.222.222 IP címet kapja 1 másodperces TTL-lel.
2) Egy JavaScript két másodperc után újratölteti a böngészővel az oldalt. Ezután a szerver tűzfalazza magát.
3) Így a DNS Pinning nem működik, mivel a DNS bejegyzés érvényét vesztette (az adott IP címen nem található gép), a böngésző tehát újra a DNS kiszolgálóhoz fordul, hogy lekérdezze a www.attacker.com címét. (Gyönyörű :)
4) A támadó DNS szervere ezután a 111.111.111.111 címet adja vissza, ami természetesen a www.example.com címe.
5) A böngésző csatlakozik a 111.111.111.111-es című géphez, és a következő fejlécet küldi:
Mivel az IP megváltozott a támadó XMLHttpRequest parancsa most már egy másik weboldalt olvas (www.example.com), bár a böngésző azt hiszi, hogy ez az oldal még mindig ugyanaz. Emiatt került elő a cikk elején a same origin policy. Láthatjuk, hogy az Anti DNS Pinning segítségével áthághatjuk.
Azért van néhány dolog amit meg kell jegyeznünk. Először is, a host megint www.attacker.com-ra változott, és a sütik is elvesztek. Ezt figyelembe véve elgondolkozhatunk, hogy miért is használna bárki is Anti DNS Pinninget a www.example.com sima lekérdezése helyett.
Nos, az Anti DNS Pinning semmit sem segít a támadónak, hacsak nem intranetekről, vagy más IP cím alapú hozzáféréskorlátozással rendelkező célpontról beszélünk. Ekkor válik az Anti DNS Pinning igazán veszélyessé, mivel a www.example.com helyett az intranet.example.com-ot támadhatjuk, amelyet egy céges túzfal mögötti biztonságos zónának tartanak.
Nem csak adatokat olvashatunk a védett oldalakról, de akár CSRF támadást is intézhetünk az intraneten futó alkalmazások felé.
Anti Anti DNS Pinning
Természetesen megszületett a védekezés módszere is az Anti DNS Pinning ellen: ellenőrizni kell a fejléc Host részét, és csak azokat a biztonságos domainekre mutató kéréseket szabad engedélyezni.
Anti Anti Anti DNS Pinnging
Sajnos azonban a fejlécet több féle képpen is könnyedén lehet hamisítani, ezért az előző tehnika nem tűnik túlzottan hatékonynak. Amit Klein küldött egy üzenetet a Bugtraq-ra, melyben leírja, hogy hogyan lehet a fejlécet meghamisítani Internet Explorer alatt az XMLHttpRequest vagy Flash segítségével:
Ha az eddigiek nem voltak elég meggyőzőek, további érdekes példákat és működő scripteket találhatsz a következő helyeken:
ha.ckers.org
sla.ckers.org
Death by 1000 Cuts
Nos, nagyjából eddig tartott az eredeti cikk, remélem tanulságos volt. Próbáltam törekedni az érthetőségre és a szöveghűségre, de elképzelhető, hogy nem végeztem mindenhol tökéletes munkát, ezért elnézést kérek. A következő néhány napban belenyúlok egy kicsit a designba, és megpróbálom még áttekinthetőbbé tenni a posztot. Megjegyzéseket és építő jellegű kritikát most és ezentúl mindig a kommentek közé várok szeretettel.
Érdemes tehát megnézni, hogy mi is tulajdonképpen maga a DNS Pinning. Ha valaki meglátogatja mondjuk a www.example.com weboldalt, a böngésző először egy DNS lookupot kell hogy végrehajtson, hogy megtudja a domainhez rendelt IP címet. A továbbiakban a böngésző az ezen az IP címen található géppel kommunikál.
Tegyük fel, hogy a DNS lookup eredménye szerint a www.example.com-hoz tartozó IP cím a 111.111.111.111! A böngésző által az oldalnak küldött kérés valahogy így nézhet ki:
GET / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
Accept: */*
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: secret authentication token 12345
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
Accept: */*
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: secret authentication token 12345
Itt jön be a képbe a DNS Pinning. A böngésző úgy kísérli meg kivédeni az Anti DNS Pinninget, hogy az ablaka bezárásáig eltárolja a hostnév-IP párost, függetlenül a DNS szerveren beállított TTL-től. Az alábbi ábrán az a forgatókönyv látható, amely ellen a DNS pinning véd. Ebben az esetben a támadó a 222.222.222.222 IP című attacker.com-ot futtatja.
Teljes hozzáférése van ezen kívül a DNS bejegyzéshez is, melynek TTL-je 1 másodpercre van állítva. Az oldal megtekintésekor egy JavaScript töltődik be, amely utasítja a böngészőt, hogy 2 másodperc múlva kapcsolódjon újra a jelenlegi oldalhoz, majd a visszakapott adatokat töltse át egy másik, a támadó által irányított szerverre.
1) A felhasználó böngészője csatlakozik a www.attacker.com-hoz és DNS lekérdezést hajt végre, megkapva a 222.222.222.222-es IP címet 1 másodperces TTL-lel
2) Két másodperccel ez után a JavaScript utasítja a böngészőt, hogy kapcsolódjon újra a www.attacker.com-hoz (a TTL lejárt!)
3) Mivel a DNS már nem érvényes, a böngésző újabb DNS lookupot hajt végre
4) A DNS szerver azonban ezúttal 111.111.111.111-el válaszol, ami a www.example.com IP címe
5) A böngésző kapcsolódik a www.example.com-hoz, és egy ilyesmi fejlécet küld:
GET / HTTP/1.1
Host: www.attacker.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
Accept: */*
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Érdemes észrevenni, hogy a host www.attacker.com-ra változott www.example.com helyett, valamint hogy eltűnt a süti. A cache-elt hostnév-IP párok segítségével a DNS Pinning megakadályozza az IP cím újbóli lekérését, és ezzel ellehetetleníti ez a támadást.
Anti DNS Pinning
2006. augusztus 14-én Martin Johns egy új ötlettel állt elő. Felfedezte, hogy a DNS Pinning csak akkor működik, ha a kérdéses webkiszolgáló online és elérhető. Ez azért érdekes, mert ha a kiszolgáló nem elérhető, új DNS lekérdeuzést kell végrehajtani, hogy kiderüljön, hogy valamilyen módon más helyre került-e a szerver. A támadó pedig bármikor "leállíthatja" a szerverét, és ezzel új DNS lookupra kényszerítheti a célpont böngészőt. Ábrával szemléltetve:
1) A felhasználó böngészője csatlakozik a www.attacker.com-hoz és DNS lekérdezést végez, melynek eredményeként a 222.222.222.222 IP címet kapja 1 másodperces TTL-lel.
2) Egy JavaScript két másodperc után újratölteti a böngészővel az oldalt. Ezután a szerver tűzfalazza magát.
3) Így a DNS Pinning nem működik, mivel a DNS bejegyzés érvényét vesztette (az adott IP címen nem található gép), a böngésző tehát újra a DNS kiszolgálóhoz fordul, hogy lekérdezze a www.attacker.com címét. (Gyönyörű :)
4) A támadó DNS szervere ezután a 111.111.111.111 címet adja vissza, ami természetesen a www.example.com címe.
5) A böngésző csatlakozik a 111.111.111.111-es című géphez, és a következő fejlécet küldi:
GET / HTTP/1.1
Host: www.attacker.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
Accept: */*
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Mivel az IP megváltozott a támadó XMLHttpRequest parancsa most már egy másik weboldalt olvas (www.example.com), bár a böngésző azt hiszi, hogy ez az oldal még mindig ugyanaz. Emiatt került elő a cikk elején a same origin policy. Láthatjuk, hogy az Anti DNS Pinning segítségével áthághatjuk.
Azért van néhány dolog amit meg kell jegyeznünk. Először is, a host megint www.attacker.com-ra változott, és a sütik is elvesztek. Ezt figyelembe véve elgondolkozhatunk, hogy miért is használna bárki is Anti DNS Pinninget a www.example.com sima lekérdezése helyett.
Nos, az Anti DNS Pinning semmit sem segít a támadónak, hacsak nem intranetekről, vagy más IP cím alapú hozzáféréskorlátozással rendelkező célpontról beszélünk. Ekkor válik az Anti DNS Pinning igazán veszélyessé, mivel a www.example.com helyett az intranet.example.com-ot támadhatjuk, amelyet egy céges túzfal mögötti biztonságos zónának tartanak.
Nem csak adatokat olvashatunk a védett oldalakról, de akár CSRF támadást is intézhetünk az intraneten futó alkalmazások felé.
Anti Anti DNS Pinning
Természetesen megszületett a védekezés módszere is az Anti DNS Pinning ellen: ellenőrizni kell a fejléc Host részét, és csak azokat a biztonságos domainekre mutató kéréseket szabad engedélyezni.
Anti Anti Anti DNS Pinnging
Sajnos azonban a fejlécet több féle képpen is könnyedén lehet hamisítani, ezért az előző tehnika nem tűnik túlzottan hatékonynak. Amit Klein küldött egy üzenetet a Bugtraq-ra, melyben leírja, hogy hogyan lehet a fejlécet meghamisítani Internet Explorer alatt az XMLHttpRequest vagy Flash segítségével:
<*script>
var x = new ActiveXObject("Microsoft.XMLHTTP");
x.open(
"GET\thttp://attacker.com/\tHTTP/1.0\r\nHost:\twww.example.com
\r\n\r\n,
"http://www.attacker.com/",
false
);
x.send();
alert(x.responseText);
<*/script>
Ha az eddigiek nem voltak elég meggyőzőek, további érdekes példákat és működő scripteket találhatsz a következő helyeken:
ha.ckers.org
sla.ckers.org
Death by 1000 Cuts
Nos, nagyjából eddig tartott az eredeti cikk, remélem tanulságos volt. Próbáltam törekedni az érthetőségre és a szöveghűségre, de elképzelhető, hogy nem végeztem mindenhol tökéletes munkát, ezért elnézést kérek. A következő néhány napban belenyúlok egy kicsit a designba, és megpróbálom még áttekinthetőbbé tenni a posztot. Megjegyzéseket és építő jellegű kritikát most és ezentúl mindig a kommentek közé várok szeretettel.