天天看點

DNS緩存中毒攻擊與防護

近來,網絡上出現史上最強大的網際網路漏洞——DNS緩存漏洞,此漏洞直指我們應用中網際網路脆弱的安全系統,而安全性差的根源在于設計缺陷。利用該漏洞輕則可以讓使用者無法打開網頁,重則是網絡釣魚和金融詐騙,給受害者造成巨大損失。

  緩存中毒攻擊者(cache poisoning)給DNS伺服器注入非法網絡域名位址,如果伺服器接受這個非法位址,那說明其緩存就被攻擊了,而且以後響應的域名請求将會受黑客所控。當這些非法位址進入伺服器緩存,使用者的浏覽器或者郵件伺服器就會自動跳轉到DNS指定的位址。

DNS緩存中毒攻擊與防護

這種攻擊往往被歸類為域欺騙攻擊(pharming attack),由此它會導緻出現很多嚴重問題。首先,使用者往往會以為登陸的是自己熟悉的網站,而它們卻并不是。與釣魚攻擊采用非法URL不同的是,這種攻擊使用的是合法的URL位址。

一、DNS緩存中毒攻擊原理

  首先來了解一下DNS的工作過程。DNS被設計成C/S應用程式,需要把位址映射為名字或把名字映射為位址的主機調用DNS解析程式,向最近的DNS伺服器發出查詢請求,此時,DNS伺服器可以有兩種方式來響應客戶的請求,一種叫遞歸解析,另一種叫疊代解析。DNS緩存中毒攻擊主要是針對遞歸解析方式工作并緩存非本域的解析結果的DNS伺服器。下面就主要分析遞歸解析過程。

  (1)應用程式需要解析一個域名時,本機會發起域名解析請求,解析程式會向首選DNS伺服器DNS-A發起域名解析請求;

  (2)DNS-A收到解析請求後會去查詢自己的管轄域,如果請求的是自己管轄域的域名就會直接将查詢結果傳回給解析程式,如果不在DNS-A的管轄域内,DNS-A就向它的上級伺服器DNS-B發起解析請求,等待DNS-B的查詢結果;

  (3)如果DNS-B解析不了,就會告訴DNS-A,我解析不了,DNS-C可能會知道;

  (4)DNS-A就會給DNS-C發出解析請求,等到DNS-C的查詢結果;

  DNS伺服器不是對收到的任何DNS響應資料包都會接受,它會解碼資料包,檢查資料包是否符合接受的标準,那DNS伺服器會檢查資料包中的哪些資料來判斷該資料包是不是它所希望的包呢?

  1、在DNS伺服器發出的查詢請求包中包含了它的UDP端口号,傳回的響應資料包的目的端口号不對,網絡協定棧就會直接丢棄該資料包。

  2、DNS伺服器收到響應資料包後,可以通過檢查問題域與發出的查詢包中的問題域是否一緻來判斷響應資料包的合法性。

  3、DNS伺服器每發出一個查詢請求都會配置設定對應的一個查詢ID号,在内部對應是某一個域名查詢請求,在DNS伺服器内部區分不同的查詢就是TID号,如果DNS伺服器收到的響應資料包中的TID号不在DNS伺服器等待響應資料的TID中,伺服器就會丢棄該資料包。

  4、響應資料包中的授權域和附加域

  授權域和附加域中的域名必須和問題域中的域名是同屬于某個域名下的子域名。

  如果上述所有條件都滿足了,DNS域名伺服器就會确定該響應資料包是對它發出的某個查詢請求的響應,接受使用相應資料包中的資料,并緩存結果。

  如果某個攻擊者可以預測和僞造響應資料包,他就可以對DNS伺服器發起緩存中毒攻擊了。由于DNS伺服器發送的資料包中的TID隻有16位,而且大部分的DNS實作發出的請求中的源端口都是固定不變的。是以,攻擊者就可以僞造DNS響應包,DNS伺服器在收到響應包後就會将解析結果儲存在自己的緩存中,進而實作了緩存中毒攻擊。

二、DNS緩存中毒的防護

  及時檢查自己的DNS伺服器是否存在DNS緩存中毒漏洞,如果發現了自己的DNS伺服器存在該漏洞就可以在被攻擊前采取措施修補,避免攻擊事件的發生。

  目前檢查DNS伺服器是否存在緩存中毒漏洞的主要方法是模拟攻擊過程中的一部分。檢查的具體過程是首先需要搭建一個自己可以控制的DNS伺服器,與掃描器協同工作,讓掃描器向要檢查的DNS伺服器查詢隻有控制的DNS伺服器才能解析的域名請求,被檢查的DNS伺服器需要解析該域名就會向别的DNS伺服器請求解析,根據前邊介紹的DNS伺服器解析原理,最終被檢查的伺服器發出的查詢請求可以被導向到我們控制的DNS伺服器,這樣,控制的伺服器就可收到檢查伺服器的請求,進而可以收集到檢查伺服器送出請求包的特征,被控伺服器就可以将收集到的特征資訊作為查詢的響應資料傳回給檢查的DNS伺服器,進而可以傳回給掃描器,這樣掃描器就可以根據收集的特征來判斷檢查的DNS伺服器是否存在緩存中毒漏洞。

  技術層面的防護措施有如下方法:

  UDP源端口随機化選擇是一種比較有用的防護舉措,不應該再是預設的53,而是應該在UDP端口範圍内随機選擇,使得投毒命中的機率極大的降低。

  加密所有對外的資料流,對伺服器來說就是盡量使用SSH之類的有加密支援的協定,對一般使用者應該用PGP之類的軟體加密所有發到網絡上的資料。

  禁用DNS緩存,在系統資料庫中找到對應的鍵值,進行修改并儲存。

  及時重新整理DNS,DNS緩存會被重建,再次用域名通路IP伺服器,故障消失。

  修改IP協定包中的TTL值可以有效防止緩存中毒,但較小的TTL值會增加伺服器的負擔,應根據伺服器的性能和網絡情況合理地選擇。

  采用域名系統安全協定(DNSSEC)機制,依靠公鑰技術對于包含在DNS中的資訊建立密碼簽名。

三、總結

  去年發生了幾次大規模的DNS攻擊事件,充分暴露了DNS協定的安全隐患,我們也知道DNSSEC有着強大的優越性,雖然DNSSEC還不能完全解決DNS安全問題,但是我們有理由相信有了不斷完善的DNSSEC技術,DNS安全問題将有望獲得全面解決。