Asi málokoho překvapí fakt, že drtivá většina informací se po síti sítí přenáší pomocí protokolu TCP. Tento protokol je poměrně starý, jeho popis se objevil v RFC-793, které je z roku 1981. Možná o to víc překvapí sdělení, že tento protokol není zcela odolný vůči útoku a že se o tom již dlouho ví. Oficiální jméno útoku, s jehož pomocí lze přerušit libovolnou TCP relaci, je TCP reset attack, a byl popsán už v mnoha článcích zabývajících se bezpečností síťových protokolů.
V čem je vlastně nebezpečný? Z pohledu běžného uživatele Internetu se nezdá být tento útok příliš zajímavý, protože pokud mu někdo přeruší stahování obrázku z WWW stránek, prostě jen pokrčí rameny a natáhne stránku znovu. Pokud se přeruší přenášení emailu, servery se o to pokusí za chvíli opět. Úplně jinak se ale k tomu staví ISP.
Páteřní routery, které zajišťují propojení s místními ISP (peering) či zajišťují konektivitu do světa (upstream), si totiž vyměňují směrovací informace o topologii zbytku Internetu pomocí protokolu BGP. Tento protokol používá pro svůj transport již zmiňované TCP a jeho relace nemají trvání jen několika minut, ale spíše dnů či měsíců. Rozpad takového spojení má přibližně stejný důsledek jako chvilkové fyzické přetržení kabelu, který routery spojuje. Pokud tedy úspěšně zaútočíte na všechna BGP spojení daného ISP, můžete si být jisti, že na pár okamžiků z jeho sítě do zbytku Internetu neprojde ani packet. Budete-li útok nějakou dobu opakovat, je pravděpodobné, že ostatní routery, zjednodušeně řečeno, ohodnotí tuto síť jako nestabilní a na pár minut ji vyřadí ze svých tabulek. To už pocítí i běžní uživatelé.
Proč to ještě není opraveno? I když byl útok pojmenován už velmi dávno, dlouhou dobu se předpokládalo, že jde o útok spíše teoretický, který není možné v reálném čase provést. Kupříkladu Convery a Franz [PDF, 1,5 MB] ve své přednášce o bezpečnosti protokolu BGP z loňského roku vypočítali, že takovýto útok by trval nejméně 142 let. Opravdové zděšení mezi ISP a výrobci routerů tedy způsobil článek Paula Watsona Slipping in the Window: TCP Reset attacks. Jeho práce dokazuje, že útočník zdaleka nemusí žít tak dlouho. Z jeho výsledků vyplývá, že útočník s připojením do Internetu o rychlosti T1 (1,54 Mbit/s) by dokázal rozpojit TCP spojení nejvýše do jedenácti minut. To už jistě není nic nepředstavitelného. U lépe připojených útočníků se maximální čas přirozeně zkracuje.
Kde byla chyba? Zrušit běžící TCP spojení není pro útočníka bez možnosti odposlechu vůbec jednoduchá záležitost. K takové věci potřebuje znát pět údajů:
- IP adresu prvního routeru,
- IP adresu druhého routeru,
- cílový port,
- zdrojový port,
- sekvenční číslo TCP spojení.
Pokud by poslal packet s těmito údaji a zprávou RESET jednomu z routerů, došlo by k rozpadu spojení. První dva údaje jsou útočníkovi známé, protože ví, které počítače chce „rozpojit“. Cílový port také není žádné tajemství, BGP navazuje spojení na port 179. Zdrojovým portem by mělo být náhodné číslo v rozsahu 1–65535. V praxi se ale všechny porty použít nedají a některá čísla nejsou pro tento účel použitelná. I tak by ale zbývalo dost možností, které by útočník musel vyzkoušet.
Bohužel většina operačních systémů nevolí tento port náhodně, ale sekvenčně od predikovatelného začátku. Watson uvádí, že například firmware IOS 12.0(8) nejpoužívanějších routerů Cisco naváže první spojení z portu 11778 a každé další pak z portu čísla zvýšeného o 512. Protože routery obvykle navazují jen velmi málo TCP spojení, je šance na odhad tohoto čísla velmi vysoká, pravděpodobně by stačilo vyzkoušet tak 50 možností.
Co tedy pátý údaj, sekvenční číslo TCP spojení? Předpoklady vycházely z přesvědčení, že je nutné znát sekvenční číslo absolutně přesně. Jenže to není úplně pravda. Při TCP přenosu je povolen vždy určitý rozsah těchto čísel, která jsou považována za validní. Toto tzv. okno umožňuje, aby TCP fungovalo efektivně i na linkách se zpožděním. Určuje totiž, kolik TCP packetů může odesílatel vyslat najednou, aniž by čekal na potvrzení příjemce. Velikost okna se může v průběhu spojení v závislosti na rychlosti linky a příjemce měnit. Bohužel u BGP spojení, které je obvykle na dostatečně rychlých linkách mezi rychlými routery, je okno velké, Cisco IOS začíná na velikosti 16384. Sekvenční číslo je v rozmezí 0 až (232 – 1) a tímto faktem se počet packetů nutných k útoku sníží z 232 na 218=262144. Pokud tedy útočník zná první čtyři údaje, pošle jen 262144 packetů o velikosti 40 bytů, v případě, že hádá i čtvrtý údaj, bude to násobek tohoto množství.
Lze se bránit? Naštěstí je mnoho možností, jak BGP spojení chránit. Jednou z nich je snížit velikost okna u BGP spojení a upravit firmware tak, aby zdrojový port vybíral zcela náhodně. To útočníkovi značně prodlouží nutný čas na přerušení spojení. Další obrana spočívá v mechanismu popsaném v RFC-2385. BGP je přenášeno TCP protokolem, kde ke každému packetu router ještě přidává MD5 signaturu, aby bylo ověřitelné, že je autentický. Tato velmi elegantní možnost ale zatěžuje i tak dost vytížené centrální procesory routerů a je možné, že paradoxně otevře cestičku k jinému útoku. Poslední možností je filtrovat BGP packety tak, aby router útočníkovi zabránil nežádané packety vůbec posílat. V peeringových bodech (a všude, kde je více BGP routerů na společném segmentu) to ale znamená, že filtrování musí nasadit všichni připojení.
Jak je vidět, každá drobná technická nedokonalost či nedomyšlenost otevírá vrátka lidem, kteří nemají na síti zrovna čestné úmysly. Nezbývá než popřát technikům u sítí méně podobných epizod.