Windows IPv6 協(xié)議棧中的安全漏洞
微軟在10月的補丁日修復了87個安全漏洞,其中一個是Windows IPv6 協(xié)議棧中的安全漏洞。漏洞CVE編號為cve-2020-16898,CVSS評分為9.0分。攻擊者可以利用惡意偽造的包在遠程系統(tǒng)上執(zhí)行任意代碼。
PoC代碼非常簡單,可以引發(fā)Windows系統(tǒng)藍屏,表明能夠繞過Windows 10和Windows server2019 補丁的攻擊者就可以利用漏洞。因為漏洞利用實現(xiàn)遠程代碼執(zhí)行的效應可以廣泛傳播,因此漏洞的影響也非常大,該漏洞可以實現(xiàn)蠕蟲般傳播。研究人員將該漏洞命名為“Bad Neighbor”,因為該漏洞位于ICMPv6 的鄰居發(fā)現(xiàn)協(xié)議,使用的是Router Advertisement 類型。
技術細節(jié)
由于Windows TCP/IP 棧不當處理使用Option Type 25 (Recursive DNS Server Option) 和length 域為偶數(shù)的ICMPv6 Router Advertisement 包,會引發(fā)該漏洞。在該option 中,length 的計數(shù)是遞增8字節(jié),所以length為3時,總的長度應該是24字節(jié)。該option本身含有5個域:Type, Length, Reserved, Lifetime, Addresses of IPv6 Recursive DNS Servers。前4個域總共只有8個字節(jié),而最后一個域含有IPv6 地址數(shù)目的變量,每個IPv6 地址為16字節(jié)。根據(jù)RFC 8106,length 域是大于等于3的奇數(shù):
當IPv6 主機通過RA 消息接收DNS option時,會按照如下規(guī)則處理相關的option:
DNS option的有效性通過length 域來檢查。RDNSS option 中的Length field的值大于等于最小值3,并滿足(Length - 1) % 2 == 0。
如果是一個偶數(shù)的length 值,Windows TCP/IP 棧就會錯誤地按8字節(jié)增加網(wǎng)絡緩存。這是因為棧內(nèi)部是以16字節(jié)遞增的,無法處理不符合RFC 標準的length值。棧中錯誤匹配結(jié)果會將當前option 的最后8字節(jié)作為第二個option 的開始,引發(fā)棧溢出和潛在的遠程代碼執(zhí)行。
為完整地實現(xiàn)該漏洞的利用鏈還需要Windows kernel中的內(nèi)存泄露或信息泄露漏洞。
漏洞影響和補丁
該漏洞比較大的影響是Windows 10用戶,因為啟用了IPv6的服務器還比較少。
目前,微軟已經(jīng)發(fā)布了補丁,如果無法安裝補丁,那么比較好的辦法就是禁用IPv6。此外,還可以在網(wǎng)絡邊界攔截或丟棄ICMPv6 Router Advertisements。從PoC的情況來看,Windows Defender和Windows防火墻無法攔截PoC。目前還不清楚攻擊在使用6to4 或 Teredo 這樣的技術的網(wǎng)絡中是否可以成功。


















