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