微軟再爆 “死亡之 ping” 漏洞
微軟將在10月的補丁周二發布中再次發布大量安全修補程序,其中11個被微軟評為”關鍵”。但是,在修補的漏洞中,有兩個漏洞比這些漏洞更突出:CVE-2020-16898和 CVE-2020-16899。這些漏洞(由 Windows的 TCP/IP 驅動程序中的 Bug 引起)堪比2013 年 Windows 中修復的”死亡ping”漏洞。通過精心制作的數據包使拒絕服務和潛在的遠程代碼執行成為可能。
tcpip.sys 中的漏洞是驅動程序分析 ICMP 消息的邏輯錯誤,可以使用包含遞歸 DNS 服務器 (RDNSS) 選項的精心制作的 IPv6 路由器播發數據包遠程觸發。RDNSS 選項通常包含一個或多個遞歸 DNS 服務器的 IPv6 地址列表。

tcpip.sys 存在邏輯缺陷,可以通過創建包含比預期更多的數據的路由器播發數據包來利用該缺陷,這會導致驅動程序在其內存堆棧上將數據字節數超過驅動程序代碼中提供的數據字節數,從而導致緩沖區溢出。
開發一個”藍屏死亡”的DoS攻擊是可以的。但是實現遠程代碼執行(RCE)比較困難。
首先,TcpIp.sys 使用 GS 標志編譯,這可以防止典型的堆棧溢出直接控制返回地址。
Stack Cookie 也稱為stackcanary,是加載時產生的隨機值。其值是 XOR’d 與堆棧指針,使得它極難可靠地預測。
RCE 漏洞利用的第二個困難是內核地址空間布局隨機化 (kASLR)。即使有可能可以可靠地預測stack canary落在系統外殼在用戶模式下還需要正確(并再次遠程)確定Windows內核的基本地址。
針對此漏洞的防護
此處提供一個Lua腳本用于此漏洞的檢測可以集成到IDS中。
function init(args)
local needs = {}
needs["packet"] = tostring(true)
return needs
end
function match(args)
local packet = args["packet"]
if packet == nil then
print("Packet buffer empty! Aborting...")
return 0
end
-- SCPacketPayload starts at byte 5 of the ICMPv6 header, so we use thepacket buffer instead.
local buffer = SCPacketPayload()
local search_str = string.sub(buffer, 1, 8)
local s, _ = string.find(packet, search_str)
local offset = s - 4
-- Only inspect Router Advertisement (Type = 134) ICMPv6 packets.
local type = tonumber(packet:byte(offset))
if type ~= 134 then
return 0
end
-- ICMPv6 Options start at byte 17 of the ICMPv6 payload.
offset = offset + 16
-- Continue looking for Options until we've run out of packet bytes.
while offset < string.len(packet) do
-- We're only interested in RDNSS Options (Type = 25).
local option_type = tonumber(packet:byte(offset))
-- The Option's Length field counts in 8-byte increments, so Length = 2means the Option is 16 bytes long.
offset = offset + 1
local length = tonumber(packet:byte(offset))
-- The vulnerability is exercised when an even length value is in anRDNSS Option.
if option_type == 25 and length > 3 and (length % 2) == 0 then
return 1
-- Otherwise, move to the start of the next Option, if present.
else
offset = offset + (length * 8) - 1
end
end
return 0
end
如何防御:
1、如果不使用,請禁用 IPv6
2、netsh int ipv6set int int=INTERFACENUMBER rabaseddnsconfig=disable
參考鏈接:
https://news.sophos.com/en-us/2020/10/13/t...