觀點 · 資訊分享

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#AI Agent#資安漏洞#CVE-2026-112346#Docker
OpenHands SDK 沙箱預設不驗身分:連得到 port 就能以 root 下指令,CVSS 9.8,請升到 1.52.0

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

OpenHands SDK 沙箱預設不驗身分資訊圖卡:1.52.0 以前,沙箱 port 對所有介面開放又沒有金鑰,連得到就能以 root 下指令

先用白話講: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 位址」,也就是服務預設對外開放。

資料來源

常見問題

OpenHands Software Agent SDK 是什麼?
OpenHands 是開源的 AI 程式代理專案,Software Agent SDK 讓開發者用程式碼組合自己的代理,並把代理丟進 Docker 或 Apptainer 容器這類「沙箱」裡執行指令、改檔案。這次的問題就出在沙箱裡那個接收指令的 agent server。
我只是在自己的筆電上跑,會有事嗎?
風險取決於誰連得到那個 port。問題版本把 port 發布到主機的所有網路介面,所以同一個 Wi-Fi、公司內網或 VPN 裡的其他裝置都可能連得到;如果是雲端主機又沒有防火牆,那就是整個網際網路。只有在防火牆確實擋住對外連線時才算安全。
為什麼 10 月初就修好的東西,10 月 26 日才變成新聞?
專案 9 月 21 日開出修正、10 月 3 日合併、10 月 5 日隨 v1.52.0 發布,當時沒有以安全公告的形式對外說明。CVE 編號是 10 月 26 日由 VulnCheck 公開,NVD 同日收錄,才引起注意。這代表就算你有跟著升級,也可能不知道自己修掉了一個 9.8 分的洞。
升級以外還能做什麼?
官方修法就是最好的檢查清單:用 docker port 看沙箱的 port 是不是只綁在 127.0.0.1;替 agent server 設定工作階段金鑰,讓每個 HTTP 與 WebSocket 請求都要帶金鑰;主機層再加一道防火牆,只放行真正需要的來源。
作者

韓滷 · 全端系統工程師

接案做系統開發、網站與主機託管。觀點裡的文章都是我自己寫的,寫的是做專案時第一手遇到的事。

LINE