MCP安全系列之权限过大
MCP安全系列之权限过大
Section titled “MCP安全系列之权限过大”该类问题主要指的是MCP工具权限太大,未遵循最小化权限原则,和Skill的过度权限、大模型的过度权限是相似的原理。之前文章可参考:
《Skill安全系列之过度权限》
《大模型安全TOP10-过度代理》
比如Cherry自带的filesystem这个MCP,可以指定一个操作目录,如果为了方便或者是工作需要,给它设置了级别较大的权限,比如整个C盘,那么意味着Agent可以对整个C盘就行读写操作,从而增加了风险。

像有些MCP工具可能有时候做了权限设置,但是代码层存在风险,导致绕过的情况,比如我们用FastMCP开发一个读写文件的MCP工具,可以设置操作的目录,但是对目录没有做严格限制,导致可以通过../进行目录穿越。
示例代码:
from fastmcp import FastMCPimport 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()因为代码中直接将要操作的文件名和路径拼接了一起,所以我们传入文件名时可通过../进行穿越,测试结果:

上面举例为文件读写的工具,其它类型的工具也有很多,只要涉及权限的就会存在权限大小问题,比如数据库操作,接口调用,身份认证等等。
基于权限问题OWASP给了很多防护措施,可以根据自己情况选择,比如最小化权限设置、给Token设置有效期、定期进行权限检查、记录具体的执行日志、给Agent分配唯一的身份,而不是多个Agent共用一个身份或共用同一个Token等。
以上就是本篇关于MCP安全系列之权限过大的相关内容,感谢阅读。