Linux內核被曝TCP “SACK PANIC”漏洞,多家雲服務商給出緊急修復建議

近日,Linux內核發現三個TCP網絡處理相關軟件缺陷,最嚴重的漏洞可觸發內核崩潰,從而影響系統可用性,多家雲服務商給出緊急修復建議。

執行摘要

近日,Red Hat在官網給出通知稱在Linux內核中發現了三個關於TCP網絡處理的軟件缺陷,這最初是由Netflix工程師所發現。該漏洞可導致服務器宕機。如果遠程攻擊者運行受漏洞影響的軟件系統,其中最嚴重的漏洞可觸發內核崩潰,從而影響系統的可用性。

現在這些軟件缺陷已經指派給了多個CVE(公開漏洞和暴露問題,Common Vulnerabilities & Exposures)。其中,CVE-2019-11477的嚴重性被指派爲“嚴重”(Important),CVE-2019-11478CVE-2019-11479的嚴重性被指派爲“中等”(Moderate)。

前兩個CVE是關於SACK(選擇性確認,Selective Acknowledgement)數據包及MSS(最大段大小,Maximum Segment Size)問題,第三個CVE僅與MSS相關。
上述問題是通過應用修復(Mitigation)或內核補丁得以修正的。修復細節和與RHSA建議的關聯,可查看原文的“RESOVLE”選項卡內容

問題詳情和背景

Red Hat在Linux內核中發現了三個軟件缺陷,涉及處理低MSS的TCP SACK網絡包。據悉,上述缺陷影響程度僅侷限於拒絕服務(DoS)。目前尚未出現漏洞權限升級問題,或導致信息泄露。

儘管可以使用原文提供的應用修復措施解決問題,但這些錯誤可能對合法來源的流量造成影響。合法來源流量的正確傳輸,需要較低的MSS值,這樣傳輸性能才能表現正常。在應用解決措施之前,請先評估適合系統環境的應用修復措施。

什麼是SACK(選擇性確認)?

TCP選擇性確認(SACK)提供了一種機制,用於告知數據接收方已成功接收發送方的所有數據段。該機制允許發送方從“已知正確”數據集中,重新傳輸數據流中丟失的數據段。一旦禁用TCP SACK,那麼傳輸完整的數據流需重傳更大的數據集。

什麼是MSS(最大段大小)?

最大段大小(MSS)是在TCP網絡包報頭中設置的一個參數,指定重構TCP數據段中所包含的數據總量。

由於在跨不同路由傳輸時數據包可能會產生碎片,因此必須指定MSS爲主機可處理的最大IP數據報的有效負載規模。如果MSS非常大,那麼意味着在到達目的地的傳輸路徑上,數據包流可能最終會產生碎片化。而如果數據包較小,則可確保產生較少的碎片,但最終會導致一些開銷未使用。

MSS大小可由操作系統和傳輸類型默認確定。獲取了特殊訪問權限的攻擊者可創建原始數據包,並通過精心選擇MSS選項發起此類攻擊。

TCP SACK

TCP是面向連接的協議。如果通信雙方希望通過TCP連接進行通信時,那麼雙方通過特定信息交換建立連接。例如,請求發起連接(SYN)、初始序列號、確認序列號、此連接使用的最大段大小(MSS)、權限發送和處理SACK等。建立該連接的過程稱爲“三次握手”。

TCP通過稱爲“數據段”(Segment)的單元發送和接收用戶數據。TCP數據段包括TCP報頭、選項和用戶數據。

每個TCP數據段具有一個序列號(SEQ,Sequence Number)和確認號(ACK,Acknowledgement Number)。

SEQ和ACK用於追蹤數據段是否被接收者成功接收。ACK指示了接收者期待接收到下一個數據段。

例如,用戶A通過13個100字節大小的數據段發送1KB數據,其中每個數據段具有20個字節的TCP頭部。在接收端,用戶B接收到數據段1、2、4、6和8到13,2、5和7數據段丟失,並未被用戶B接收。

如果使用ACK,用戶B給出希望接收數據段3,那麼用戶A則會視爲用戶B在數據段2之後並未接收到任何數據段。這樣,儘管數據段4、6和8到13被用戶B已被成功接收,用戶A仍然會重傳數據段3之後的所有數據段。用戶B沒有辦法指示用戶A,這導致對網絡低效利用。

SACK(選擇性確認)

爲解決上述問題,RFC-2018設計並定義了SACK機制。如果使用SACK,用戶B通過TCP選項域告知用戶A所有已被成功接收的數據段(即1、2、4、6、8到13)。這樣,用戶A僅需要重新傳輸數據段3、5和7。SACK可很大程度上節省網絡帶寬,避免了進一步網絡擁堵。

CVE-2019-11477 SACK Panic:

套接字緩存(Socket Buffers,SKB)。

套接字緩存(SKB)是Linux TCP/IP實現中使用的一個最核心數據結構。它是一個由緩存組成的鏈接列表,用於保存網絡數據包。該列表可以用做傳輸隊列、接收隊列、SACK隊列、重傳隊列等。SKB支持以數據段方式保存分組數據。Linux SKB最多可以保存17個數據段。

linux/include/linux/skbuff.h
define MAX_SKB_FRAGS (65536/PAGE_SIZE + 1)  => 17

在x86上,每個數據段可保存最多32KB數據。而在PowerPC上爲64KB。數據包一旦被確認發送,就被置於“發送”隊列中,數據包的詳細信息則保存在一個緩存控制結構中,定義如下:

    linux/include/linux/skbuff.h
struct tcp_skb_cb {
    __u32       seq;                    /* Starting sequence number */
    __u32       end_seq;    /* SEQ + FIN + SYN + datalen */
    __u32       tcp_tw_isn;
        struct {
                u16 tcp_gso_segs;
                u16 tcp_gso_size; 
        };
    __u8        tcp_flags;  /2* TCP header flags. (tcp[13])  */
    …
}

該結構定義中,“tcp_gso_segs”和“tcp_gso_size”字段用於保存設備驅動程序相關負載數據分段信息。

一旦啓用Segmentation負載和SACK機制,由於存在數據包丟失和某些數據包的選擇性重傳,SKB最終可能會保存多個數據包,個數由“tcp_gso_segs”記錄。列表中的多個此類SKB被合併爲一個SKB,以有效地處理不同的SACK數據塊,其中包括將數據從一個SKB移動到列表中的另一個SKB。在移動數據期間,SKB結構可以達到其最大限制17個片段。這樣“tcp_gso_segs”參數可溢出,並觸發下游的BUG_ON()調用,從而導致所稱的“內核恐慌”(kernel panic)問題。

static bool tcp_shifted_skb (struct sock *sk, …, unsigned int pcount, ...)
{
...
tcp_skb_pcount_add(prev, pcount);
BUG_ON(tcp_skb_pcount(skb) < pcount);   <= SACK panic
tcp_skb_pcount_add(skb, -pcount);
…
}

遠程用戶通過將TCP連接的MSS設置爲最低限制48字節,併發送一系列特製的SACK數據包,就可能會觸發此問題。最小MSS使得每個數據段僅餘8個字節數據,由此增大了發送所有數據所需的TCP數據段個數。

多家雲服務商緊急迴應

與此同時,國內外多家雲服務商發佈公告,給予不同程度的建議和告警。

截圖來自AWS官網

根據AWS的公告,Amazon ECS、AWS Elastic Beanstalk、Amazon Elastic Compute Cloud (EC2)、Amazon WorkSpaces (Linux)等均進行了修復和升級,一直處於安全運行狀態,用戶可根據AWS建議的安全最佳實踐(或需要操作系統修補程序以滿足任何其他安全策略)進行操作。

截圖來自阿里雲官網

根據阿里雲給出的公告,阿里雲應急響應中心監控到國外某安全研究組織披露Linux 內核TCP SACK機制存在缺陷,可導致遠程拒絕服務。CVE編號爲CVE-2019-11477(高危)、CVE-2019-11478(中危)和CVE-2019-11479(中危),並給出安全修復建議(任意一種修復方式都有可能造成業務不可用),比如禁用SACK機制功能、升級Linux安全補丁(需要重啓服務器)等(具體信息建議閱讀官方公告)。

截圖來自騰訊雲官網

根據騰訊雲給出的公告騰訊雲安全中心監測到 Linux 內核被曝存在TCP “SACK PANIC” 遠程拒絕服務漏洞(漏洞編號:CVE-2019-11477,CVE-2019-11478,CVE-2019-11479),攻擊者可利用該漏洞遠程攻擊目標服務器,導致系統崩潰或無法提供服務。爲避免業務受影響,騰訊雲安全中心建議用戶及時開展安全自查,如在受影響範圍,請及時進行更新修復,避免被外部攻擊者入侵。

騰訊雲給出了目前的安全版本以及修復建議(建議閱讀官網公告),各大Linux發行廠商已發佈內核修復補丁,詳細內核修復版本如下:

  • CentOS 6 :2.6.32-754.15.3
  • CentOS 7 :3.10.0-957.21.3
  • Ubuntu 18.04 LTS:4.15.0-52.56
  • Ubuntu 16.04 LTS:4.4.0-151.178
  • FreeBSD:騰訊雲官方提供的 FreeBSD 鏡像默認不受該漏洞影響,請放心使用。

截圖來自華爲雲官網

根據華爲雲給出的公告, 華爲雲提醒各位租戶及時安排自檢並做好安全加固。具體 處置方案如下:

  • 更新Linux安全補丁(修復後需重啓):

    Ubuntu / Debian版本:執行命令sudo apt-get update && sudo apt-get install linux-image-generic,進行軟件源更新並安裝最新內核版本;

    Centos /RHEL版本:執行命令yum update kernel -y,更新當前內核版本。

  • 臨時緩解措施:禁用SACK處理(會影響TCP連接處理效率),請在操作前評估對業務可用性的影響。

sysctl -w net.ipv4.tcp_sack=0
echo "net.ipv4.tcp_sack=0" >> /etc/sysctl.conf

注意:修復漏洞前請將資料備份,並進行充分測試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章