Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

嚴重安全性漏洞:glibc 的 getaddrinfo() 含有以堆疊為基礎的緩衝區溢位問題(CVE-2015-7547)

glibc 套件包含了多個標準函式庫,由系統上多種程式所使用。為了節省磁碟空間與記憶體,並讓升級更容易,一般系統碼會保留在單一地方,且與程式共享。這套件包含了標準的 C 函式庫,讓所有 GNU/Linux 程式皆連結使用。glibc 的 libresolv 函式庫提供的函數能轉譯主機名稱與 IP 位址。nss_dns 是 glibc 的元件,提供 NSS(名稱服務切換,Name Service Switch)服務模組,使用 libresolv 來進行 DNS 的查詢工作。

背景

libresolv 進行雙重 A/AAAA DNS 查詢的原始碼中,發現以堆疊為基礎的緩衝區溢位問題。來自遠端的攻擊者可以建立特製的 DNS 回應,導致 libresolv 當掉,或可能以執行這函式庫的使用者之權限來執行程式碼。這項緩衝區溢位問題發生在 libresolv 的 send_dg 函數(UDP 查詢)與 send_vc(TCP 查詢)裡。只有在 nss_dns NSS 服務模組呼叫 libresolv 時,才會出現問題。此弱點已經被指定為 [CVE-2015-7547](https://access.redhat.com/security/cve/CVE-2015-7547)。

搭配 AF_UNSPEC 位址家族呼叫 getaddrinfo 的應用程式會受到影響;但 Red Hat Enterprise Linux 6.4 有例外情況,應用程式若使用 AF_INET6 位址家族,那也會受到影響。只使用舊的 gethostbyname 函數或 libresolv 函數(例如 res_search,而非 getaddrinfo)的應用程式並不會受到影響。

這問題不會影響 Red Hat Enterprise Linux 5 以下的 glibc 版本。這問題只會影響 Red Hat Enterprise Linux 6 與 7 的 glibc 版本。

衝擊

這項問題已被 Red Hat 產品安全部評為〔嚴重〕(https://access.redhat.com/security/updates/classification/#critical)衝擊。

減緩問題

在 libresolv 的預設配置中,以 UDP 為基礎的向量會透過使用受信任網路上,受信任的、與通訊協定相容的 DNS 解析程式得到減緩。因為預設上,glibc 解析程式不會啟用 EDNS0,也不會要求大型的需求,因此相容的解析程式並不會產生過大的回應,進而導致此漏洞發生。

以 TCP 為基礎的向量能透過受信任網路上、受信任的遞迴解析程式(這程式限制了每個 DNS 回應的大小上限為 1,023)得到減緩。然而,這項功能在 DNS 解析程式中並不常見,因為這會打斷 DNS 通訊協定。(大部分解析程式所提供的緩衝區大小配置選項,只用於 UDP 上,而非 TCP。)拒絕 AAAA 回應,卻不限制 A 回應的大小,並不能減緩此弱點所帶來的問題。

在受影響的系統上停用 IPv6「並不能」減緩此弱點所帶來的問題,因為即使系統缺乏對 IPv6 的支援,雙 A/AAAA 查詢還是得以進行。

受影響的產品與解決方案

Red Hat Enterprise Linux 6 與 7 的所有 glibc 版本之套件都會受到此漏洞的影響。欲知用來修正此問題的個別安全性建議,請參閱下列表格中的連結:

解決方案

產品 建議
Red Hat Enterprise Linux 6 RHSA-2016:0175
Red Hat Enterprise Linux 7 RHSA-2016:0176
Red Hat Enterprise Linux 6.2 Advanced Update Support RHSA-2016:0225
Red Hat Enterprise Linux 6.4 Advanced Update Support RHSA-2016:0225
Red Hat Enterprise Linux 6.5 Advanced Update Support RHSA-2016:0225
Red Hat Enterprise Linux 6.6 Extended Update Support RHSA-2016:0225
Red Hat Enterprise Linux 7.1 Extended Update Support RHSA-2016:0225


套用更新之後,您必須重新啟動電腦,或重新啟動所有受到影響的服務:

因為這弱點會影響系統上許多應用程式,因此最安全、最建議的方法是重新啟動電腦,以確定每個應用程式都會使用更新後的 glibc 套件。

如果套用更新後,您無法重新啟動系統,請執行以下指令,列出所有執行中且(還在記憶體中)使用舊版本 glibc 的執行序(不限於服務)。

lsof +c0 -d DEL | awk 'NR==1 || /libc-/ {print $2,$1,$4,$NF}' | column -t

從列出的清單中,找出公開的服務並將之重新啟動。這程序只能是暫時性的解決方案,Red Hat 並不支援此方法;且如果發生問題,在開始障礙排除之前,您必須重新啟動電腦。

常見問題集

1. SELinux 會擋掉這個安全性漏洞嗎?
適切的 SELinux 政策會包含攻擊者可能會造成的損害,並限制他們存取系統;但許多應用程式與系統元件會用到 DNS,因此對於這項問題,SELinux 政策僅提供有限的防護能力。

2. 受信任的 DNS 解析程式會保護系統免於這問題嗎?
受信任的解析程式若使用了預設、相容於通訊協定的配置,並不能免於這問題,因為潛在漏洞牽扯到語法結構上嚴謹的 DNS 回應。

3. 靜態連結的函式庫會受此漏洞的影響嗎?
Red Hat 並不支援靜態連結 glibc。然而,如果客戶已使用「glibc-static」套件建立了靜態連結的應用程式,這些應用程式還是會使用 nss_dns 與 libresolv 的系統複製版本,安裝更新後的 glibc 套件能解決這項弱點所帶來的問題。

鳴謝

此漏洞乃經由 Google 安全小組(Google Security Team)與 Red Hat 所發現。