在现代应用安全审计中,传统的静态代码分析工具(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。它的核心职责是:

  1. 解析数据:读取 output.xlsx 中的调用链信息。

  2. 提取上下文:根据调用链中的类名和方法名,从项目源码中提取对应的代码片段。

  3. 提供工具:向 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 功能增强点

  1. 代码切片:不再上传整个 Java 文件,而是利用正则精准提取调用链涉及的方法代码片段

  2. 智能过滤:自动跳过调用链末端的 Sink 函数(通常是 JDK 或第三方库代码,无需审计)。

  3. 持久化记录:自动将分析过程记录到 sink_analysis.log,并将结构化结果保存为 chains_data.json

  4. 环境感知:自动识别项目根目录,无需硬编码路径。

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 能够:

  1. 读取 Excel 中的所有潜在利用链。

  2. 逐条提取 链中各个节点的方法源码片段。

  3. 推理 参数传递过程,判断 source 传入的参数是否经过了有效的过滤,最终是否到达 sink

实战成果:

  • 任意文件上传:AI 成功验证了一条上传路径,参数未做校验直接写入磁盘。

  • 误报剔除:对于一条看似危险的文件删除链,AI 准确指出删除路径受 ID 控制(需先查库),用户无法直接控制路径,判定为低危。

  • 新漏洞发现:由于 Skill 修复了之前 MCP 分析不全的问题,AI 在新的一轮分析中发现了一条潜在的模板注入路径。

总结: 这种 "Tabby 图数据库检索 + 自定义 MCP/Skill 上下文提取 + LLM 语义审计" 的模式,相比于传统的全量代码投喂,具有Token 消耗低、上下文精准、误报率可控的显著优势。它将静态分析的广度与 AI 审计的深度完美结合,是自动化漏洞挖掘的一个高效方向。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐