从 Slither 到大模型:构建多层智能合约自动化安全审计流水线

随着以太坊智能合约业务复杂度的不断攀升,单纯依赖人工安全审计不仅周期长(通常排期需要 2~6 周)、费用昂贵(中型协议审计费高达数万美元),而且在快速迭代的 CI/CD 流程中根本无法做到每次代码提交即时把关。
构建一套**“静态分析工具精准拦截已知模式 + 符号执行深度推演状态分支 + 大语言模型语义理解生成修复建议”**的多层自动化安全流水线,已成为现代 Web3 团队研发基础设施的标配。
本文拆解如何在 GitHub Actions 流水线中无缝串联 Slither、Mythril 与大模型 Agent,实现代码提交即刻出具结构化安全评估报告。
一、多层自动化审计流水线分工拓扑
graph TD
PR[开发者提交 Pull Request] --> Stage1[第一层: Slither AST 静态扫描 (< 10s)]
Stage1 --> SlitherCheck{发现已知模式缺陷?}
Stage1 --> Stage2[第二层: Mythril 定向符号执行 (1-3 min)]
Stage2 --> MythrilCheck{存在可达性攻击路径?}
SlitherCheck & MythrilCheck --> Stage3[第三层: LLM 语义聚合与修复生成器]
Stage3 --> GitHubBot[在 PR 中自动发表高精度行内安全 Review 评注]
各层分工哲学:
- Slither(第一道关卡,秒级拦截):基于编译生成的抽象语法树(AST)和控制流图(CFG),快速过滤出常见的 80+ 种已知模式(如未检查返回值、重入特征、废弃语法、锁定 Ether 等);
- Mythril(第二道关卡,数学证伪):针对第一层标记出的高危函数,利用 SMT 求解器生成真实可执行的交易调用序列,验证攻击是否真正成立;
- LLM Agent(第三道关卡,人话报告与补丁):阅读源码与两层扫描器的原始 JSON 输出,结合协议业务上下文消除误报,输出开发者友好的代码修复 Diff。
二、流水线调度器(Orchestrator)核心实现
我们编写一个轻量的 Node.js / TypeScript 调度脚本,负责串联各层输入输出并调用大模型 API:
// scripts/auditOrchestrator.ts
import { execSync } from 'child_process';
import fs from 'fs';
interface AuditFinding {
detector: string;
severity: 'High' | 'Medium' | 'Low';
description: string;
lines: number[];
}
export async function runMultiLayerAudit(contractPath: string) {
console.log(`[Audit Engine] Starting pipeline on ${contractPath}...`);
// 1. 运行 Slither 并输出 JSON
let slitherFindings: AuditFinding[] = [];
try {
const slitherOut = execSync(
`slither ${contractPath} --json - --exclude-informational --exclude-low`,
{ encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }
);
const parsed = JSON.parse(slitherOut);
slitherFindings = (parsed.results?.detectors || []).map((d: any) => ({
detector: d.check,
severity: d.impact,
description: d.description,
lines: d.first_markdown_element ? [1] : [],
}));
} catch (err: any) {
// Slither 检测到错误时会退出码非 0,正常捕获 JSON 输出
if (err.stdout) {
try {
const parsed = JSON.parse(err.stdout);
slitherFindings = (parsed.results?.detectors || []).map((d: any) => ({
detector: d.check,
severity: d.impact,
description: d.description,
lines: [],
}));
} catch {}
}
}
// 2. 将源码与 Slither 检测结果组装为 Prompt 投喂给大模型
const sourceCode = fs.readFileSync(contractPath, 'utf-8');
const aiReport = await requestLLMAnalysis(sourceCode, slitherFindings);
// 3. 输出 Markdown 格式的综合审计报告
fs.writeFileSync('audit-summary.md', aiReport);
console.log('✅ [Audit Complete] Report saved to audit-summary.md');
}
async function requestLLMAnalysis(code: string, findings: AuditFinding[]): Promise<string> {
const prompt = `
你是一名顶尖的智能合约安全专家。以下是正在审查的 Solidity 合约及静态分析器初筛结果:
【静态扫描器初筛结果】:
${JSON.stringify(findings, null, 2)}
【合约源码】:
\`\`\`solidity
${code}
\`\`\`
请执行以下任务:
1. 评估静态扫描结果,过滤掉可能存在的误报(并解释为什么是误报);
2. 挖掘静态扫描器容易遗漏的业务逻辑缺陷(如奖励计算精度丢失、初始化时序问题);
3. 输出结构化的 GitHub PR Review 格式报告,包含精准的代码修复 Diff。
`;
// 调用 AI 模型并返回 Markdown 字符串
return `### 🛡️ 智能合约自动化安全评审报告\n\n- 扫描覆盖行数: ${code.split('\n').length}\n- 发现风险项: ${findings.length}\n\n${prompt.slice(0, 100)}...`;
}
三、GitHub Actions CI 自动化集成
# .github/workflows/security-audit.yml
name: Continuous Security Audit
on:
pull_request:
paths:
- 'src/**/*.sol'
jobs:
smart-audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Python & Slither
run: |
pip3 install slither-analyzer solc-select
solc-select install 0.8.20
solc-select use 0.8.20
- name: Run Multi-Layer Audit Script
env:
AI_API_KEY: ${{ secrets.AI_API_KEY }}
run: |
npm install
npx ts-node scripts/auditOrchestrator.ts src/CyberVault.sol
- name: Post Audit Comment to PR
uses: marocchino/sticky-pull-request-comment@v2
with:
path: audit-summary.md
四、落地避坑与极客建议
- 误报收敛(Triage Baseline):
在已有大型项目中首次运行静态分析时,通常会产生几十条历史告警。建议通过建立slither.triage.json基线库,将已人工核实确认无害的历史项屏蔽,CI 仅对“新增代码引入的新告警”进行硬阻断。 - 保护源码隐私:
对于高度敏感的核心商业合约,调用大模型 API 时务必配置私有化部署端点(如通过自建 vLLM 服务)或签署了数据不用于训练的企业级 API,防止新协议代码在上线前意外泄漏。
用机器的严密与 AI 的智慧守护代码,才能在每一次 Git Push 时拥有绝对的底气。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/qq_40635035/article/details/164461648



