最近世界真是越來越不太平了,尤其是對于大部分普通人而言。昨天又傳來噩耗,根據網絡監測公司BGPMon,Google的公開DNS服務器 IP 8.8.8.8被劫持到了委內瑞拉和巴西超過22分鐘。
Google DNS 服務器平均每天處理超過1500億個查詢,在被劫持的22分鐘里起碼幾百萬個查詢包括金融系統,政府和個大商業網站的DNS查詢流量都被劫持走了。
根據磚家們的推測,這次劫持可能是黑客利用了Border Gateway Protocol(BGP) 協議中一個眾所周知的漏洞來實現的,BGP協議為ISP級的路由協議,一般用來協調大型ISP之間的路由走向。這次劫持可以讓黑客把網上的部分流量劫持從而經過他們所控制的路由。
這已經不是Google DNS服務器被第一次劫持了,在2010年也Google DNS的流量也曾經被劫持到了羅馬尼亞和奧地利境內。
BGP劫持攻擊是一種大規模的中間人攻擊,并且較難發現,因為數據包的最終目的地并沒有變,只是繞了下路而已。
本部分來源于Tony Kapela 和 Alex Pilosov在2008年 Defcon會議上的演講。
首先互聯網整體上來說是一個分布式的網絡,并沒有整個網絡的中心。但是整個互聯網實際上是由成百上千個不同的ISP的子網絡組成的。
這些子網絡互相連接,通過BGP協議告訴對方自己子網絡里都包括哪些IP地址段,自己的AS編號(AS Number)以及一些其他的信息。
這里又要扯到互聯網的IP地址分配方式。互聯網的IP地址分配是中心化的,ICANN這個機構把IP地址大段分給Regional Internet Registries(RIR),區域互聯網注冊管理機構。RIR再把IP地址段細分后分給ISP們。
大部分情況下,AS Number和分給該AS什么IP段是沒有任何關系的。
下面問題來了,BGP協議里雖然有一些簡單的安全認證的部分,但是對于兩個已經成功建立BGP連接的AS來說,基本會無條件的相信對方AS所傳來的信息,包括對方聲稱所擁有的IP地址范圍。
對于ISP分配給大公司客戶的地址段,ISP往往會對BGP做一些有限的過濾。但是對于大型ISP來說,因為對方所擁有的IP地址段可能過于分散,所以一般是按最大范圍設置BGP prefix 地址過濾。比如假設ISP A擁有地址段20.1.0.0/16和20.200.0.0/16,那么ISP B可能會設置過濾對方傳來的20.0.0.0/8以外的路由。
當然這種情況比較極端,一般ISP分配到的IP地址段都是連續的,但是基本也都有可操作的空間,可以把數百到幾萬個不屬于自己的IP合法加到自己的BGP信息里。
多數ISP甚至都沒有把自己本身的IP段過濾掉,也就是說如果其他AS聲稱擁有該ISP自己的IP段,這個ISP的BGP路由也會相信。
為了解決這個問題,有人發明了一個叫Internet Routing Registry (IRR)的東西,相當于一個開放式的數據庫,像DNS 根服務器一樣采用分布式鏡像服務器放在世界各地。
ISP可以向IRR注冊自己的IP地址段和路由策略,其他ISP就可以查詢IRR從而對自己的BGP路由器做過濾。這樣做的確防止了一些由于無意而導致的路由劫持。
但是IRR這個東西本身也是不靠譜的。IRR里存了大約10萬條記錄,如果全部加載進路由器的話是個不小的負擔。另外IRR基本沒人管,任何人可以可以往里面注冊任何路由記錄。
所以在大部分ISP都無條件相信IRR的時代,IRR也帶來了不少的麻煩。
最簡單的方式就是通過Whois找到目標IP段的 管理員郵箱,如果該郵箱或者郵箱所在的域名已經過期,那么就自己注冊一個,然后就可以隨便通過郵件向IRR修改記錄了。
或者直接通過BGP路由向ISP發送,反正大家都不care……
現在我們來看一個Youtube被劫持的案例:
youtube有5個網段,其中一個是
208.65.152.0/22
因為覺得Youtube不和諧,于是巴基斯坦政府決定封鎖Youtube。
巴基斯坦電信在路由器上加了條static route把
208.65.153.0/24
弄到了null0接口(GFW之黑洞路由大法)
巴電信的工程師手抖把static route redistribute到BGP了(Cisco路由器上同步不同協議路由表的方法),也就是說把該路由器上的靜態路由表添加到BGP的路由表了,靜態路由同步到其他路由表里的優先值最高。
BGP把這條路由向其他AS的路由器同步了,最先中槍的是香港的電訊盈科(PCCW),然后接著被逐漸同步到了全世界。
這時互聯網的大部分用戶想上Youtube的時候數據包都跑到巴基斯坦了,結果當然是打不開了(因為進來就被弄到null0了)。
Youtube發現后重新用BGP聲明了對該IP段和其他IP段的所有權,成功刷新了部分ISP路由器的路由表。
兩小時后PCCW斷開了和巴基斯坦電信路由器的BGP連接。3-5分鐘后,一切恢復正常,除了苦逼的巴基斯坦用戶們。
這意味著只要控制了任何一個ISP的任何一個BGP路由,都將具備影響全世界互聯網的能力。
BGP劫持很難被發現,如果不是因為巴基斯坦電信把youtube的IP段轉發到了null0接口,數據包就只會在巴基斯坦網絡里繞一圈然后再到達Youtube。
如果攻擊者的路由器具備篡改TTL的功能,那么即使通過traceroute也很難發現數據包被劫持,唯一的方法就是像前面所說的BGPmon那樣檢測全世界范圍內的AS路由表和BGP信息。
當我們控制了ISP的BGP路由后,像平常一樣發送路由信息。通過修改AS Path等BGP信息,讓其他AS認為你到目標網絡的距離最短。
為了讓回來的數據包也經過你的路由器,你需要記錄trace route到目標網絡的時候都會經過哪些AS。
使用AS-PATH prepend list包括這些AS Number
設置static route到traceroute出現的第一個ASN
目標IP段
10.10.220.0/22
在AS 200中
ASN 200向相鄰的AS 20和30發送BGP通告。
此時為正常的狀態。
攻擊者控制了AS 100的BGP路由。
AS 100的路由表和BGP表顯示到達
10.10.200.0/22
需要經過 AS 10.
于是我們把AS10,20和200加入我們的AS PATH prepend list
通過route-map把目標IP段加入BGP路由表
10.10.220.0/24 is announced with a route-map:
route-map hijacked permit 10
match ip address prefix-list jacked
set as-path prepend 10 20 200
然后在AS100的路由器中加入static route,把流向目標IP段的數據包指向AS10
ip route 10.10.220.0 255.255.255.0 4.3.2.1
完成后可以看出,AS30 40 50 60的數據包如果想要到AS 200去,都會先經過AS 100.
到了這里我們已經可以分析出,BGP劫持的本質再次回到安全的本質既是信任這一點,因為BGP直接無條件信任對方AS發來的路由信息,并且缺乏有效的認證和過濾手段,導致BGP劫持屢次得手。