0x00 漏洞描述
2019年6月18日,RedHat官網發布報告:安全研究人員在Linux內核處理TCP SACK數據包模塊中發現了三個漏洞,CVE編號為CVE-2019-11477、CVE-2019-11478和CVE-2019-11479,其中CVE-2019-11477漏洞能夠降低系統運行效率,并可能被遠程攻擊者用于拒絕服務攻擊,影響程度嚴重。
360CERT 判斷此次漏洞影響面廣,危害嚴重,建議廣大用戶及時更新。
漏洞細節
SACK(Selective ACK)是TCP選項,它使得接收方能告訴發送方哪些報文段丟失,哪些報文段重傳了,哪些報文段已經提前收到等信息。根據這些信息TCP就可以只重傳哪些真正丟失的報文段。需要注意的是只有收到失序的分組時才會可能會發送SACK,TCP的ACK還是建立在累積確認的基礎上的。
Linux SKB 最多可以容納17個片段:
linux/include/linux/skbuff.h
define MAX_SKB_FRAGS (65536/PAGE_SIZE + 1) => 17
每個片段在x86(PowerPC上為64KB)的數據中最多可容納32KB,當數據包將被發送時,它被放置在發送隊列中,它的詳細信息保存在控制緩沖區結構中:
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用于記錄數據包個數,類型為u16,最多記錄65526個。但是SACK機制允許TCP在重傳中合并多個SKB隊列,從而填充17個片段到最大容量, 17?321024 /8 = 69632,造成tcp_gso_segs整數溢出,進而觸發BUG_ON()調用,導致內核崩潰。
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);
…
}
攻擊者可以通過發送一系列特定的SACK包,觸發內核模塊的整數溢出漏洞,進而實行遠程拒絕服務攻擊。
0x01 影響版本
影響Linux 內核2.6.29及以上版本
0x02 修復方案
(1)及時更新補丁
Linux內核版本>=4.14需要打第二個補丁
(2)禁用SACK處理
echo 0 > /proc/sys/net/ipv4/tcp_sack
(3)使用過濾器來阻止攻擊
此緩解需要禁用TCP探測時有效(即在/etc/sysctl.conf文件中將net.ipv4.tcp_mtu_probingsysctl設置為0)
(4)RedHat用戶可以使用以下腳本來檢查系統是否存在漏洞
https://access.redhat.com/sites/default/files/cve-2019-11477–2019-06-17-1629.sh
0x03 時間線
2019-06-17?linux內核補丁公布
2019-06-18?RedHat公布漏洞信息
2019-06-18?360CERT發布漏洞預警
0x04 參考鏈接