跳转到内容

MCP安全系列之权限过大

该类问题主要指的是MCP工具权限太大,未遵循最小化权限原则,和Skill的过度权限、大模型的过度权限是相似的原理。之前文章可参考:

《Skill安全系列之过度权限》

《大模型安全TOP10-过度代理》

比如Cherry自带的filesystem这个MCP,可以指定一个操作目录,如果为了方便或者是工作需要,给它设置了级别较大的权限,比如整个C盘,那么意味着Agent可以对整个C盘就行读写操作,从而增加了风险。

image-20260818151813862

像有些MCP工具可能有时候做了权限设置,但是代码层存在风险,导致绕过的情况,比如我们用FastMCP开发一个读写文件的MCP工具,可以设置操作的目录,但是对目录没有做严格限制,导致可以通过../进行目录穿越。

示例代码:

from fastmcp import FastMCP
import os
# 设定允许操作的目录
BASE_DIR = "C:\\test"
mcp = FastMCP("Vuln_Agent")
@mcp.tool()
def read_file(filename: str) -> str:
"""读取文件内容"""
# 直接拼接,没有任何 ../ 过滤
target_path = os.path.join(BASE_DIR, filename)
try:
with open(target_path, "r", encoding="utf-8") as f:
return f.read()
except Exception as e:
return f"读取报错: {e}"
@mcp.tool()
def write_file(filename: str, content: str) -> str:
"""写入文件内容"""
# 直接拼接,没有任何 ../ 过滤
target_path = os.path.join(BASE_DIR, filename)
try:
with open(target_path, "w", encoding="utf-8") as f:
f.write(content)
return f"写入成功: {target_path}"
except Exception as e:
return f"写入报错: {e}"
if __name__ == "__main__":
mcp.run()

因为代码中直接将要操作的文件名和路径拼接了一起,所以我们传入文件名时可通过../进行穿越,测试结果:

image-20260818151340205

上面举例为文件读写的工具,其它类型的工具也有很多,只要涉及权限的就会存在权限大小问题,比如数据库操作,接口调用,身份认证等等。

基于权限问题OWASP给了很多防护措施,可以根据自己情况选择,比如最小化权限设置、给Token设置有效期、定期进行权限检查、记录具体的执行日志、给Agent分配唯一的身份,而不是多个Agent共用一个身份或共用同一个Token等。

以上就是本篇关于MCP安全系列之权限过大的相关内容,感谢阅读。