systemd漏洞在Linux上導致阻斷服務攻擊

許多Linux發行版都因為最近被披露的systemd的漏洞而面臨危險:DNS解析服務的一個漏洞可能讓系統遭受分散式阻斷服務攻擊 (DDoS)。攻擊這漏洞的方式是讓系統向攻擊者所控制的DNS伺服器進行查詢。DNS伺服器接著送回一個特製回應,讓systemd進入無限迴圈,也讓系統的CPU使用率持續在100%的狀態。這漏洞已經被分配編號CVE-2017-15908

有許多方法可以讓使用者查詢惡意份子所控制的DNS伺服器,不過最簡單的作法是讓使用者系統連往攻擊者所控制的網域。這可以透過惡意軟體或社交工程完成。

解決這漏洞最有效的辦法是修補systemd的漏洞。趨勢科技在今年7月首先發現了這個漏洞,並在同月份通過零時差計畫(ZDI)回報給適當的廠商。獨立研究人員在今年10月也同樣發現了這個漏洞,並將其回報給Canonical。許多Linux發行版都已經推出修復程式,像Ubuntu也在10月底發布。幸運的是,到目前為止還沒有出現針對此漏洞的攻擊。

 

漏洞分析

隨著時間過去,DNS會持續加入新的功能,既是為了增加新功能也是為了讓其更加安全。一個定義在RFC 4034內,新加入域名安全擴展(DNSSEC)的資源記錄類型稱為NSEC(Next Secure)記錄。

這漏洞發生在處理表示NSEC位元圖(bitmap)中虛擬型態(pseudo-type)的位元時。下圖顯示了程式碼區塊和堆疊框架。反白的地方“continue”顯示“while迴圈”進入無限迴圈。dns_packet_read_type_window()出現在resolved-dns-packet.c內。

圖1、無限迴圈的原始碼和堆疊框架

 

請注意,上述函式dns_packet_read_type_window()是當記錄類型為DNS_TYPE_NSEC時由dns_packet_read_rr()呼叫。下圖顯示了resolve-dns-packet.cdns_packet_read_rr()的程式碼區塊。

圖2、讀取DNS封包的原始碼

 

概念證明(POC

為了測試這個漏洞,我們架設一個會用惡意格式回應的DNS伺服器。這回應包含設計來觸發這漏洞的NSEC記錄,如下所示:

圖3、特製DNS回應的封包

 

一旦運行systemd的系統用它來進行DNS解析,就會收到這條特製的DNS封包,讓CPU使用率達到100%,如下所示:

圖4、CPU使用率變到最大

 

緩解措施

正如我們前面所提到,此漏洞的修復程式已經發布。建議有風險的系統要盡快更新。

系統管理員也可以選擇手動封鎖可能的惡意封包。檢查傳入的DNS回應是否包含RFC 4034第4節內規定的資源記錄。

監視傳入的DNS回應流量並偵測應答區塊內的DNS資源紀錄是否包含指定在RFC 4034第4節(定義了NSEC資源紀錄)內的DNS和紀錄類型。如果裡面的位元圖(bitmap)被處理並包含虛擬型態(pseudo-type)偽類型,就應該加以封鎖。

 

@原文出處:systemd Vulnerability Leads to Denial of Service on Linux 作者:William Gamazo Sanchez(漏洞研究)