使用说明
麦克波迪特
MCP服务器Python代码的安全扫描程序。在漏洞进入生产环境之前发现漏洞。
pip install mcp-vulnscan
mcp-vulnscan ./my-mcp-server
它发现了什么
| 规则 | CWE | 严重性 |
|---|---|---|
外壳注入——用户输入 subprocess/os.system 未经消毒 |
CWE-78 | 高 |
代码注入——用户输入 eval()/exec() |
CWE-95 | 高 |
SQL注入——原始用户输入 cursor.execute() 查询 |
CWE-89 | 高 |
| 路径遍历--不进行路径边界验证的文件操作 | CWE-22 | 高/中 |
SSRF——用户输入的HTTP请求URL(包括 Session().get()) |
CWE-918 | 高/中 |
| 硬编码机密-源代码中的API密钥和凭据 | CWE-798 | 高 |
| 提示注入——用户获取的内容返回到LLM | CWE-020 | 介质 |
不安全的反序列化--用户输入到 pickle.loads, yaml.load |
CWE-502 | 高/中 |
模板注入——用户输入 jinja2.Template() 或 env.from_string() |
CWE-94 | 高/中 |
XML注入(XXE)——用户输入 ET.fromstring() 或 lxml.etree.fromstring() |
CWE-611 | 高/中 |
| LDAP注入——LDAP搜索过滤器中的用户输入无需转义 | CWE-90 | 高/中 |
| 日志注入——用户输入作为日志消息(启用日志伪造) | CWE-117 | 高/中 |
严重性为 高 用于确认MCP工具处理人员(@mcp.tool), 中等 对于未知的上下文。
用法
# Scan a directory
mcp-vulnscan ./path/to/server
# Output as JSON for CI/CD
mcp-vulnscan ./path/to/server --format json
# Output as SARIF for GitHub Code Scanning
mcp-vulnscan ./path/to/server --format sarif --output-file results.sarif
# Only show high and critical findings
mcp-vulnscan ./path/to/server --min-severity high
# Run only specific rules
mcp-vulnscan ./path/to/server --rules shell_injection,path_traversal
# Exit code 0 even when findings exist (for reporting without blocking)
mcp-vulnscan ./path/to/server --no-exit-code
# Include test files (excluded by default)
mcp-vulnscan ./path/to/server --no-default-excludes
# Exclude generated code
mcp-vulnscan ./path/to/server --exclude '**/generated/**'
# Write output to a file
mcp-vulnscan ./path/to/server --format json --output-file findings.json
基线模式(CI入职)
从现有代码库建立基线,这样CI只会失败 新 调查结果:
# First run: saves current findings as baseline, exits 0
mcp-vulnscan ./src --baseline baseline.json
# Subsequent runs: only reports findings NOT in baseline
mcp-vulnscan ./src --baseline baseline.json
承诺 baseline.json 到你的仓库。从那时起,扫描仪只会阻止回归。
配置文件
生成项目配置:
mcp-vulnscan init
这创造了 .mcpaudit.toml 在当前目录中:
[mcpaudit]
min_severity = "low"
format = "text"
exclude = [
"**/generated/**",
"**/vendor/**",
]
rules = [] # empty = all rules
CLI标志始终覆盖配置文件。
抑制发现
添加注释以抑制特定行上的发现:
result = eval(expr) # mcpaudit: ignore
result = eval(expr) # mcpaudit: ignore[CWE-95]
cursor.execute(query) # mcpaudit: ignore[CWE-89]
CWE特定的抑制只会使该线路上的CWE静音;其他规则仍然适用。
GitHub 操作
在CI中运行测试
- name: Run mcpaudit
run: mcp-vulnscan ./src --format sarif --output-file mcpaudit.sarif --no-exit-code
- name: Upload to GitHub Code Scanning
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: mcpaudit.sarif
阻止新发现的PR
- name: mcpaudit (baseline diff)
run: mcp-vulnscan ./src --baseline baseline.json
运作原理
mcpaudit使用以下命令解析Python源代码 ast 模块和跟踪来自MCP工具的数据流
危险水槽的参数。它将每个功能分为:
- 工具 --装饰有
@mcp.tool或@server.call_tool→ 调查结果报告为 高 - 未知 --无分类器信号→ 调查结果报告为 中等
- 安全的 --CLI代码,
@classmethod、utils目录、测试函数→ 未标记
跟踪导入别名-- import subprocess as sp; sp.run(cmd, shell=True) 被检测到。
跟踪基于会话的HTTP调用-- requests.Session().get(url) 被检测到。
没有外部API调用。完全脱机运行。
许可证
麻省理工学院
