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