Richown头像
关注
从 Slither 到大模型:构建多层智能合约自动化安全审计流水线封面图

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

从 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 评注]
各层分工哲学:
  1. Slither(第一道关卡,秒级拦截):基于编译生成的抽象语法树(AST)和控制流图(CFG),快速过滤出常见的 80+ 种已知模式(如未检查返回值、重入特征、废弃语法、锁定 Ether 等);
  2. Mythril(第二道关卡,数学证伪):针对第一层标记出的高危函数,利用 SMT 求解器生成真实可执行的交易调用序列,验证攻击是否真正成立;
  3. 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

四、落地避坑与极客建议

  1. 误报收敛(Triage Baseline)
    在已有大型项目中首次运行静态分析时,通常会产生几十条历史告警。建议通过建立 slither.triage.json 基线库,将已人工核实确认无害的历史项屏蔽,CI 仅对“新增代码引入的新告警”进行硬阻断。
  2. 保护源码隐私
    对于高度敏感的核心商业合约,调用大模型 API 时务必配置私有化部署端点(如通过自建 vLLM 服务)或签署了数据不用于训练的企业级 API,防止新协议代码在上线前意外泄漏。

用机器的严密与 AI 的智慧守护代码,才能在每一次 Git Push 时拥有绝对的底气。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/qq_40635035/article/details/164461648

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--