Knowns MCP 路徑穿越漏洞恐讀寫刪任意 .md 檔
GitHub Advisory Database(GHSA-9gfj-28hw-jchp)· 2026-09-25
Knowns 是一套讓 AI agent 存取文件與記憶體的 MCP(Model Context Protocol)工具伺服器,其 docs 與 memory 工具在處理路徑參數時,並未檢查組合後的路徑是否仍落在專案資料夾之內;攻擊者只要在 path、newPath 或 id 參數中夾帶 ../ 相對路徑,就能讓伺服器對專案外的任意 .md 檔案進行讀取、寫入或刪除。此漏洞已登記為 CVE-2026-86439,經 GHSA-9gfj-28hw-jchp 於 2026-09-25 公布,CVSS 3.1 評分為 8.8 分(高風險)。對正在自架 MCP docs/memory server 供 agent 使用的團隊來說,這代表惡意 agent 或第三方 MCP client 能直接跨出沙箱邊界,碰觸主機上其他敏感檔案。
漏洞機制
doc_store.go 裡的 Get、Create、Update、Rename、Delete,以及 memory_store.go 對應的函式,全部直接用 filepath.Join() 把使用者輸入的路徑接到基準目錄後面,卻從未在組合後檢查結果是否仍以該目錄開頭。由於 filepath.Join 會原生解析 ../,呼叫 docs.get 帶入 path=../../../victim/secret,或對 memory.update 帶入 id=x/../../../../victim/secret,都能讓伺服器越界讀寫檔案。更麻煩的是,docs.update 帶入 newPath 會觸發內部 Rename(),而 Rename() 會用 os.Remove 刪除舊路徑檔案;權限清單卻把 docs.update 歸類為 CapWrite 而非 CapDelete,讓設定「唯讀寫不可刪」的呼叫者仍能藉改名操作刪掉沙箱外的任意檔案。
// 修補前(GHSA-9gfj-28hw-jchp 揭露的原始程式碼)
func (ds *DocStore) Delete(path string) error {
path = strings.TrimSuffix(path, ".md")
absPath := filepath.Join(ds.docsDir(), filepath.FromSlash(path)+".md")
return os.Remove(absPath) // 無目錄限制檢查
}
// 修補後(advisory 建議的容納性檢查模式)
absPath := filepath.Join(ds.docsDir(), filepath.FromSlash(path)+".md")
if !strings.HasPrefix(absPath, ds.docsDir()) {
return fmt.Errorf("path escapes docs directory")
}
return os.Remove(absPath)受影響版本
- 套件名稱與生態系:
knowns(npm) - 受影響版本範圍:
<= 0.29.1 - 修補版本:
0.30.0 - CVSS 3.1 向量:
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H(分數8.8)
修補與緩解
受影響對象是自行架設 Knowns MCP docs/memory server 供 AI agent 存取的團隊:只要 agent 或第三方 MCP client 能呼叫 docs.*、memory.* 工具,伺服器主機上任何該行程可讀寫的 .md 檔案都在風險範圍內。官方已於 v0.30.0 修補此問題,對應提交為 commit 09c5a96,應盡快把 knowns 升級到 0.30.0 以上。在完成升級前,建議先替 MCP server 啟用密碼驗證,因為 advisory 指出先前已知的認證繞過漏洞會讓此路徑穿越在未輸入密碼時也能被匿名觸發;同時應避免把 docs/memory 目錄與任何存放機密內容的路徑放在同一個可寫入範圍內。
原始來源:GHSA-9gfj-28hw-jchp — Knowns Unrestricted Path Traversal (GitHub Advisory Database)