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