竊取MCP服務(wù)器存儲的長期憑證
作為我們MCP安全系列第四篇文章,本文研究的漏洞不同于之前討論的協(xié)議層缺陷:許多MCP環(huán)境將第三方服務(wù)的長期API密鑰以明文形式存儲在本地文件系統(tǒng),且常配置不安全的全局可讀權(quán)限。該漏洞影響所有連接到LLM應(yīng)用的系統(tǒng),MCP環(huán)境功能越強大,不安全存儲憑證的風險就越高。
這一現(xiàn)象在MCP生態(tài)中極為普遍。我們在多個工具中觀察到該問題,從連接GitLab、Postgres和Google Maps的官方服務(wù)器,到Figma連接器和Superargs包裝器等第三方工具。攻擊者只需利用文件泄露漏洞即可竊取API密鑰,進而完全控制第三方服務(wù)中的數(shù)據(jù)。常見攻擊方式包括:
- 本地惡意軟件:用戶級惡意程序通過掃描固定路徑(如~/Library/Application Support/、~/.config/或應(yīng)用日志)竊取憑證
- 其他漏洞利用:利用同一系統(tǒng)上其他軟件的任意文件讀取漏洞獲取明文憑證
- 多用戶系統(tǒng):在共享工作站或服務(wù)器上,其他用戶可直接讀取全局可讀文件中的憑證
- 云備份:自動備份工具可能將服務(wù)器配置文件同步到云存儲,因配置不當導(dǎo)致憑證暴露
憑證竊取路徑分析
路徑1:不安全的配置文件
多數(shù)MCP服務(wù)器通過命令行參數(shù)或環(huán)境變量獲取憑證,這些參數(shù)通常源自宿主AI應(yīng)用管理的配置文件。我們在Google Maps、Postgres和GitLab的官方MCP服務(wù)器中均發(fā)現(xiàn)該模式。
以Claude Desktop為例,其在用戶主目錄創(chuàng)建claude_desktop_config.json文件,在macOS上該文件具有全局可讀權(quán)限:
$ ls -la ~/Library/Application\ Support/Claude\ Desktop/claude_desktop_config.json
-rw-r--r-- 1 user staff 2048 Apr 12 10:45 claude_desktop_config.json
路徑2:聊天日志泄露憑證
另一種常見模式是用戶直接將憑證輸入AI聊天界面,依賴模型將其傳遞給MCP服務(wù)器。Supercorp的Superargs包裝器就明確支持這種模式。
該方法存在雙重風險:惡意MCP服務(wù)器可直接從對話歷史竊取憑證;宿主AI應(yīng)用通常會將完整對話歷史(含嵌入憑證)記錄到本地日志文件。例如Cursor和Windsurf應(yīng)用將對話日志存儲為全局可讀文件:
$ ls -la ~/.cursor/logs/conversations/
-rw-r--r-- 1 user staff 15482 Apr 15 12:23 conversation_20240415.json
風險疊加案例:Figma連接器
某些實現(xiàn)會同時暴露兩種攻擊路徑。社區(qū)提供的Figma MCP服務(wù)器允許用戶通過工具調(diào)用設(shè)置API令牌,但隨后會使用Node.js的fs.writeFileSync函數(shù)將憑證保存到用戶主目錄的配置文件中。該函數(shù)默認創(chuàng)建權(quán)限為0666(-rw-rw-rw-)的文件,使得存儲的Figma令牌全局可讀(根據(jù)用戶umask設(shè)置可能還可寫)。
安全憑證管理方案
改進憑證存儲方式需要多方協(xié)作:
- 第三方服務(wù)應(yīng)增加OAuth支持,包括窄范圍短期令牌
- MCP開發(fā)者應(yīng)優(yōu)先使用操作系統(tǒng)提供的憑證存儲API(如Windows憑據(jù)管理API和macOS鑰匙串)
- 終端用戶應(yīng)審慎選擇軟件,或手動收緊AI軟件遺留敏感文件的權(quán)限
隨著MCP逐漸成為強大AI系統(tǒng)的基礎(chǔ)框架,我們必須扭轉(zhuǎn)"安全后置"的開發(fā)模式,從設(shè)計之初就將安全憑證處理作為最高優(yōu)先級。