觀點 · 資訊分享
OpenHands SDK 沙箱預設不驗身分:連得到 port 就能以 root 下指令,CVSS 9.8,請升到 1.52.0
OpenHands Software Agent SDK 1.52.0 以前,Docker 與 Apptainer 沙箱的 agent server 綁在 0.0.0.0 又預設沒有金鑰,連得到 port 就能以 root 執行指令、讀明文秘密。CVE 10 月 26 日才公開,專案 10 月 3 日已修、10 月 5 日發布 1.52.0。
- 發布
- 2026-10-27
- 篇幅
- 約 6 分鐘 · 2,503 字
- 結構
- 7 節 + 4 題常見問題
- 標籤

一句話看懂:OpenHands 的 Software Agent SDK 在 1.52.0 以前,把 AI 代理沙箱的 agent server 開在所有網路介面上,而且預設沒有任何金鑰,連得到那個 port 的人就能以 root 在沙箱裡下指令、讀工作區和明文秘密。專案早在 10 月 3 日合併修正、10 月 5 日發布 1.52.0,CVE-2026-112346 則是 10 月 26 日才公開。

先用白話講:AI 代理的沙箱是什麼?
讓 AI 代理自己跑指令、改檔案很方便,但也很危險,所以通常會把它關進一個「沙箱」:一個 Docker 容器,裡面有一個小伺服器(agent server)負責接收「執行這行指令」「讀這個檔案」的請求。
你可以想像成請了一位工讀生在獨立的小房間工作,房間裡有一支對講機。問題是,這次的 SDK 把對講機接到整棟大樓的廣播系統,而且沒有設通關密語:大樓裡任何人拿起對講機講話,工讀生都會照做,而且他在房間裡是 root,什麼都能做。
發生什麼事
- CVE-2026-112346 於 2026 年 10 月 26 日由 VulnCheck 公開並收錄進 NVD,CVSS 3.1 分數 9.8、CVSS 4.0 為 9.3,弱點類型 CWE-1327(綁定到不受限制的 IP 位址)
- 受影響:OpenHands Software Agent SDK 1.52.0 以前的 DockerWorkspace 與 Apptainer 工作區啟動器
- 問題:沙箱的 agent server 綁在 0.0.0.0(所有介面),而
session_api_keys預設是空清單,等於關掉認證 - 後果:能連到被發布出來的容器 port 的人,可以用未認證的 HTTP 與 WebSocket 請求,以 root 身分在沙箱內執行任意指令、存取掛載進去的工作區、讀取 secrets store 裡的明文秘密
要特別說明的是,這是一個晚發的 CVE:專案在 9 月 21 日就開出修正 PR #5209,10 月 3 日合併、10 月 5 日隨 v1.52.0 發布,只是當時沒有以安全公告的形式說明。所以「新聞」是 10 月 26 日的,「修補」其實三週前就在了。
修了什麼
| 1.52.0 以前 | 1.52.0 以後 | |
|---|---|---|
| Docker port 發布位置 | 主機的所有介面 | 只發布到主機的 127.0.0.1 |
| 容器內 agent server | 監聽 0.0.0.0 | 仍監聽 0.0.0.0(Docker 轉發需要),但外面只有本機進得來 |
| 工作階段金鑰 | SDK 客戶端沒帶 | 設定好的金鑰會傳給客戶端,HTTP 與 WebSocket 請求都帶上 |
PR 的說明寫得很清楚:DockerWorkspace 本來就是本機管理的工作區,SDK 客戶端是透過 127.0.0.1 連的,但 Docker 卻把 API 與選用的 VS Code port 發布到每個主機介面;把發布位址對齊客戶端位址,預設行為就回到只有本機能連。
給開發者的技術細節
- 先查版本:OpenHands Software Agent SDK 低於 1.52.0 就升級
- 自己檢查綁定:對跑中的沙箱容器執行
docker port <容器> 8000/tcp,正常應看到127.0.0.1:<port>,看到0.0.0.0:<port>就是對外開的 - 一定要設金鑰:主機不是只有你自己會連時(雲端主機、共用開發機、內網),替 agent server 設定工作階段金鑰,讓每個請求都要帶
- 防火牆兜底:雲端主機的安全群組只放行需要的來源,不要依賴應用程式自己的預設值
- 這個教訓不只 OpenHands:任何「容器裡開一個 API 讓本機工具呼叫」的設計,
-p 8000:8000都等於-p 0.0.0.0:8000:8000,要寫成-p 127.0.0.1:8000:8000才只對本機開
我的看法
我在家用 NAS 上自架服務,Docker 的 -p 沒寫 IP 就對整個網路開,這個坑我自己也提醒過自己很多次。AI 代理的沙箱特別危險,因為它的本職就是「照指令執行」,一旦對外開又沒認證,攻擊者連找漏洞都不用,直接下指令就好。
另一個值得注意的點是「晚發 CVE」:專案 10 月初就修了、也發了新版,但沒有安全公告,用的人可能根本不知道這是一個 9.8 分的修正而沒有急著升級。自架或自用這類開源 AI 工具時,不能只看 release note 有沒有寫 security,最好把 NVD 或 GitHub 的安全公告訂起來。至於結論很簡單:升到 1.52.0、檢查 docker port、設金鑰。
名詞小辭典
- 沙箱(sandbox):隔離出來讓不受信任的程式執行的環境,這裡指跑 AI 代理的容器。
- 0.0.0.0:代表「所有網路介面」,服務綁在這個位址就是對機器上每張網卡開放。
- 127.0.0.1(loopback):只有同一台機器自己能連到的位址。
- CWE-1327:弱點分類「綁定到不受限制的 IP 位址」,也就是服務預設對外開放。