Linux 內核報TCP SACK漏洞 CVE-2019-11477/78/79,需儘快處理

2021-01-10 蟲蟲搜奇

概述

在Linux內核處理TCP網絡數據包時候存在缺陷導致三個漏洞,CVE編號分別為:CVE-2019-11477,CVE-2019-11478和CVE-2019-11479。最嚴重的漏洞CVE-2019-11477,可以讓遠程攻擊者DDOS系統導致內核崩潰,從而影響系統的可用性。根據Redhat官方安全中心標準CVE-2019-11477為嚴重漏洞(Important),而CVE-2019-11478和CVE-2019-11479中等漏洞(Moderate)。

三個漏洞中前兩個與數據包選擇性確認(SACK)和最大段大小(MSS)相關,第三個漏洞與最大段大小(MSS)相關。

Redhat官方目前已經提供升級包和緩解參數設置措施,。

漏洞背景

Linux內核處理TCP網絡數據包時候存在缺陷導致三個漏洞,CVE編號分別為:CVE-2019-11477,CVE-2019-11478和CVE-2019-11479。漏洞僅可以用於DOS拒絕攻擊,不涉及信息洩露或者權限提升。

選擇性確認SACK

TCP的選擇性確認(Selective Acknowledgment,SACK)是一種機制,數據接收方可以通知發送方有關成功接受的數據包段的信息。這樣來通知發送方重傳發送包集中丟失的數據包段。禁用TCP SACK時,需要重傳整個數據包完成數據傳輸。

最大數據包段大小MSS

最大數據包段大小(maximum segment size,MSS)是TCP報頭中設置的參數,用來指定重建TCP數據包段需要的數據的大小。

由於數據包在變化的路由網絡傳輸過程中可能會碎片化,因此主機必須將MSS指定為等於主機可以處理的最大IP數據報文的有效負載大小。MSS過大可能會導致數據包流在到達目的地的過程中碎片化,較小的數據包可以確保較少的碎片但最終會導致未使用的開銷。

作業系統和傳輸類型默認設置了MSS大小。有特權訪問權限的攻擊者可以在數據包中創建特殊的MSS設置的原始數據包發送攻擊。

TCP SACK

TCP是面向連接的協議。當雙方希望通過TCP連接進行通信時,他們通過TCP握手交換某些信息建立連接,例如發起一個TCP請求,通過SYN發送初始序列ID,確認ID,連接使用的最大數據包段大小(MSS),認證信息和處理選擇性確認(SACK)等。整體TCP連接通過我們熟知的三次握手最終建立。

TCP通過一個數據段單元發送和接收用戶數據包。 TCP數據段由TCP頭,選項和用戶數據組成。每個TCP段都有序列號(SEQ)和確認號(ACK)。

接收方通過SEQ號和ACK號來跟蹤成功接收了哪些段。ACK號下一個預期接受的段。

上圖中用戶A通過13個100位元組的段發送1k字節的數據,每個段具有20位元組的TCP頭,總計是13個段。在接收端,用戶B接收了段1,2,4,6,8-13,而段3,5和7丟失,B沒有接收到。

通過使用ACK號,用戶B告訴A,他需要段3,用戶A收到B接收到2,而沒有收到3,A將重新發送全部段,儘管B已經收到了4,6和8-13段。所以導致大量重複傳輸,性能低下。

選擇性確認SACK

為了解決上面提到的問題問題,Linux在RFC-201議案中提出了選擇性確認(Selective Acknowledgement,SACK)機制。通過SACK,B可以使用TCP選項欄位通知A已成功接收了的所有段(1,2,4,6,8-13),A只需重傳段3,5和7就可以。這樣一來可以大大節省了網絡帶寬,提高了性能。

SACK奔潰: CVE-2019-11477

套接字緩衝區(SKB):

套接字緩衝區(Socket Buffer,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):

其中,tcp_gso_segs和tcp_gso_size欄位用通知設備驅動程序有關分段卸載的信息。

當Segmentation offload選項打開並且SACK機制也啟用時,由於數據包丟失和某些數據包的選擇性重傳,SKB可能最終持有多個數據包,由tcp_gso_segs計數。列表中的多個這樣的SKB被合併為一個以有效地處理的不同SACK塊。它涉及將數據從一個SKB移動到列表中的另一個SKB。在此數據移動期間,SKB結構可以達到其最大限制為17個片段,並且tcp_gso_segs參數可以溢出並觸發下面的BUG_ON()調用,從而導致所述內核奔潰。

遠程用戶可以通過將TCP連接的最大段大小(MSS)設置為48位元組的最低限制並發送一系列特殊的SACK數據包來觸發此問題,導致最低MSS每段僅留下8位元組數據,從而增加了發送所有數據所需的TCP段數。

影響版本

影響Linux 內核2.6.29及以上版本

Centos

修復和緩解方案

及時更新補丁

可以等待發行方的補丁包,然後通過包管理器(yum,apt)等升級。

內核設置

通過設置Linux內核參數禁用SACK,方法:

echo 0 > /proc/sys/net/ipv4/tcp_sack

後者

sysctl -w net.ipv4.tcp_sack=0

可以防止CVE-2019-11477 和 CVE-2019-11478攻擊。

可以防火牆設置限制MSS大小,對太小的包直接DROP:

firewall:

firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --tcp-flags SYN SYN -m tcpmss --mss 1:500 -j DROP

firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 0 -p tcp --tcp-flags SYN SYN -m tcpmss --mss 1:500 -j DROP

firewall-cmd -reload

firewall-cmd --permanent --direct --get-all-rules

iptables:

iptables -I INPUT -p tcp --tcp-flags SYN SYN -m tcpmss --mss 1:500 -j DROP

iptables -nL -v

批量更新(Ansible)

最後提供一個Ansible cook文件用來批量更新禁止SACK:

將以上代碼保存為disable_tcpsack.yml,然後ansible執行:

ansible-playbook -e HOSTS=all disable_tcpsack.yml

相關焦點

  • 蘋果watchOS 7.1以下發現任意代碼執行漏洞 需要儘快升級
    最近,Apple watchOS發現了一些需要儘快升級的重要漏洞。以下是漏洞的詳細信息:資料來源:https://Support.apple.com/zh-cn/HT2119281.cve-2020-27910,cve 2020-27916,cve 2020-10017,cve 2020-27909(官方尚未說明嚴重程度,如下所示)處理惡意製作的音頻文件可能導致任意代碼執行2.2020年-10003
  • 復現:Windows遠程桌面服務漏洞CVE-2019-0708
    漏洞簡介: 2019年5月14日微軟官方發布安全補丁,修復了windows遠程桌面服務的遠程代碼執行漏洞,該漏洞影響了某些舊版本的Windows系統。此漏洞是預身份驗證且無需用戶交互,這就意味著這個漏洞可以通過網絡蠕蟲的方式被利用。
  • 懶人入門網絡編程(二):TCP那些事第二篇
    但是是僅僅重發ack的數據報,還是重發所有的數據報這個問題依然沒有解決。因為2沒有收到,3,4,5收到了之後ack2,發送端根本不知道這三個連續的ack是誰發回來的,也許發送端發了20個數據,而ack是10,16,20傳回來的呢,這可能導致重傳從2到20的所有數據包(這就是某些TCP實際的實現),所以快速重傳機制是一把雙刃劍。
  • 【獨家】K8S漏洞報告|近期多個CVE漏洞解讀
    安全漏洞CVE-2019-11247/ CVE-2019-11248/ CVE-2019-11249分析Kubernetes v1.15+ Bug Fix數據分析安全漏洞CVE-2019-11247/ CVE-2019-11248/ CVE-2019-11249分析近期Kubernetes社區通過Google
  • 深入作業系統,從內核理解網絡包的接收過程(Linux篇)
    第二,當CPU收到中斷請求後,會去調用網絡驅動註冊的中斷處理函數。網卡的中斷處理函數並不做過多工作,發出軟中斷請求,然後儘快釋放CPU。ksoftirqd檢測到有軟中斷請求到達,調用poll開始輪詢收包,收到後交由各級協議棧處理。對於UDP包來說,會被放到用戶socket的接收隊列中。我們從上面這張圖中已經從整體上把握到了作業系統對數據包的處理過程。
  • Linux中的DTrace:BPF進入4.9內核
    CPU 處理之外的時間(由內核進行統計): # offcputime -d -p 24347 Tracing off-CPU time (us) of PID 24347 by user + kernel stack...
  • CVE-2013-3906漏洞分析
    CVE-2013-3906是一個位於ogl.dll內的整數溢出漏洞,這是一個比較經典的整數溢出漏洞,當時是McAfee公司抓到的一個0day
  • 「漏洞復現」Weblogic反序列化漏洞(CVE-2018-2628)
    漏洞描述Weblogic Server中的RMI 通信使用T3協議在Weblogic Server和其它Java程序(客戶端或者其它Weblogic Server實例)之間傳輸數據, 伺服器實例會跟蹤連接到應用程式的每個
  • 漏洞復現之三:CVE-2021-2109 Weblogic Server RCE
    0x00 漏洞描述CVE-2021-2109,該漏洞為Weblogic的遠程代碼執行漏洞。
  • linux 虛擬主機好嗎
    linux 虛擬主機好嗎?linux 虛擬主機是採用Linux系統搭建的虛擬主機,是企業和個人都非常喜歡使用的虛擬主機種類。運行穩定,對軟體的兼容遠超Windows系統。又由於代碼開源,即使linux不幸感染病毒,維護人員也容易查出運行異常之處,並加以解決。平時,linux系統也可利用自帶防火牆、入侵檢測和安全認證等工具及時修補漏洞,提高系統安全性。
  • ISC 2020漏洞管理與研究論壇拉開帷幕,現場揭秘國產手機晶片漏洞
    在論壇上,360 Vulcan Team漏洞挖掘與利用高級專家、虛擬化安全研究員肖偉以《Qemu-kvm和ESXi虛擬機逃逸實例分享》為主題,分享了在2019年天府杯上用時13秒破解的經典虛擬機逃逸漏洞,重現qemu-kvm(虛擬機服務)和ESXi完整攻擊流程的同時,詳解了破解過程中的實踐經驗。
  • Linux學習之Linux系統優化進階都需要掌握哪些知識?
    '* - nofile 65535 ' >>/etc/security/limits.conf15.開機自啟動crond sysstat network rsyslog sshd (c6)16.修改歷史命令環境變量export TMOUT=300 #timeout linux
  • 近兩萬字 TCP 硬核知識,教你吊打面試官!
    要想增大半連接隊列,不能只單純增大 tcp_max_syn_backlog 的值,還需一同增大 somaxconn 和 backlog,也就是增大 accept 隊列。否則,只單純增大 tcp_max_syn_backlog 是無效的。
  • 「正點原子Linux連載」第三十七章Linux內核移植
    NXP官方原版Linux源碼已經放到了開發板光碟中,路徑為:1、例程源碼->4、NXP官方原版Uboot和Linux->linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2。
  • Linux 5.9.1以及部分舊版穩定內核已解決 「Bleeding Tooth」漏洞...
    Linux 5.9正式發布剛過去一周,修正版本的內核5.9.1就已經跟隨而來,讓這個穩定版本更值得關注的是包括了本周被Google與英特爾的安全人員公開及警告的"Bleeding Tooth"藍牙漏洞的修復。BleedingTooth是一個影響Linux的遠程代碼執行漏洞,源於L2CAP代碼中基於堆的類型混亂。
  • 當運行 Linux 內核的機器死機時……
    作者 | dog250 責編 | 張文頭圖 | CSDN 下載自視覺中國曾經寫過一個模塊,當運行 Linux 內核的機器死機時,SSH肯定無法登錄了,但只要它還響應中斷,就盡力讓它可以通過網絡帶回一些信息。
  • 什麼Linux,Linux內核及Linux作業系統
    對於傳統概念,作業系統應該是一個具備完整功能的系統,它不僅僅包括內核,還要包括很多應用軟體。因此,後來逐漸將Linux的含義由Linux轉換為Linux作業系統,而Linux的內核則用"Linux內核"作為稱呼,以便於進行區分。Linux作業系統及各種發行版前面我們簡要的介紹了Linux作業系統、內核和發行版。
  • Linux 內核5.7發布,新功能變化總結
    ARM內核指針身份驗證支持在Linux 5.0中,增加了對ARMv8.3指針身份驗證擴展的支持,該擴展使用指針身份驗證代碼來確定指針是否被意外修改。這樣可以防止許多安全漏洞,但是僅對用戶空間代碼添加了該支持。新版本內核中增加了對arm64內核的支持,這將有助於使用面向返回的編程來保護內核免受攻擊。
  • Linux系統監控工具atop
    #tslpu表示 sleeping uninterruptible 狀態線程數#zombie表示殭屍進程數clones 表示在監控周期(默認10s)內 clone() 系統調用次數linuxsys 表示CPU在內核態工作時間比例user 表示 CPU 在用戶態工作時間比例irq 表示 CPU 處理系統中斷所消耗的時間比例idle 表示 CPU 空閒時間比例