Python代码安全扫描工具

MCP服务器Python代码的安全扫描工具,可在代码进入生产环境前发现漏洞。

  • by AnayGarodia
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 AnayGarodia/mcpaudit

使用说明

麦克波迪特

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调用。完全脱机运行。

许可证

麻省理工学院