在目前的網路基礎設施當中,DNS是最不可或缺的服務之一,少了它,我們就必須設法記住一堆難以記憶的IP位址,才能連到提供各種應用服務的後端伺服器,如果DNS無法正常運作、提供服務,許多IT應用甚至可能會因此停擺,因為,許多原本能連到目的地的連線請求,全部都會迷路。

或者當這樣的網路服務被入侵,相關資源設定也遭到竄改時,甚至使用者有可能會因此誤連到惡意偽造的網站,結果導致帳號、密碼、信用卡號等重要個資被竊取,損失慘重。

DNS的存在這麼重要,那麼,它本身夠安全嗎?事實上,要建立DNS伺服器很容易,幾乎所有的Unix和Linux作業系統,以及Windows Server作業系統都內建這樣的伺服器功能,取得方式幾近於免費。當中發展歷史最悠久,也最為普及的是BIND(Berkeley Internet Name Domain),這些DNS伺服器都是在作業系統上以應用軟體的方式執行,既然如此,所有軟體可能發生的安全性問題,它們都會面臨到,包括錯誤的設定、作業系統與DNS軟體本身的漏洞、伺服器管理者帳號與密碼被破解。

DNS採用的通訊協定有許多可供濫用的地方

除了這些天下所有軟體都會遇到的狀況,DNS自己的安全性問題也很大。

UDP協定與53埠的使用

首先,DNS基本上是透過UDP協定傳輸封包,並且是利用53埠來服務所有的請求。每一次DNS的網址域名查詢會包含來自用戶端的一個UDP請求,然後伺服器端回覆查詢結果時,也是透過UDP來傳輸。

若回覆的資料超過512 bytes時,或者是執行轄區傳送(Zone Transfer)這類任務時,才能會採用TCP協定來傳輸,你也可以強制用TCP來傳輸DNS的查詢請求與回覆。

一般來說,使用UDP的DNS服務,都是透過單向的方式傳輸封包,而且,所有的網路防火牆也都會允許這樣的連線從53埠進出,不會也無法特別採取管制措施。F5 Networks臺灣暨香港區技術總監莊龍源表示,駭客之所以喜歡攻擊DNS,原因即在此。他說,UDP的封包和協定根本沒辦法讓用戶或主機去確認對方發過來的封包身分,所以很容易可以做到DNS洪水攻擊,或是其他類型的攻擊。

由於UDP只是一個單方向的網路協定,只管發出去,可以不管伺服器是否有所回應,在這種情況下,就有機可乘了,他們可以設法用DNS的這項特性做出攻擊。

防火牆、路由器不會去檢測DNS封包裡面的資訊

除了UDP的特性,以及防火牆一定會放行DNS所用的網路埠等因素,莊龍源提到,在DNS的封包裡面動手腳,要「騙過」防火牆和路由器也很容易。

因為DNS封包裡面的格式有很多種,比方一般使用者要上網會查詢A記錄,透過郵件伺服器發電子郵件會查詢MX記錄,去查詢一個IP位址的域名,則會用到Reverse-lookup記錄。但對網路防火牆來說,處理這些封包時,並不會特別檢查裡面包含的訊息,當它看到是從UDP、53埠進來,就把流量放進去了。

而且,任何接受到的查詢網域名稱請求,DNS服務都要照單全收,並且逐一回應,而不是基於一定的條件或政策判斷後,再決定是否答覆。

因此,如果DNS伺服器接到一個正常格式的DNS查詢請求,但裡面需要查詢的資料量非常大時,不論這個提出請求的來源IP位址是否真實存在,或是以亂數方式大量產生,它還是會乖乖回應,換言之,如果有人趁機濫用這樣的服務,將可能會導致DNS伺服器上傳頻寬大塞車,而無法順利地回應正常的DNS查詢請求。

另一種則是表面上就可以看出的異常情況。當有人提出奇怪的查詢請求時,而DNS又沒有妥善設定,結果也就等於照對方的指示辦事了。像是有人在查詢時要求提供「Any」或「.」的記錄、「Chaos」或「Hesiod」的類別,以及根本不存在的域名、以亂數方式查詢轄區內的域名。

這些攻擊方式更加狡猾,因為對方可以透過其他方式來進行正常或異常的域名查詢。例如,有人提供DNS服務給我使用,我可以任意地查詢很多根本不存在的域名,這臺DNS伺服器就會一直忙著執行查詢的程序,這樣一來,DNS伺服器反應速度很快就會下降,但實際上這並不是真正的忙碌,而是一連串無意義的動作,瞎忙一場。

從上面的討論來看,我們可以知道DNS是很容易被攻擊的。因為在網路層並沒有能夠特別針對DNS傳輸特性加以管制的防火牆,並讓它去過濾DNS伺服器所接受到的流量和訊息。

現行防護DNS攻擊方法的局限

對於DNS在網路傳輸時可能引發的安全性問題,過去已經有人提出幾種解法來因應,但仍無法全面而徹底地改善DNS安全性。因為,最主要的問題是,這些方法實作上,對網路傳輸速度與DNS伺服器本身的效能,都有很大的衝擊,就目前而言,有些作法引發的副作用是無法克服的,例如,DNS採用的通訊協定很難由UDP改變為TCP,以及防火牆、路由器無法全面檢測封包來源,有些則已經有進一步的搭配方式,可突破原有的限制,例如DNSSEC。

改用TCP來傳輸

DNS也支援用TCP協定來傳輸,這麼做的好處是可以提升安全性,因為TCP會要求三向交握(three-way handshake),而能夠查詢到來源IP位址、確認對方使用的是真實存在的IP位址,可預防有人利用假冒IP位址發送封包。

但是大多數DNS並不使用TCP,而用UDP的協定來傳輸,為什麼?

這主要是為了傳輸效能上的考量。因為在整個應用系統執行的流程裡面,透過UDP這種方式傳輸查詢網域名稱的請求與回覆,可把DNS查詢的延遲程度減到最低,使網路連線的效果保持流暢,快到幾乎讓你沒感覺到背後正在進行這項工作。

若改用TCP來執行DNS服務,會因為需確認三向交握,導致網路存取的延遲程度增加很多,而且幾乎每個連到一個網站或應用程式時,都要查詢DNS,若此時又堅持用TCP來傳輸,也會耗用許多DNS伺服器本身的執行效能,而且不容易執行DNS Caching的演算。

也因此,DNS不得不用UDP,但這又衍生出資安漏洞──別人可以用偽造的IP位址、假冒其他合法的用戶端電腦去發動很多攻擊。

因為UDP本身就是一個無狀態(Stateless)的協定,當DNS封包廣播進來時,傳輸上可允許不回應給來源IP位址,所以,管理者與網路資安設備自然也沒辦法查詢這個連線階段,造成很多漏洞,為人所濫用的機會非常大。比方說DNS的快取下毒(DNS Cache Poisoning)或DNS綁架(DNS Hijacking)等攻擊,都是利用DNS的特性所做成的。而且,這種攻擊影響的不只是DNS伺服器,也影響用戶端。

運用防火牆和路由器的連線來源管制

若要防堵假冒的DNS封包,透過這些網路設備來進行,可行性有限。理論上,在防火牆和路由器處理進出的網路流量時,是可以設定成只允許來自特定來源的封包才能通過,同時阻擋那些假冒IP位址的封包;但實際上,當所有封包進出時,要一一檢查它們的來源,會增加這些設備的負載,而且不是每一臺防火牆和路由器都會連到網際網路,它們也會經常連到子網路內,所以這樣子的管制不是很有效益,並未普遍採用。

啟用DNSSEC強化安全驗證

如同前面提到的,DNS的網路服務為了達到低延遲的連線需求,而採用UDP協定傳輸,對於偽冒IP位址的傳輸行為無法防範,因此如果有人發動相關的網路攻擊,例如DNS快取下毒、透過偽裝DNS伺服器發動中間人攻擊(Men in the middle attack)都是很有可能的。

為了解決這項嚴重危害網路安全的問題,2001年起,IETF組織開始制定了一套新的標準,稱為DNSSEC(Domain Name System Security Extensions)。

不過DNSSEC只能解決一部分安全問題,例如可透過數位簽章的驗證,確保封包的正確性,是能防範一部分網路攻擊,但無法徹底杜絕。

而且,如果在DNS伺服器導入DNSSEC,這些加密的處理與驗證金鑰的程序,也會大大增加DNS伺服器本身處理的負載。因此要達到這樣的要求,不只是所有網際網路的既有DNS伺服器、用戶端,都要支援DNSSEC,同時,需要架設更多臺DNS伺服器做負載平衡,以免無法承擔龐大運算需求。

針對這樣的高負載處理需求,有些DNS伺服器平臺後續的改版也提出強化自身效能的解法。例如BIND 10裡面,對於轄區資料的存取,開始支援用記憶體內處理(in-memory)或用後端資料庫的方式。

另外,市面上有些專門提供DNS伺服器硬體設備的產品,像是Infoblox的Trinzic DDI和Advanced DNS Protection,也都支援DNSSEC,該廠牌產品的代理商達友科技資深產品經理黃繼民表示,Infoblox在硬體設備的作業系統NIOS中,對於處理器與記憶體的資源運用是有所管制的,採取先進先出的作法,不會出現系統記憶體完全被過多連線佔滿,而導致動彈不得的狀況。

而另一家提供負載平衡設備的廠商F5,在Application Delivery Firewall的解決方案下,當中可透過Big-IP Global Traffic Manager(GTM)來提供DNS加密運作工作的卸載作業(Offload DNS crypto),以及用數位簽章驗證的DNS快速回應(Signed DNS responses)。

面對更精密、複雜的DNS攻擊

這一兩年以來,DNS攻擊事件之所以受到很大的重視,主要拜2013年首度出現300Gbps流量的DDoS攻擊所賜,苦主是反垃圾郵件組織SpamHaus,而當時這個DDoS事件所採用的手法,就是透過折射攻擊(Reflection Attack)、放大攻擊(Amplification Attack),甚至將兩者混合使用,才得以產生這麼巨大的流量,攻向所針對的目標。

折射攻擊

事實上,想要發動DNS的DDoS,方法有很多種,不只是用UDP打掛對方的DNS伺服器,駭客還可以透過其他DNS伺服器來發動折射攻擊,也就是對不同的DNS伺服器發出大量的DNS查詢請求,而且是用合法的IP位址(但並不是真正的來源IP位址,而是受害者的IP位址),然後,再透過這些DNS伺服器所回覆的查詢請求,去攻擊其實根本沒提出任何查詢請求的受害者。同時,在這種手法下,駭客可以透過這種曲折的方式,更徹底地隱藏自己的身分,因此,這是更複雜的DNS攻擊。

放大攻擊

基本上,放大攻擊和折射攻擊經常是焦不離孟,甚至也有人將兩者畫上等號,而對駭客來說,必須先成立了折射攻擊的架構,作為基礎,接下來,才有可能進一步達到將網路流量放大的攻擊效果。

就運作原理而言,每一個DNS封包可容納的資料量,最大可延伸到4096 bytes,因此攻擊者只需送出少量的域名查詢請求,DNS伺服器就可以回覆非常大量的資料,而這就達到了資料量放大的目的;而在折射攻擊的模式下,因為發出查詢域名請求的來源IP位址已經偽造成受害者伺服器所在的IP位址,所以,這麼大量的資料並不會回到攻擊者身上,而是報復到受害者,為了要接收與處理這麼大規模的網路流量,受害者的伺服器資源會全部耗盡而無法提供任何服務。

上述是一般的DNS查詢請求,有些類型的查詢動作會有不同的放大效果。例如,基於DNSSEC的域名查詢,可能引發的是10倍的回應量;若是用Any Record的方式來查詢facebook.com這樣的域名,再加上DNS伺服器本身配置不當,此時,DNS伺服器就會把所有記錄都傳送出來,也可以達到放大的效果。

相關報導請參考「DNS安全驚爆危機」


想要提升DNS防護DDoS攻擊的能力,強化DNS伺服器本身的處理性能是一種方法,因此架設更多臺DNS伺服器或購買一些廠商所開發的DNS硬體設備,都是解法之一,此外,有些負載平衡產品的廠商,也能支援這樣的應用。例如圖中的F5是以Advanced Firewall Manager這套產品來防禦DNS攻擊。

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()