NVIDIA Container Toolkit 1.16.1及以下版本在使用默認配置時存在一個TOCTOU競態條件攻擊漏洞。該漏洞不會影響容器設備接口(CDI)的使用,但若被成功利用,可能導致容器逃逸,使攻擊者能夠在宿主機上執行任意命令或獲取敏感信息。已知的攻擊場景需要受害者使用惡意鏡像,并在容器內通過NVIDIA Container Toolkit操作GPU資源。關于漏洞的詳細信息,請參見NVIDIA Container Toolkit,建議您及時修復。
影響范圍
集群中的GPU節點安裝了NVIDIA Container Toolkit組件,且組件版本為1.16.1及以下。
防范措施
在漏洞未修復之前,建議避免在集群中運行不可信的容器鏡像,以確保系統的安全性和穩定性。可參見以下兩種方案。
參見啟用安全策略管理啟用ACKAllowedRepos策略,限制只使用可信倉庫來源的鏡像,同時基于最小化權限原則確保只有可信人員具有導入鏡像的權限。
使用容器鏡像加簽和使用kritis-validation-hook組件實現自動驗證容器鏡像簽名功能,確保部署容器應用鏡像的安全完整性。
解決方案
本解決方案僅適用于ACK集群Pro版、ACK集群基礎版、ACK專有集群、ACK靈駿集群的托管節點池、ACK Edge集群的云端節點池。
如果您的集群類型為ACK靈駿集群,且節點池為靈駿節點池,請提交工單處理。
如果您的集群類型為ACK Edge集群,且節點池為邊緣節點池,修復方式請參見CVE-2024-0132和CVE-2024-0133修復方案。
前置條件
如果您的集群中安裝了cGPU模塊,請確保其版本為1.1.0及以上。如未安裝cGPU模塊,請跳過。確認集群是否安裝cGPU模塊及升級方式如下。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在Helm詳情頁面,查看組件版本。
如果您的集群同時存在ack-ai-installer和ack-cgpu,請提交工單處理。
如果您的集群安裝了ack-ai-installer組件,且版本為1.7.5以下,請升級ack-ai-installer組件。相關操作,請參見升級共享GPU調度組件。
如果您的集群安裝了ack-cgpu組件,且版本為1.5.1以下,請單擊組件右側更新,按照頁面指引完成組件的升級。
相關組件升級完成后,針對集群中存量cGPU節點,請參見升級節點cGPU版本。
修復方案
新建GPU節點:針對2024年10月27日及之后新建的GPU節點,ACK已在1.20及以上版本的集群中發布了NVIDIA Container Toolkit v1.16.2,可自動完成修復。
若您的集群版本較低,建議您及時升級版本,請參見升級集群。
存量GPU節點:針對2024年10月27日之前創建的存量GPU節點,均需通過執行CVE修復腳本進行手動修復。您可以展開下方折疊面板查看手動修復方案。
說明在修復過程中,請分批進行節點修復操作,避免同時修復所有節點,以確保系統穩定性。
修復過程中會重啟節點上正在運行的業務Pod。請在業務低谷期進行。
步驟1:節點排水
控制臺
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在節點頁面中勾選目標節點并單擊最下方節點排水,在彈出框中單擊確定。
kubectl
執行以下命令,設置指定的節點為不可調度狀態。
kubectl cordon <NODE_NAME>
執行以下命令,進行節點排水操作。
kubectl drain <NODE_NAME> --grace-period=120 --ignore-daemonsets=true
步驟2:節點上執行修復腳本
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在節點頁面中勾選目標節點并單擊最下方批量運維,在彈出框中選中執行 Shell 命令后,單擊確定。
在彈出系統運維管理(OOS)的基本信息頁簽中,參見如下表格進行配置,然后單擊下一步:設置參數。
配置項
參數
執行描述
修復NVIDIA Container Toolkit CVE
模板類別
公共任務模板
模板選擇
ACS-ECS-BulkyRunCommand
執行模式
失敗暫停
在設置參數頁簽中單擊運行Shell腳本,并將如下CVE修復腳本放入命令內容中,單擊下一步:確定。
#!/bin/bash set -e # 設置節點所在的Region。 export REGION=$(curl 100.100.100.200/latest/meta-data/region-id 2>/dev/null) if [[ $REGION == "" ]];then echo "Error: failed to get region" exit 1 fi cd /tmp curl -o upgrade_nvidia-container-toolkit.tar.gz https://aliacs-k8s-${REGION}.oss-${REGION}-internal.aliyuncs.com/public/pkg/nvidia-container-runtime/upgrade_nvidia-container-toolkit.tar.gz tar -xf upgrade_nvidia-container-toolkit.tar.gz cd pkg/nvidia-container-runtime/upgrade/common bash upgrade-nvidia-container-toolkit.sh
在確定頁簽中核對創建信息,確認無誤后單擊創建。
任務執行完成后,在系統運維管理控制臺左側導航欄,選擇 ,找到對應任務的執行輸出,單擊查看。
如果腳本輸出如下內容,表明當前節點環境不存在CVE漏洞,機器上未執行任何變更,可忽略。
2024-10-22/xxxx INFO No need to upgrade current nvidia-container-toolkit(1.16.2)
如果腳本輸出如下內容,那么表示該節點環境存在NVIDIA Container Toolkit漏洞且已被修復。
2024-10-10/xxxxx INFO succeed to upgrade nvidia container toolkit
步驟3:上線節點
控制臺
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在節點頁面中勾選目標節點并單擊最下方設置調度狀態,在彈出框選中設置為可調度,然后單擊確定。
kubectl
執行以下命令,進行節點上線操作。
kubectl uncordon <NODE_NAME>
(可選)步驟4:驗證GPU節點
完成上述操作以后,建議參考如下文檔中的示例YAML部署一個GPU應用,驗證節點是否能夠正常工作。
獨占GPU:使用Kubernetes默認GPU調度。
共享GPU:運行共享GPU調度示例。