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