段海新:謝謝陳教授的介紹,也謝謝主辦方的邀請,讓我今天能夠有機會和大家分享一下我最近的一些研究成果,感覺到非常高興。
CDN現在已經成為互聯網的一些基礎設施,和所謂實證研究,也就是說我們其實這幾年的研究基本上也都是研究現實已經部署的這些CDN系統可能存在的一些問題,以及一些防范措施。所以我們的研究很少是從理論方面,主要是看我們的論文,基本上都是一些實驗和數據。
現在說CDN已經成為互聯網的基礎設施,一個是來源于Akamai,還有就是從中國工信部的一些數據統計。我們知道世界上一些主流的應用,基于Web的應用基本上都不屬于CDN,Akamai是世界上用戶最多的CDN的廠商,他一個公司承載了15%到30%的Web流量。我們工信部的統計里面說,排名前100%的網站有91%是使用CDN,包括這些知名的企業。有一些公司,像互聯網公司,包括亞馬遜、百度、騰訊這些公司,雖然沒用第三方的CDN,基本上也是用的CDN的技術。
我們看一下CDN基本的功能,可以說幾個方面。首先是分擔負載,其次是降低延遲,提高用戶的體驗。然后過濾一些攻擊,比如可以用Wap防火墻過濾,包括抗Dos,CDN也是抗Dos攻擊標準的防范措施。它的工作原理,用戶在訪問這個原始網站的時候,首先是向服務器發一個請求,比如你要訪問a.com的時候,DNS給你返回一個別名,把你的請求指向了CDN的DNS,CDN的DNS根據用戶所在的位置,給你返回一個最佳的CDN的節點,用這種方式可以把全球的用戶分配到最優的節點上去,這樣Dos攻擊也就起不了什么作用了。
這里邊CDN現在作為一個防Dos攻擊的平臺,它自身抗Dos攻擊的能力會怎么樣呢?我今天可能重點跟大家分享的是這方面的內容。本來是希望把我們這幾年的一些研究做一個綜合的介紹,但是因為最近頻繁的出差,飛機又是頻繁的延誤,所以挑其中的兩篇文章。這是這幾年關于CDN安全的一些學術文章,其中有四篇,最后一篇還沒有發表,有四篇是我們團隊做的。CDN現在雖然這么重要,但是對它的安全性的研究并不是特別多。2012年的時候我的一個博士生在清華實驗室開題要做CDN安全的研究,當時很多教授認為CDN這個話題已經非常老了,沒有什么值得研究的。但是直到我們2014年的時候,這篇文章是發表在Security&Privacy里面,也是安全圈里面錄取率最低的。這是去年CCS,四大學術會議之一關于CDN研究的一些研究。一直到我上一個博士生畢業,新的學生來了之后,說還有很多的問題值得研究。但是直到這個時候,我們發現其實關于CDN的安全研究還不是特別多。
剛才其實已經簡單介紹了一下CDN的工作原理,這是我讓我的學生去做CDN安全研究的時候找到的為數不多的一篇比較實際的論文,這是2009年的時候,他們說CDN究竟是提供了一種保護還是一種威脅?我們知道CDN靠大量的網絡資源和計算資源,靠它分布在世界各地的這些服務器化解Dos攻擊。但是這些資源如果被攻擊者所利用,也可能會成為一個很大的Dos攻擊的來源。這篇文章里面提到了幾種方法,首先是攻擊者可以繞過CDN的路由策略,把訪問原始網站的請求直接發給了某一個節點。然后這些節點如果是這個攻擊者同時發出一個請求,那么這個請求有可能同時到達這個目的地,成千上萬個節點同時到達這個目的地,有可能對這個網站造成一定的沖擊。當然怎么樣去繞過這個緩存?因為如果內容一旦緩存了之后,它下次就不再向原始網站發送這個請求了。這個論文里面提出了一個方法,后面加一個Random,CDN就不知道這是不是一個新的內容了,因為每次都是一個新的,每次都會把這個請求發到服務器上去。
但是這種攻擊是不是真正起到了放大作用了呢?其實這個攻擊者要想把這些請求都打到服務器這邊,他也耗費很大的帶寬,其實放大比是1:1。怎么樣才能做到真正的放大?有另外一種方法,就是他發起一個請求,這個鏈接馬上就中斷了,這個請求會在下一條轉發到這個原始網站,原始網站把內容返回的時候,CDN這一端的鏈接已經終止了。也就是說他發了一個請求,斷掉了,然后這個請求到達服務器,這個服務器有可能執行了大量的操作,把結果返回,但是CDN節點,這一端的鏈接已經沒有了。
我們下面的研究,我的學生做完了這個調研之后,發現了另外一個很有意思的研究,我們把它叫做循環轉發攻擊,這個我們工作就是用實驗證實了,針對于現在的CDN,我們可以構造一種轉發的循環,可以繞過現在CDN廠商幾乎所有的防范措施。而且我們測試了世界主流的16家CDN廠商,都可能受到不同程度的威脅。這種攻擊我們并沒有說真正的要構造一個這樣的實驗,但是說有可能會造成整個互聯網基礎設施的癱瘓。因為剛才說了,91%流量都跑在CDN上。
我們看一下CDN的轉發過程,用戶的網站一旦使用了CDN的服務之后,實際上在CDN的機制上要有一個轉發的規則,把用戶的請求轉發到網站,是由原始網站的管理員來制定的,所以這里面攻擊者是CDN的客戶。客戶會來決定最終的請求會轉發到哪個服務器上去,于是個攻擊者,其實也就是這個CDN廠商的客戶,他告訴這個節點,說我的原始網站在CDN B,對CDN B說我的原始網站在CDN C,這樣就構成一個循環,這個循環可以進行CDN廠商之間無休止的循環,大量的消耗CDN的資源。我們測試過的16個CDN廠商,包括Akamai、Clouoflare,包括國內的這些,都可以做到不同程度的影響。
可能有人會懷疑,你要發起一個攻擊必須要成為這個CDN廠商的客戶,你的身份就泄漏了。但實際上我們發現,絕大多數的CDN廠商都提供一個免費的測試帳號,你所需要的只是一個電子郵件地址,電子郵件地址可以隨便注冊。還有一個你的帶寬,有一些是需要信用卡的,但是即便是信用卡,其實在國際上這種地下產業里面也不難弄到。我們發現其實可以構造幾種類型的轉發循環,最簡單的循環就是把原始網站的地址指向127.0.1,這個循環就在一個服務器上自己轉起來了。我們對于開源軟件做過一些測試,發現如果你指定127.0.1,它很快就會把TCP的端口號資源占完了。我們遠程對微軟的Azure中國的CDN做了一個測試,在16個廠商里邊,只有這一個是會受到影響。當然這個防范也很簡單,把127.0.1不指定成地址。但是一般的CDN會允許你指向一個域名,這個域名又是由這個原始網站完成的,這個時候就不能用簡單的靜態的方法,要對解析之后的解決做一個過濾。這種方法不能預防另外一個,就是我并不是把它指向自己,而是指向CDN的另外一些節點。這個其實在第一篇文章里面我們也提到了,測量CDN的節點這個我們也做了一兩年工程方面的工作,就是世界各地各個廠商的節點部署我們差不多都可以設到。
這里面因為這個權威服務器是攻擊者來控制的,CDN在轉發的過程當中,我可以決定你現在把這個請求轉發給誰,這個地址是由DNS來決定的,而且DNS在這個里面給你緩存的時間相當短,比如只有一秒鐘,這一次的請求,下次要重新再向我請求地址。這樣的話,就可以在一個CDN內部構造一個循環,這個在我們16個所測試過的CDN廠商里面有7個是可以的,這個循環是可以轉起來的。另外的為什么沒有轉起來?其實在大部分的CDN廠商,內部都有一個循環、轉發、檢測的機制,主要的就是在HTTP協議里面增加一個檢測循環的頭。下一個節點如果碰到這個頭之后,他就認為這已經形成了一個循環,就把這個請求返回一個錯誤。
實際上在HTTP協議的標準里面已經定義所有的轉發,都要在轉發過程當中增加一個Via這個Header,但是并不是所有的廠商都遵循這個標準,有一些我們剛才說的那7個,實際上沒有加任何檢測循環的頭,所以他就可以構造這樣的循環。另外11個里面,有的是使用標準的Via,但是更多的是使用自己定義,百度是使用這個。一旦有了這樣的檢測,是不是我們的循環就轉不起來了呢?我們發現有另外6個CDN廠商,他們雖然是有這個Header,但是有一個特殊的操作。比如前面這4個,他會把別人設置的Via Header重置,形成自己的。也就是再轉回來的時候,剛才那個廠商自己設置的那個Via沒有了,只有經過他自己的地址。還有這兩個CDN廠商,他允許用戶網站自定義一些規則,把任意的頭過濾掉。也就是說別的廠商加了那個檢測循環的頭,可以被他過濾掉。這樣的話,就構成這樣一個環境,比如亞馬遜的CDN增加了一個CloudFront,到了Akamai增加了一個Akamai。到了MaxCDN,他增加了一個規則,把這個頭全部去掉了,這個循環又可以轉起來了。
這樣是不是這個循環就可以無限制的轉下去了呢?還有一個限制,我們知道鏈接的超時,一直轉下去之后,發起請求的那一方一直收不到響應,這個超時的時間,按照TCP大概是兩分鐘左右,但是很多的CDN廠商,這里面有不同的時間,比如有些是240秒。但是我們又回到了第一篇文章里面所提到的Abort-Forwarding技術,上面那個鏈接超時了,下面的鏈接并沒有終止,會繼續轉發下去。其中有一跳超時了,下面這一跳并沒有超時,會繼續轉發,于是又可以繼續循環下去。還有一個就是剛才說的尺寸大小也有一定的限制,你既然可以過濾掉那個頭,就可以把增加的頭去掉,不因為每次循環增加了一個頭而增加了大小,因為你又把那個頭去掉了。這樣的話,這個實驗我們在多個CDN廠商之間沖擊,我們的實驗又不能對這個CDN廠商構成真正的危害,所以我們串進去自己的節點,聯合我們實驗室,我們再增加200毫秒左右的延遲,讓這個循環轉得慢一點,不會產生真正的危害。這樣的話,我們可以做一個計數,知道它轉了多長時間,轉了多少圈。這樣我們在真實的環境里面,用這種方法探測,五個多小時這一個循環可以轉下去。后來終止,可能是因為網絡,因為跨國家,跨我們實驗室,條件也并不是很好,最后斷掉了。但是理論上的超時時間不超過兩分鐘,現在實際上是在五個多小時。
現在究竟這個放大能產生多大流量呢?即便是循環,就像我們研究的400接力,可以一直跑下去,但是那個接力棒只有一個,那個流量也不會特別大。但是我們發現,其實有一個技術,就是CDN可以實現Streaming,你在看一個電影的時候,你不會把這個文件下載到CDN節點,CDN節點再傳到你這兒來你再看,而是下載一小塊的同時,已經在下一條傳了。就相當于我們打球的時候,有多個球在天空飛,于是增加了這個Streaming以后,這個放大效果就非常明顯。最近CDN廠商有一些只支持你發一個請求,你上傳一個文件的時候,這個時候要支持Post的請求,要把文件上傳到原始網站上去,CDN節點會一小塊一小塊的形成那么一個流,所有的CDN廠商都支持用這種方式,就可以把這個流量放到很大。
我們還有另外一個詞是大壩攻擊,我們把這個響應也增加進來了。比如說循環轉了很多圈以后,這個時候我突然把這個原始網站的IP地址指向了真正的原始網站,原始網站會返回一個響應,這個響應又反向的轉起來,整個流量比原先大得多了。最后一步,如果返回的這個文件,這個響應是一個壓縮的文件,那又會是怎么樣?我在請求的時候可以發一個Header里面,告訴你我支持的編碼格式Gzip。CDN廠商發現你的請求不支持,但是響應里邊確是個一個Gzip文件會解壓,會消耗CDN的計算資源,又大大的放大了攻擊的流量。這是CDN轉發的攻擊,這是今年在四大安全緊急學術會議的最佳論文,是第一篇最佳論文。
下面是我們正在進行的研究,還沒有正式發表,我今天只是給大家做一個Demo。這里面說我們如何“黑掉”NSA,美國的國家安全局,這個“黑掉”我加了一個引號,其實跟NSA沒有任何的關系。這個里面的演示效果是這樣的,你要訪問NSA的時候是這樣的。這是我們從新加坡國立大學找到他們一個受影響的緩存服務器,如果是那邊的用戶訪問NSA的話,他看到的效果是這樣子的。但是為了不帶來一些政治性的麻煩,我們壓迫的演示是用Bing來做的,這個效果是一樣的。大家看到,我們實際上是要訪問一個Bing上不存在的網頁,因為現在路徑上從新加坡國立到Bing上有緩存,有CDN,可能還有防火墻。現在首先我們在這里面看到的這個頁面是不存在的,Bing給你返回的一個301的代碼讓你重新定向到主頁里面去。下面一個請求,現在再去訪問的時候,中間的緩存已經被污染了,看到現在的地址是新加坡國立大學,這是我們在那里設置的一個代理,并不是說我們在新加坡國立大學黑了別人的一臺機器,而是世界有一個實驗廠,我們用帳號就可以使用他們的機器作為代理,但是那個代理我們沒有做任何的操作,在那個節點上沒有做任何的操作,而是他們學校使用的這個透明代理出了問題。這個頁面我們并沒有黑掉那個Bing,而是把中間的緩存污染了。
這個影響到的不僅僅是透明代理,也包括代理、反向代理、CDN和防火墻,包括一些開源軟件,Apache、Squid等等。這是我們在世界范圍內做的一個大規模的測量,我們這個發現已經報給Squid,這是使用最多的一個開源軟件,就是透明代理用的比較多的,同時相關的一些廠商我們都已經報告了,我們希望在論文正式發表之前這些都已經寫不玩了。Squid發了兩個安全公告,這些問題都存在了很多年,而且都沒有發現。報告人是我的學習陳建軍,也是最佳論文的第一作者。
因為時間關系,大家如果有什么可以跟我聯系。最后也是做一個廣告,這是我和學術圈里面的一些朋友們組織的一個學術論壇,這里邊來自世界各地的一些非常優秀的華人安全圈里面的學者會在我們的論壇上貢獻和分享他們一些最新的研究成果。通過兩種形式,一個是視頻報告,大家可以訂閱我們的微信公眾號,我們的一些學術報告會通過網絡直播的方式,我們到目前所有的學術報告全都是在網上直播的,大家只需要有一個手機,能夠連上網就可以看到我們的學術報告。另外就是我們的自媒體的電子雜志,訂閱到我們的公眾號之后,每個星期有一份最新的研究成果的介紹。
以上就是我跟大家分享的內容,謝謝!