BugSweeper: Function-Level Detection of Smart Contract Vulnerabilities Using Graph Neural Networks¶
会议: AAAI2026
arXiv: 2512.09385
代码: 待确认
领域: graph_learning
关键词: Smart Contract, Vulnerability Detection, Graph Neural Network, Abstract Syntax Tree, Pooling
一句话总结¶
提出 BugSweeper,通过构建函数级抽象语法图 (FLAG) 并设计两阶段 GNN 架构,实现无需专家规则的端到端智能合约漏洞检测,在重入攻击检测上 F1 达 98.57%。
背景与动机¶
以太坊智能合约一旦部署就无法修改,若存在安全漏洞(如著名的 DAO 攻击导致 360 万 ETH 被盗),后果极其严重。 现有检测方法分为两大类:
- 传统方法(静态分析、符号执行):依赖专家手工制定的规则,如 Slither、Mythril 等工具,面对新型漏洞变体时泛化能力差。
- 深度学习方法(TMP、AME、Peculiar、ReVulDL):虽然引入了 GNN 或预训练模型,但预处理阶段仍依赖基于规则的代码片段提取,存在以下问题:
- 检测范围受限:预定义规则无法覆盖所有漏洞类型
- 泛化能力差:针对特定漏洞设计的规则难以迁移
- 信息丢失:规则提取可能丢弃关键上下文
作者观察到,智能合约中的安全漏洞(尤其是重入攻击)往往源于函数间的不安全交互,因此提出在函数级别进行分析,同时保留函数间的调用与引用关系。
核心问题¶
如何在不依赖任何手工规则的情况下,构建能同时捕获代码结构和语义流的表示,实现多类型智能合约漏洞的端到端自动检测?
方法详解¶
BugSweeper 包含三个核心组件:
1. Graph Constructor — 构建 FLAG¶
- AST 解析:使用 Solidity 编译器 solc 将源码解析为抽象语法树 (AST)
- 边增强:在 AST 基础上添加三类边,形成 Flow-Augmented ASG:
- Basic edges:AST 原有的 Child/Parent 结构边
- Data-flow edges:包括 ReferencedDeclaration(变量/函数引用)、FunctionReturnParameter(返回值链接)、SuperFunction(函数重写)、Assignment(赋值)
- Control-flow edges:包括 IfStatement 的 CondTrue/CondFalse、循环的 WhileExecution/ForExecution、NextStatement 顺序边
- 函数级切分 + Coverage 扩展:将合约按函数拆分为子图,通过 coverage 超参数控制邻域深度:
- coverage=1:仅目标函数自身
- coverage=2:加入直接调用的函数和引用的变量(1-hop)
- coverage=3:进一步扩展至 2-hop 邻居
- 实验中默认使用 coverage=4
2. Code Graph Neural Network (CGNN) — 第一阶段¶
- 使用 BPE tokenizer 将节点文本属性编码为向量
- 采用 3 层 GraphSAGE(512→1024→1024→1024)进行消息传递,生成节点 embedding
- CGPool(核心创新):基于代码语法角色的确定性语义池化
- 将属于同一 FunctionDefinition 或 VariableDeclaration 的节点合并为一个 supernode
- 按原始控制流/数据流边重连 supernode,生成 Pooled FLAG
- 相比 TopKPool/SAGPool 等方法,既保留层次结构又避免信息丢失,且计算高效
3. Second-Stage GNN — 第二阶段¶
- 在 Pooled FLAG 上使用 3 层 GAT(含 multi-head attention,首层 4 heads)进行高层推理
- GAT 的注意力机制能自动聚焦于关键的函数间连接
- 经 global readout 后接三层 MLP 分类器(1024→1024→C),输出各漏洞类别的概率
训练细节¶
- 优化器:Adam,lr=1e-4,weight decay=1e-5
- 训练 500 epochs,batch size=64
- Dropout:GNN 层 0.5,分类器 0.3
- 每组实验用 4 个不同随机种子重复,报告均值
实验关键数据¶
重入攻击检测(AME 数据集,1224 合约)¶
| 方法 | Precision | Recall | F1 |
|---|---|---|---|
| Slither | 94.74% | 34.62% | 50.70% |
| AME | 95.45% | 95.38% | 95.42% |
| ReVulDL | 92.95% | 94.62% | 93.74% |
| BugSweeper | 99.87% | 97.35% | 98.57% |
BugSweeper F1 超过最强基线 AME 约 3.1 个百分点,同时 Precision 接近 100%。
多类漏洞检测(SmartBugs Wild 数据集,47,398 Solidity 文件)¶
最优配置 SAGE + GAT:
| 漏洞类型 | F1 |
|---|---|
| Reentrancy | 91.61% |
| Unchecked Low-Level Calls | 80.15% |
| Time Manipulation | 79.63% |
消融实验亮点¶
- 两阶段 vs 单阶段:两阶段架构在所有漏洞类型上显著优于单阶段基线
- CGPool vs 其他池化:CGPool(F1=87.32%)大幅领先 ASAPool(82.41%)、SAGPool(77.10%)、TopKPool(75.29%)
- GNN 组合:SAGE(第一阶段)+ GAT(第二阶段)效果最佳,体现互补性——SAGE 擅长大图聚合,GAT 注意力机制精准定位关键特征
亮点¶
- 完全端到端:从源码到漏洞检测不依赖任何手工规则,突破了现有深度学习方法仍需规则预处理的瓶颈
- FLAG 表示:将 AST 与控制流/数据流语义融合,并通过 coverage 机制灵活控制函数间信息量
- CGPool 语义池化:巧妙利用代码结构先验(函数/变量定义边界)进行确定性池化,兼具效率与信息保留
- 两阶段 GNN 设计合理:第一阶段降噪 + 第二阶段高层推理,SAGE 和 GAT 各发挥所长
- 多漏洞泛化:同一框架统一检测三类漏洞,无需为每种漏洞单独设计规则
局限性 / 可改进方向¶
- 漏洞类型有限:仅验证了 3 种漏洞,未覆盖更隐蔽的逻辑漏洞(如访问控制、整数溢出等)
- 数据不均衡影响明显:Unchecked Low-Level Calls 和 Time Manipulation 的 F1 明显低于 Reentrancy,说明对少样本类型泛化仍有不足
- SmartBugs Wild 标签质量:依赖 3+ 工具共识作为 ground truth,工具本身可能存在系统性偏差
- 可扩展性未验证:未在超大规模合约或复杂 DeFi 协议上测试
- 缺少与 LLM 方法的对比:近期基于代码大模型(CodeBERT、Code LLaMA)的漏洞检测方法未纳入比较
- coverage 参数敏感:固定为 4,未深入分析不同 coverage 的精度-效率权衡
与相关工作的对比¶
| 维度 | 传统工具 | 现有 DL 方法 | BugSweeper |
|---|---|---|---|
| 规则依赖 | 完全依赖 | 预处理依赖 | 无 |
| 漏洞类型 | 按规则覆盖 | 多为单类 | 多类统一 |
| 代码表示 | CFG/PDG | 专家抽取图 | FLAG(自动构建) |
| 信息保留 | 丢失多 | 部分丢失 | 语义池化保留 |
| F1(重入) | 50-68% | 85-95% | 98.57% |
启发与关联¶
- CGPool 的思想可迁移:基于代码结构先验的确定性池化策略,可推广到其他代码分析任务(如缺陷预测、代码克隆检测)
- FLAG 构建流程通用:AST + flow edges + 函数级切分的表示方式不限于 Solidity,可适配 Python/Java 等语言
- 两阶段 GNN 架构启发:先降噪再推理的范式适用于其他噪声较大的图学习场景(如分子图、电路图)
- 与 LLM 结合的方向:可考虑用代码大模型替代 BPE tokenizer 生成初始节点 embedding,可能进一步提升性能
评分¶
- 新颖性: ⭐⭐⭐⭐ — FLAG 表示和 CGPool 设计新颖,两阶段架构有合理动机
- 实验充分度: ⭐⭐⭐⭐ — 消融全面,多数据集验证,统计显著性测试完备;但漏洞类型偏少
- 写作质量: ⭐⭐⭐⭐ — 结构清晰,图表丰富,动机阐述充分
- 价值: ⭐⭐⭐⭐ — 端到端免规则检测方向有实际意义,精度提升显著