受影響的產品
-
CubeCOS
產品狀態: CubeCOS 3.2.0: 未受影響。3.2.0 之前的 CubeCOS 版本: 受影響。
已於以下版本修復: CubeCOS 3.2.0.
簡介
本安全通報涵蓋 CVE-2026-98432
Linux 核心的 IPv4 TCP 程式碼中存在一項關鍵的「釋放後使用」漏洞。
1. 執行摘要
在 Linux 核心的 IPv4 網路子系統中發現了一個嚴重級別的漏洞 (CVE-2026-98432)。tcp_v4_syn_recv_sock() 函式會將傳入連線請求的 IP 選項 (ireq→ireq_opt) 傳遞給子套接字,但並未進行複製;此時,另一顆 CPU 可能仍在讀取這些選項,以處理重傳的 SYN 或套接字遷移。遠端未經身份驗證的攻擊者若能精準掌握時機,發送攜帶 IPv4 選項的 TCP 連線請求,即可觸發此條件。其結果將導致核心當機(服務拒絕)、記憶體損毀,或於核心中發生遠端程式碼執行。此攻擊無需任何權限,亦無需使用者互動。
CubeCOS 3.2.0 不受此影響。
3.2.0 之前的 CubeCOS 版本均受此影響。 其核心版本早於此修正, 因此此類部署中的每個節點均如以下所述而面臨風險。 解決方案是更新至 CubeCOS 3.2.0。 第 5 節所述的緩解措施僅能在完成更新前降低暴露風險。此外,無論版本為何,以下情況均在影響範圍內:攜帶自有核心的服務映像檔(Octavia amphora、Manila 共享伺服器),以及租戶虛擬機(其客體核心屬於租戶自身)。
對受影響版本的影響:無論由哪個服務所擁有,該核心所服務的每個 TCP 監聽器皆為入侵途徑。在雲端節點上,這包括租戶虛擬機可直接存取的監聽器(位於每個 ovnmeta-* 網路命名空間中的 OVN 元資料代理)以及 Kubernetes 容器集的監聽器。成功的攻擊將在主機核心中執行,因此網路命名空間和容器中並不包含此漏洞。
描述
2. 漏洞詳情
受影響元件:核心 (IPv4 TCP 堆疊,net/ipv4)
已偵測版本: kernel-7.2.11-1.el9.x86_64(供應商: CentOS Kmods SIG,建置日期 2026-10-16),於 CentOS Stream 第 9 版; uname -r = 7.2.11-1.el9.x86_64
已修補版本: CubeCOS 3.2.0,該版本內建 7.2.11 核心。此核心修補程式本身已包含於上游穩定版 7.2.10 中(發佈於 2026-10-11,提交代碼
漏洞類型: CWE-825 (過期指標解參照;屬於「釋放後使用」漏洞)
可利用性狀態: 通報者已在多路徑 TCP 配置中成功演示此漏洞(RHSB-2026-016) ;是否存在公開的攻擊程式需經人工評估(EPSS:未來 30 天內遭利用的機率為 0.76%,截至 2026-11-08 為第 55.5 百分位數。
風險評估與受影響範圍
CubeCOS 使用者面臨的風險
3. 影響範圍與執行時間評估
| 規則已載入 | 測試 | 結果 |
|---|---|---|
| 無(基準線) | synopt.py <節點 IP> 22 次 optimisation,同樣是從該節點發送至自身 | 已連線;節點上的 tcpdump 顯示 SYN 封包的標頭長度為 6 |
| 選項 A | synopt.py <node-ip> 22 opt and ... 443 opt | 超時 |
| 選項 A | synopt.py <node-ip> 22 plain and ... 443 純文本 | 已連線 |
| 選項 A | 從該節點到其自身,opt / plain | 超時 / 已連線;計數器 封包 12 位元組 768 |
| 選項 A | 將根命名空間指向容器集的監聽器 (:80),opt | 已連線:未涵蓋 |
| 選項 A | 同一節點上的容器集對容器集 (ip netns exec <container-set ns> python3 synopt.py <container-set-ip> 80 opt) | 已連線:未涵蓋 |
| 容器集命名空間內的 A + 表格 | 上述兩項測試,opt / plain | 超時 / 已連線;計數器 封包 6 在該命名空間中 |
| A + 預路由鏈 | 從容器集到容器集,同一節點,opt / plain | 超時 / 已連線 |
| A + 預路由鏈 | 從一個容器集傳輸至另一個節點上的容器集,opt / plain | 超時 / 已連線 |
| A + 預路由鏈 | 將根命名空間映射至一個容器集,opt | 已連線(本地開啟的連線不會經過預路由) |
| 容器集的 veth 上新增一個 netdev 入站連接 | 從該 Pod 連至另一個 Pod 以及主機的 22 號埠,opt | 超時;計數器 封包 6 在裝置鏈上 |
| 容器集的 veth 上新增一個 netdev 入站規則 | 從該容器集到另一個容器集,普通 | 已連接 |
檢查清單:
- 該易受攻擊的功能是否實際啟用? IPv4 TCP 無法關閉。多路徑 TCP: net.mptcp.enabled = 1,共有 40 個 MPTCP 監聽器 (ss -HMln),其中 17 個不在迴路連接埠上:k3s-server、etcd、thanos、 prometheus、cube-cos-api 以及數個匯出器。
- 實際運行的版本是否與掃描結果標示的一致?>執行 uname -r 和 rpm -q kernel 均顯示 7.2.11-1.el9.x86_64。請針對每個部署中的每個節點重複檢查:版本低於 7.2.10 的節點均受影響。
- 該 CVE 所依賴的任何先決條件是否已實際配置? 唯一的先決條件是攜帶 IPv4 選項的入站 TCP 連線請求抵達監聽器。已驗證當沒有任何過濾機制時,此類封包確實能從其他網路經由路由器抵達該節點。
- 網路暴露狀態: 對外連網 | 僅限內部 | 物理隔離 — (請針對每個部署及每個網路(管理、服務供應商/公共、租戶)手動指派)
- 容器/主機中的權限等級: 與結果無關:此漏洞存在於核心中,因此監聽進程的權限不會限制其影響範圍。
客戶需採取的行動
4. 修復與修補計畫
主要修復方案(永久性)
更新至 CubeCOS 3.2.0。 此為 3.2.0 之前所有版本的修復方案:3.2.0 內含 7.2.11 核心,其中已包含上游修正程式,且每個節點都必須重新開機以套用此更新。已部署 3.2.0 的環境針對此 CVE 無需進行任何變更。第 5 節所述的緩解措施可在更新完成前降低風險,但無法消除此漏洞。
- 目標版本: CubeCOS 3.2.0
- 修補程式部署時程: 針對 3.2.0 之前的版本,應立即採取緊急/非例行部署(嚴重級、遠端、無需驗證、可從租戶虛擬機存取):立即套用 第 5 節,並排定更新至 3.2.0 的時程。已部署 3.2.0 的環境則無需採取行動。 (請在檢查服務映像檔的內核後決定處理方式)
- 重新部署動作: 逐節點更新至 3.2.0:在運行中 -將虛擬機遷移至新環境、更新、重新啟動、驗證 uname -r 顯示 7.2.11 或更新版本。若 Octavia amphora 及其他服務映像檔的內核受到影響,請重新建置這些映像檔,並將現有的 amphora 切換至新映像檔。
5. 臨時緩解措施與替代方案
針對 3.2.0 之前的版本,請在更新至 3.2.0 之前採取以下措施。來源:Red Hat RHSB-2026-016,該公告建議拋棄攜帶 IP 選項的傳入 IPv4 TCP 封包。此規則是根據 IPv4 標頭長度進行比對,而非 TCP 選項,因此一般的 TCP 選項(視窗縮放、SACK、時間戳記)不會受到影響。此規則僅適用於 TCP:合法使用「路由器警示」選項的 IGMP,以及 Geneve 覆蓋網路(UDP)均不受影響。
以下三項主機端選項均已於 2026-11-09 在 3.2.0 節點上進行套用、測試及再次移除(nftables 1.0.9、iptables 1.8.10、nf_tables)。確切的指令與結果詳見第 8 節。
- 選項 A — 主機過濾器,根命名空間(Red Hat 的規則):運作方式如公開所述。 載入該規則後,攜帶 IPv4 選項封包的 TCP 連線會超時(無論是來自外部,或是從節點連至自身,埠號 22 和 443),而正常連線仍保持連線狀態, 且該規則的計數器數值上升。它位於產品及 Kubernetes 既有的七個 iptables-nft 表格之外的獨立 nftables 表格中,且不會修改這些表格。它 不具持久性:每次開機時都必須重新套用。
- 選項 B — 選項 A 無法偵測到的監聽器:已確認存在漏洞,且每項封堵措施均有效。
- 另一個網路命名空間。 在選項 A 啟用時,從根命名空間及鄰近容器集發出的、帶有 IPv4 選項的連線,仍可連接到該容器集的監聽器。根表在另一個命名空間內不適用。在該命名空間內載入相同的表,會導致相同的連線超時。這是針對 ovnmeta-* 命名空間;由於被檢查的節點沒有元資料命名空間,因此測試是在一個容器集命名空間中進行的。元資料代理會按需建立這些命名空間,因此新建立的命名空間在規則載入其中之前是未受保護的。
- 轉發的流量。 A prerouting 鏈中,若根表中存在相同規則,則會阻斷同一節點上(透過 cni0橋接; br_netfilter 已載入且 bridge-nf-call-iptables = 1) 以及連往另一節點上容器集的連線(透過 flannel 路由)。正常連線不受影響。主機自身開啟的連線不會受到此過濾機制影響。
- 在裝置層面。 某個主機側介面的 nftables netdev ingress 鏈,會在來自其後方工作負載且帶有 IPv4 選項的每個 TCP 封包抵達其他任何位置之前,將其丟棄。測試時使用容器集的 veth 作為虛擬機 tap 裝置的替代方案。對於虛擬機而言,由於 tap 裝置會動態增減,因此需要在 port plug 處設置鉤子。
- 方案 C — 網路邊界與租戶: 在雲端前端的防火牆或路由器上,拋棄帶有 IP 選項的 IPv4 TCP 封包。這同時也能保護租戶虛擬機免受外部威脅,而根命名空間中的任何主機規則都無法做到這一點: 由於採用分散式浮動 IP,其流量會通過 Open vSwitch,且永遠不會經過主機的 netfilter 鉤子。請通知租戶,其客體核心需要採用供應商提供的修補程式。 (未經測試)
非緩解措施: sysctl -w net.mptcp.enabled=0。在受影響的內核上,此舉僅能消除已示範的利用方式,且僅對之後建立的套接字生效,因此上述 40 個監聽器需重新啟動其服務。
6. 偵測與遭入侵指標 (IoCs)
(據本草案所知,目前尚無此 CVE 的公開 IoCs — 以下內容僅供參考。)
- 日誌簽名: 任何節點上 TCP/IPv4 路徑中的核心當機或警告: journalctl -k 以及以下情況的當機轉儲檔: 一般保護錯誤、 KASAN:slab-use-after -free, 程式錯誤: 或 Oops 與 ip_options_build, ip_build_and_send_pkt, tcp_v4_send_synack, tcp_check_req, tcp_v4_syn_recv_sock 或 inet_csk_route_req 等函式出現在追蹤記錄中。無法解釋的節點重新啟動將被計入,直到找到原因為止。
- 執行時行為: 帶有 IPv4 選項的合法 TCP 封包相當罕見,因此一旦發現就值得仔細檢視。此擷取篩選器曾用於驗證,並精確顯示了該規則會擋下的封包: tcpdump -l -ni any 『tcp and tcp[tcpflags] & tcp-syn != 0 and (ip[0] & 0x0f) > 5』. 當緩解措施已載入時,其計數器即為偵測器: nft list table inet cve_2026_98432.
8. 緩解步驟與驗證
請以 root 身分在節點上執行。
步驟 1 — 檢查正在運行的核心是否受影響
uname -r # 正在運行的核心版本:此處的版本才是關鍵
rpm -q kernel
觀察結果: 7.2. 11-1.el9.x86_64 (兩者皆然)。版本 7.2.10 或更新的 7.2 核心已包含修正程式,無需執行以下任何步驟。僅當節點版本低於已修正版本時才繼續操作, 這在 3.2.0 之前的發行版中即屬此情況。針對這些版本的修正方案是更新至 3.2.0;以下步驟為臨時緩解措施。
步驟 2 — 已發布的緩解指引(選項 A)
將 Red Hat 的表格儲存為 cve-2026-98432.nft:
table inet cve_2026_98432 {
chain input {
type filter hook input priority -310; policy accept;
ip protocol tcp ip hdrlength > 5 counter drop
}
}
檢查並載入該檔案:
nft --check --file cve-2026-98432.nft
nft --file cve-2026-98432.nft
nft list table inet cve_2026_98432
nft list 顯示的優先級為 raw - 10,此數值等同於 -310.
適用情況下的額外措施(方案 B):
# a) the same table inside every OVN metadata namespace (compute nodes)
for ns in $(ip netns list | awk '/^ovnmeta-/ {print $1}'); do
ip netns exec "$ns" nft --file cve-2026-98432.nft
done
# b) traffic forwarded to pods: a prerouting chain in the same table
nft add chain inet cve_2026_98432 prerouting '{ type filter hook prerouting priority -310; policy accept; }'
nft add rule inet cve_2026_98432 prerouting ip protocol tcp ip hdrlength '>' 5 counter drop
# c) at one workload's host-side device (DEV = its tap or veth)
nft -f - <<NFT
table netdev cve_2026_98432_dev {
chain ingress { type filter hook ingress device "$DEV" priority -500; policy accept;
ip protocol tcp ip hdrlength > 5 counter drop
}
}
NFT
上述設定在重新開機後均會失效。請在開機時重新套用,直至核心更新為止。
步驟 3 — 服務與重新開機
封包過濾器會立即生效,適用於新建立及現有的連線;在驗證過程中並未重新啟動任何服務。核心更新必須在重新開機並載入新核心後才會生效。
步驟 4 — 驗證緩解措施是否生效
此測試會建立一個普通的 TCP 連線,其封包(包含 SYN 封包在內)會攜帶四個位元的 IPv4 選項(NOP NOP NOP EOL,標頭長度為 6)。儲存為 synopt.py:
#!/usr/bin/env python3
# 使用方式:synopt.py 主機 埠 [opt|plain] [超時]
import socket, sys
host, port = sys.argv[1], int(sys.argv[2])
mode = sys.argv[3] if len(sys.argv) > 3 else 『opt』
tmo = float(sys.argv[4]) if len(sys.argv) > 4 else 4
s = socket.socket(socket.AF_INET, socket. SOCK_STREAM)
if mode == 『opt』:
s.setsockopt(socket.IPPROTO_IP, socket.IP_OPTIONS, b'\x01\x01\x01\x00')
s.settimeout(tmo)
try:
s.connect((host, port)); print(mode, 『CONNECTED』)
except socket.timeout:
print(mode, 『TIMEOUT』)
except OSError as e:
print(mode, 『ERROR』, e)
finally:
s.close()
測試節點(<節點 IP>)的測試結果,除非另有說明,否則皆來自叢集外的機器:
| 規則已載入 | 測試 | 結果 |
|---|---|---|
| 無(基準線) | synopt.py <node-ip> 22 opt,同樣來自該節點至其自身的流量 | 已連線;節點上的 tcpdump 顯示 SYN 封包的標頭長度為 6 |
| 選項 A | synopt.py <node-ip> 22 opt 以及 ... 443 opt | 超時 |
| 選項 A | synopt.py <node-ip> 22 plain 以及 ... 443 plain | 已連線 |
| 選項 A | 從節點到其自身,opt / plain | 超時 / 已連線;計數器 packets 12 bytes 768 |
| 選項 A | 從根命名空間連至容器集的監聽埠(:80),opt | 已連線:未涵蓋 |
| 選項 A | 同一節點上的容器集對容器集(ip netns exec <pod ns> python3 synopt.py <pod-ip> 80 opt) | 已連線:未涵蓋 |
| A + 容器集命名空間內的表格 | 上述兩項測試,opt / plain | 超時 / 已連線;該命名空間中的計數器 packets 6 |
| A + 預路由鏈 | 從容器集到容器集,同一節點,opt / plain | 超時 / 已連線 |
| A + 預路由鏈 | 從一個容器集連至另一個節點上的容器集,opt / plain | 超時 / 已連線 |
| A + 預路由鏈 | 從根命名空間連至容器集,opt | 已連線(本地開啟的連線不會經過預路由) |
| A + 容器集 veth 上的 netdev 入站規則 | 從該容器集連至另一個容器集以及主機的 22 號埠,opt | 超時;裝置鏈上的計數器 packets 6 |
| A + 容器集 veth 上的 netdev 入站規則 | 從該容器集連至另一個容器集,plain | 已連線 |
超時測試會在三秒內發送三次 SYN 封包,因此每次都會將計數器增加 3。
步驟 5 — 移除緩解措施
升級至 3.2.0 版本後,或測試完成後:
nft delete table inet cve_2026_98432 # 移除輸入鏈及預路由鏈
nft delete table netdev cve_2026_98432_dev # 若曾使用方案 c)
for ns in $(ip netns list | awk 『/^ovnmeta-/ {print $1}』); 執行
ip netns exec 「$ns」 nft delete table inet cve_2026_98432
完成
nft list tables | grep -c cve # 0
移除後的節點狀態:僅剩原始的七個表,任何命名空間中均無 cve 表。 iptables-save 位於 Kubernetes 鏈之外,且 ip6tables-save 與測試前備份的副本完全相同。在 KUBE-* 鏈內,規則數量未變(518),但順序有所不同,這是因為 Kubernetes 的網路政策控制器為其 cron 工作程式容器集重寫了這些規則。
參考文獻
變更紀錄
- 上游修復版本發布: 2026-10-11(穩定版 7.2.10)
- CVE 公布: 2026-10-15
- 在 CubeCOS 中修復: 3.2.0 (建置版本 CUBE_3.2.0_20261028-1148_d29636ca, 核心 7.2.11)
