Palo Alto 對近些年 DNS 歷史漏洞的整理分析(下)
Palo Alto 對近些年 DNS 歷史漏洞的整理分析(上)
新緩解措施
已實現的明顯緩解措施是為每個請求隨機分配事務ID(而不是使用升序計數器)。這種緩解措施使攻擊更加難以執行。其實,MAX_SIZE_OF_QUERY_ID更難。事務ID為16位,因此緩解措施使攻擊變得比以前困難65536倍。
這些緩解措施著實使攻擊犯難了,不過道高一尺魔高一丈。 16位隨機密鑰雖然很大,但還不夠大。讓我們來算算。
- 為了進行以下計算,我們需要記下一些數據:
- 典型DNS響應的大小:100字節= 800位;
- 攻擊者的帶寬:每秒1兆位= 1000000位
- 合法響應返回解析器所需的時間:2秒;
有關2秒的注意事項:如今,使用現代互聯網連接,即使對于未緩存的域,顯然也只需不到兩秒即可完成DNS請求。但是出于示例的考慮,我選擇了延遲,不過我還選擇了過去的網速:每秒1兆位。
有65536個可能的事務ID,我們有兩秒的時間窗口發送一個響應,其中包含成功攻擊的正確響應。為了計算每次攻擊的成功率,我們需要計算出在實際的合法響應到達解析器之前,攻擊者可以發送多少響應包。這很容易計算:帶寬除以數據包大小乘以時間。
憑借1 Mbit / s的帶寬,攻擊者可以在一秒鐘內發送多達1000000 / 800 = 1250個響應數據包,這意味著攻擊者在兩秒鐘的窗口中可以發送2500個響應數據包。達到可能的攻擊所需的嘗試次數(即1 Mbit / s帶寬至少50%的成功率)約為18次嘗試。
完整的計算是這樣的,100萬是我們用1mbits的連接每秒可以發送的位數。我們將其除以800,這就是產生了每秒可以發送的響應數量。由于2秒的窗口,我們將其乘以2,然后將其除以除以2的16次方,16是事務ID字段的大小。即單次攻擊的成功率為了獲得成功的攻擊,我們需要在x次嘗試中成功進行一次嘗試。我們的x次嘗試稱為“實驗”,該實驗所有可能結果的集合稱為樣本空間。擊中樣本空間中任何物體的概率顯然是100%(這是方程中最外層的1)。為了獲得可能的攻擊的機會,我們需要獲取整個樣本空間并從中減去任何不能“成功地進行至少一次攻擊”的內容,也就是所有x次嘗試都失敗的另一種說法。一次嘗試的失敗就是“所有的(1)減去一次嘗試的成功”也就是1減去成功率。然后,我們告訴Wolfram Alpha,我們正在尋找一個x,該x的值將大于0.5(即50%)。
換句話說,只有18次嘗試,帶寬為1 Mbit / s的攻擊者在緩解攻擊后,通過此攻擊可以獲得的成功率大于50%,可見當年策劃這場毀滅性的攻擊有多容易。
更多緩解措施
回過頭來看選擇如此弱的緩解措施似乎有些奇怪,但重要的是要記住,完全重新發明DNS協議是根本不可能的。它可能會毀了互聯網,想想所有的設備都有一個內置的解析器。他們會完全停止工作。但還有更多的事情要做。如上所示,事務ID緩解很弱。因此,這次對源端口使用了相同的緩解措施。來自DNS客戶端、解析器或名稱服務器的每個DNS請求都來自一個源端口,在緩解之前,該端口并未被隨機分配。
源端口為16位數字,與事務ID相同,僅用于功能目的。例如,解析器可能嘗試使用端口10650,如果先前請求中正在使用該端口,則它將嘗試使用10651,依此類推。當然,并非所有16位都可用,因為有用于其他用途的固定端口。
源端口和事務ID一起用作DNS通信的密鑰-32位密鑰。請記住,因為這在攻擊中將非常重要,我將進一步討論,多出來的這16位大大降低了成功攻擊的可能性。
以前,使用1mbit /s帶寬時,我們的成功率為3.8%(你可以在Wolfram Alpha中查看相關計算)。使用源端口緩解措施后,如果使用與以前相同的數據,則成功攻擊的可能性為0.00005821%,實現與以前相同的成功攻擊所需的嘗試次數為1190820。這使得攻擊的成功不夠可靠,實際上,源端口隨機化終結了大多數DNS緩存攻擊。
更高級的漏洞
到目前為止,我們主要關注單個DNS記錄的緩存,www.example.com位于93.184.216.34,也稱為A記錄。我們在受害者自己的DNS服務器(如路由器或Kubernetes集群)上下載惡意軟件,通過這種方法,我們努力進行攻擊以攻擊單個域。
安全研究員Dan Kaminsky在2008年發現了一種更好的方法,它比我們迄今為止在此文中討論的方法更加有效。這個漏洞在安全界引起了軒然大波,通用執行方法與到目前為止討論的方法非常相似,這意味著我們仍然需要猜測事務ID和源端口。成功的可能性幾乎相同,但是按照卡明斯基的方法,如果我們成功了,我們可能會毀掉更多的記錄。
NS記錄
顧名思義,名稱服務器(NS)記錄是DNS記錄,指示哪個DNS服務器對域具有權威性,這意味著哪個服務器包含域的實際IP地址。在前面的示例中,example.com的NS記錄將是一臺服務器,其中包含www.example.com,email.example.com和任何?.example.com的地址。
攻擊者的目標是攻擊受害者的解析器,使受害者在嘗試訪問www.example.com,email.example.com或任何?.example.com時,解析器會將請求轉發給攻擊者的名稱服務器,而不是example.com名稱服務器。
這樣,攻擊者就可以控制對example.com的每一個子域的訪問,而不是像以前那樣僅控制www域。
令人驚訝的是,該攻擊與我們在本文中描述的攻擊非常相似,但是攻擊者沒有嘗試使用A記錄來攻擊解析器的緩存,而是會嘗試使用NS記錄來攻擊緩存。
攻擊者首先會為他們想要攻擊的域配置一個名稱服務器,沒有什么可以阻止任何人配置他們自己的域名服務器。然而,它通常毫無意義,因為沒有其他服務器會指向它。

整個區域攻擊
然后攻擊者會繼續向他們想要攻擊的區域的子域發出DNS請求,它必須是一個沒有緩存的域,這樣他們就可以確定解析器會將請求轉發給根服務器。不僅如此,在我們的示例中,該域名的NS記錄(example.com的權威域名服務器)也不應該被緩存。如果緩存了請求,解析器將直接將請求轉發給權威名稱服務器,甚至不需要將請求轉發給根服務器。
攻擊者使受害者的解析器將其請求轉發到根服務器后,根服務器通常會以NS記錄進行回復,這大致相當于說:“我不知道答案,但是您可以在那兒詢問該服務器。這是它的IP地址。”
為了成功進行攻擊,攻擊者現在需要在發送根服務器的響應之前超越根服務器并傳播包含有惡意軟件的響應。這是通過發送帶有所需域的NS記錄的大量響應來實現的,別忘了攻擊者還需要猜測交易ID(可能還有源端口)。
每個NS回復都帶有一個“glue”記錄,這是名稱服務器的實際IP地址。如果采用其他方法,則請求服務器將不知道在哪里可以找到名稱服務器。解析器接收此“glue”記錄,對其進行緩存并與“glue” 記錄指向的名稱服務器聯系,以獲取所請求域的地址。
如果攻擊成功,從現在開始,每一個向解析器發出的請求都將到達攻擊者的域名服務器,該域名在攻擊域區域(www.example.com中的example.com)下沒有緩存。
應用空間
使用這種高級攻擊,攻擊者可以同時對大量域發起攻擊。理論上,攻擊者甚至可以攻擊整個.com域。
盡管攻擊整個.com域將是一個挑戰,但在某些情況下,攻擊者實際上會攻擊整個緩存。具體示例如下:
1.2015年1月26日,一個黑客組織設法將訪問者重定向至馬來西亞航空網站,并將其重定向到另一個顯示惡意內容的網站。
2.2011年11月7日,黑客設法攻擊了整個互聯網服務提供商的緩存,將用戶重定向到安裝了惡意軟件的網站,然后再將他們重定向回他們要求的網站。
3.2009年12月18日,DNS劫持攻擊使Twitter暫時受到約一個小時的影響。
每年都會發生數百起此類攻擊。
緩解措施
沒有實際的新緩解措施發生,因為使用已經使用的事務ID和端口隨機化緩解措施幾乎已經無法執行此攻擊。但是,如果攻擊者設法繞過了這些緩解措施,那么使用這種攻擊而不是“常規的”單A記錄攻擊將會嚴重得多。
與前面一樣,使用事務ID和端口隨機化一起創建一個足夠大的密鑰,使攻擊者難以猜測,從而起到緩解作用。
最近的漏洞
即使DNS協議被認為是安全的,開發人員也可能無法安全地實現它。
例如,存在一個普遍的誤解,即隨機函數應該是不可預測的,因此可以將其用于生成加密密鑰。但是,這些函數并不用于密碼學或安全性。不幸的是,在DNS實現的情況下經常會發生隨機化函數的誤用。
僅在兩年前,使用用于隨機化CoreDNS中事務ID的函數就發生了這種情況。開發人員選擇使用math.rand,它是Golang中非加密安全的偽隨機數生成器。這是一個大問題。如果攻擊者可以預測交易ID,則他們絕對能夠按照本文前面所述的方式攻擊CoreDNS的緩存。這意味著每個使用CoreDNS作為其DNS解析器的應用程序都容易受到惡意DNS記錄的攻擊。換句話說,由于CoreDNS主要用于Kubernetes,因此整個集群中每個節點中的每個應用程序都容易受到此攻擊。
另一個示例是幾周前才發現的一項新技術,該技術使用Internet控制消息協議(ICMP)來確定服務器上哪些端口已關閉,從而揭示了哪些端口實際上是打開的。這在DNS攻擊中使用,可以大大減少攻擊者需要猜測的端口數量,從而降低了前面解釋的端口隨機緩解措施的有效性。
當然,還有一些與緩存不相關的典型漏洞,例如緩沖區溢出。 dnsmasq是許多Linux發行版和路由器中使用的常見DNS解析器,甚至在Kubernetes的早期版本中也使用過。近年來,發現dnsmasq易受眾多內存漏洞的影響,這些漏洞可能導致拒絕服務(DoS),遠程代碼執行(RCE)等問題。
總結
本文中描述的DNS攻擊如果成功,將是毀滅性的。由于有了現代的緩解措施,攻擊者不太可能發動DNS攻擊,除非與解析器應用程序中的任何其他漏洞結合在一起。不幸的是,這樣的漏洞至今還經常被發現。
多年來,研究人員發現了可以緩解我們在本文中討論的一些緩解漏洞的措施,例如,用戶數據報協議(UDP)分段。
盡管如此,隨著當今安全瀏覽和證書的使用,即使攻擊者設法攻擊某個域的DNS服務器,由于證書不匹配,瀏覽器的受害者很可能不會加載該頁面。但是,通過使ISP的DNS解析器攻擊并將請求轉發到不存在的IP地址,該技術仍然可以用于巨大的DoS攻擊。
Palo Alto Networks的用戶可以通過多種方式免受本文所述的攻擊,Palo Alto Networks下一代防火墻可以通過檢測可疑DNS查詢和異常DNS響應來阻止DNS攻擊。與消耗或大量通信量有關的攻擊可通過防火墻內置的DoS或區域保護配置文件來處理,這些保護是通過DNS安全服務覆蓋DNS威脅和指示器的補充。
此外,Prisma Cloud可以通過警告過時和易受攻擊的組件以及云中配置錯誤的應用程序來保護集群。本文描述的大多數攻擊都要求破壞集群的內部網絡,以便能夠從內部向DNS服務器發送惡意數據包,此類漏洞幾乎總是通過利用過時且配置錯誤的應用程序而發生。
本文翻譯自:https://unit42.paloaltonetworks.com/dns-vulnerabilities/如若轉載,請注明原文地址。