深度技术实战:自定义 MCP 自动化分析漏洞利用链
在现代应用安全审计中,传统的静态代码分析工具(SAST)往往面临误报率高、难以追踪复杂调用链的问题。结合图数据库的强大查询能力与大语言模型(LLM)的语义理解能力,我们可以构建一套更加智能、精准的自动化漏洞挖掘流程。本文将详细介绍如何通过 Tabby 生成函数关系图,利用 Neo4j Cypher 语句提取潜在恶意调用链,并编写自定义 MCP Server 及 Skill,让 AI 模型自动化审计
在现代应用安全审计中,传统的静态代码分析工具(SAST)往往面临误报率高、难以追踪复杂调用链的问题。结合图数据库的强大查询能力与大语言模型(LLM)的语义理解能力,我们可以构建一套更加智能、精准的自动化漏洞挖掘流程。
本文将详细介绍如何通过 Tabby 生成函数关系图,利用 Neo4j Cypher 语句提取潜在恶意调用链,并编写自定义 MCP (Model Context Protocol) Server 及 Skill,让 AI 模型(如 Gemini-3-flash)自动化审计这些调用链,判断漏洞的真实性。
1. 静态分析与调用链生成
我们以一个开源的 Spring Boot 项目(springboot-manager)为例,分析其 Web 入口点到潜在 Sink 点的调用路径。
1.1 使用 Tabby 生成代码属性图 (CPG)
Tabby 是一款基于 Soot 的 Java 代码分析工具,能够将 Java 代码转换为代码属性图并导入 Neo4j。
Bash
# 启动 Tabby 进行分析
java -Xmx8g -jar tabby.jar
分析完成后,项目的类、方法及其调用关系将被存储在 Neo4j 数据库中。
1.2 Cypher 语句提取利用链
我们需要编写 Cypher 查询语句,从 Web 入口(如 @RequestMapping 注解的方法)出发,寻找通往危险函数(Sink)的路径。
以下是一个查询示例,用于查找从 Web Controller 到指定漏洞 Sink 点(vul_list)的调用链,深度限制为 5 层:
Cypher
MATCH (source:Method)
MATCH (source_c:Class)
WHERE source.CLASSNAME = source_c.NAME
AND source_c.ANNOTATIONS IN ["RequestMapping","PostMapping","DeleteMapping","PutMapping","GetMapping"]
MATCH (sink:Method)<-[:CALL]-(m1:Method)
WHERE sink.NAME IN {vul_list} // vul_list 需替换为具体的危险函数列表,如 exec, eval 等
CALL apoc.algo.allSimplePaths(source, m1, "ALIAS>|CALL>", 5) YIELD path
RETURN *
LIMIT 100
执行查询后,我们将得到的函数调用关系导出为 output.xlsx 文件。每一行代表一条潜在的恶意利用链,格式如:Controller.method -> Service.method -> ... -> Sink.method。
2. 构建 MCP Server:连接数据与 AI
为了让 AI 理解这些调用链并进行代码审计,我们需要构建一个 MCP Server。它的核心职责是:
-
解析数据:读取
output.xlsx中的调用链信息。 -
提取上下文:根据调用链中的类名和方法名,从项目源码中提取对应的代码片段。
-
提供工具:向 AI 暴露工具函数,使其能够主动请求特定链的详细信息。
2.1 核心代码实现 (Python + FastMCP)
我们使用 fastmcp 库快速构建服务。
核心逻辑:定位源码文件
Python
def find_class_file(fqn: str) -> Optional[Path]:
"""根据全限定类名定位 Java 源码文件"""
source_root = ROOT / "springboot-manager-master" / "src" / "main" / "java"
parts = fqn.split(".")
# 尝试直接匹配
candidate = source_root.joinpath(*parts).with_suffix(".java")
if candidate.exists():
return candidate
# 模糊搜索(处理内部类等情况)
simple_name = parts[-1].split("$")[0] + ".java"
for path in source_root.rglob(simple_name):
# 简单校验 package 声明
# ... (省略具体校验代码)
return path
return None
MCP 工具定义:获取链分析上下文
Python
@mcp.tool()
def get_chain_analysis_context(row_index: int) -> Dict[str, Any]:
"""
获取指定恶意调用链的完整审计上下文。
"""
# 1. 加载 Excel 数据
summary = load_output()
sheet_data = summary.get("Sheet", {}).get("data", [])
raw_chain = [str(c) for c in sheet_data[row_index] if c]
# 2. 提取源码
involved_classes = {}
for cell in raw_chain:
# 解析 "method(class.fqn)" 格式
match = re.match(r"(\w+)\(([\w\.]+)\)", cell)
if match:
_, fqn = match.groups()
if fqn not in involved_classes:
file_path = find_class_file(fqn)
# 读取源码内容...
return {
"row_index": row_index,
"chain_sequence": " -> ".join(raw_chain),
"involved_classes": involved_classes, # 包含类名到源码的映射
"prompt_hint": "请扮演高级安全审计专家..."
}
2.2 配置 Trae 加载 MCP
在 Trae 编辑器中配置 mcpServers,使其能够启动并连接我们的 Python 服务。
JSON
{
"mcpServers": {
"sink_mcp": {
"command": "python",
"args": ["d:\\path\\to\\server.py"],
"env": {"PYTHONPATH": "d:\\path\\to\\project"}
}
}
}
3. 进阶优化:基于 Skill 的精准审计
虽然基本的 MCP Server 能工作,但在实际使用中发现了一些痛点:上传全量文件 Token 消耗大、无需分析原生 Sink 代码、缺乏日志记录等。为此,我们开发了一套 Trae Skill 来进一步优化流程。
3.1 Skill 功能增强点
-
代码切片:不再上传整个 Java 文件,而是利用正则精准提取调用链涉及的方法代码片段。
-
智能过滤:自动跳过调用链末端的 Sink 函数(通常是 JDK 或第三方库代码,无需审计)。
-
持久化记录:自动将分析过程记录到
sink_analysis.log,并将结构化结果保存为chains_data.json。 -
环境感知:自动识别项目根目录,无需硬编码路径。
3.2 关键代码:方法提取器
为了节省 Token,我们实现了一个基于正则的方法提取器:
Python
def extract_method_code(file_content: str, method_name: str) -> str:
"""从文件内容中提取特定方法的代码片段"""
lines = file_content.splitlines()
# 匹配方法签名
method_start_regex = re.compile(
fr"^\s*(?:public|protected|private|static|\s)*[\w<>\[\]\s]+\s+{re.escape(method_name)}\s*\(",
re.MULTILINE
)
# ... (通过大括号计数算法提取完整方法体)
return "\n".join(snippet_lines)
3.3 Skill 定义文件
我们在 .trae/skills 目录下创建 skill.md,向 AI 描述如何使用这些工具。
Markdown
# Sink 分析技能
本技能提供工具用于分析 `output.xlsx` 中识别出的恶意调用链...
## 工具
### 1. list_all_chains
列出所有发现的调用链摘要。
### 2. analyze_chain
检索特定链的详细上下文(仅包含相关方法源码),并自动跳过 Sink 节点。
4. 实战效果与总结
通过这套 Skill,Trae 能够:
-
读取 Excel 中的所有潜在利用链。
-
逐条提取 链中各个节点的方法源码片段。
-
推理 参数传递过程,判断
source传入的参数是否经过了有效的过滤,最终是否到达sink。
实战成果:
-
任意文件上传:AI 成功验证了一条上传路径,参数未做校验直接写入磁盘。
-
误报剔除:对于一条看似危险的文件删除链,AI 准确指出删除路径受 ID 控制(需先查库),用户无法直接控制路径,判定为低危。
-
新漏洞发现:由于 Skill 修复了之前 MCP 分析不全的问题,AI 在新的一轮分析中发现了一条潜在的模板注入路径。
总结: 这种 "Tabby 图数据库检索 + 自定义 MCP/Skill 上下文提取 + LLM 语义审计" 的模式,相比于传统的全量代码投喂,具有Token 消耗低、上下文精准、误报率可控的显著优势。它将静态分析的广度与 AI 审计的深度完美结合,是自动化漏洞挖掘的一个高效方向。
更多推荐



所有评论(0)