LLMSmartAudit/FTSmartAudit

GitHub: LLMSmartAudit/FTSmartAudit

基于教师-学生蒸馏的轻量级智能合约审计工具生态,提供自动化漏洞检测与报告。

Stars: 30 | Forks: 5

# 为智能合约审计蒸馏轻量级专用模型! ![Banner](https://i.ibb.co/sJ7RhGG/image-41.png)
## 🎯 核心思想:教师-学生蒸馏
teacherStudent Methodology
## 🕌 HKT-SmartAudit 生态系统
FTAudit Ecosystem
我们的生态系统为智能合约审计提供了全面的解决方案: - 🛠️ 一套针对不同审计需求的专用模型 - 💻 便于交互的用户友好界面 - ⚡ 用于高效处理的后端基础设施 通过利用这些专用模型,我们的生态系统帮助用户快速且准确地识别其智能合约中的潜在漏洞,并提供改进的宝贵见解和建议。 ## 🕌 快速浏览笔记
FTAudit Ecosystem
FTAudit Ecosystem
FTAudit Ecosystem
## 🚀 运行专用模型 所有笔记本都**适合初学者**!只需添加您的智能合约数据集,点击“全部运行”,即可收到详细的审计报告。适用于 Colab 和本地执行。 ### 🌟 特色模型 | 模型列表 | 基础模型 | 笔记本 | 模型来源 | |-----------|---------|---------|--------| |**HKT-DeepSeek-R1 (8b)**|DeepSeek-R1-Distill-Llama-8B|-| [🤗 下载](https://huggingface.co/weifar/HKT-vul-DeepSeek-R1-8b-it-v0.2)| |**HKT-Llama-3.1 (8b)**| Meta-Llama-3.1-8B-Instruct-bnb-4bit|-| [🤗下载](https://huggingface.co/weifar/HKT-vul-llama3_1-8b-it-v0.2) | |**HKT-Gemma-2 (9b)** | gemma-2-9b-bnb-4bit|-|[🤗 下载](https://huggingface.co/weifar/HKT-vul-Gemma-2-9b-it-v0.2)| |**HKT-Mistral-Nemo (12b)**| Mistral-Nemo-Instruct-2407-bnb-4bit |-|[🤗 下载](https://huggingface.co/weifar/HKT-vul-Mistral-Nemo-it-v0.2)| |**HKT-Qwen-2.5-coder (7b)**| Qwen/Qwen2.5-Coder-7B-Instruct|-| [🤗 下载](https://huggingface.co/weifar/HKT-vul-qwen2.5-coder-7b-it-v0.1) | |**HKT-Llama-3.2 (1b)**| Llama-3.2-1B-Instruct-bnb-4bit|-| [🤗 下载](https://huggingface.co/weifar/HKT-vul-llama-3_2-1b-it-v0.1) | | **FTAudit-Llama3 (8B)** | Meta-Llama-3-8B-Instruct-bnb-4bit | [▶️ Colab](https://colab.research.google.com/drive/1Y_SHymcZGr98832GTSF46J1_JHtHgYhy?usp=sharing) | [🤗 下载](https://huggingface.co/weifar/FTAudit-Llama3-8b-v1.0) | | **FTAudit-Mistral (7B)** | mistral-7b-instruct-v0.3-bnb-4bit |[▶️ Colab](https://colab.research.google.com/drive/11MYFl14fvdVtEHqKxFXDSMY_L80PzWA7?usp=sharing) | [🤗 下载](https://huggingface.co/weifar/FTAudit-Mistral-7b-v1.1) | | **HKT_qwen3 (14b)** | Qwen3-14B-Instruct | |[🤗 下载](https://huggingface.co/weifar/HKT_qwen3_14b)| | **HKT_GLM_4_7 (flash)** | GLM-4.7-flash | |[🤗 下载](https://huggingface.co/weifar/HKT_GLM_4_7_flash) | | **HKT_gpt-oss (20b)** | gpt-oss-20B | |[🤗 下载](https://huggingface.co/weifar/HKT_gpt-oss-20b) | ### 🔍 早期研究模型 | 模型列表 | 模型来源 | |-----------|---------| | FTAudit-Codellama-v0.2 (13B) | [⬇下载](https://huggingface.co/weifar/FTAudit-Codellama-13b) | |FTAudit-Codellama (7B)|[⬇下载](https://huggingface.co/weifar/FTAudit-Codellama-7b)| |FTAudit-Llama2 (7B)|[⬇下载](https://huggingface.co/weifar/FTAudit-Llama3-7b)| ## 🦙 FTAudit.ai 新闻 - 🆕 **新发布!** 将我们的方法适配到更小的模型上:[HKT-vul-llama-3_2-1b](https://huggingface.co/weifar/HKT-vul-llama-3_2-1b-it-v0.1) - 🆕 **新实验!** 使用推理模型进行测试:[HKT-vul-DeepSeek-R1-8b](https://huggingface.co/weifar/HKT-vul-DeepSeek-R1-8b-it-v0.2) ## 教师-学生蒸馏 我们开发了一种自动化的知识蒸馏方法:[蒸馏](https://github.com/LLMSmartAudit/FTSmartAudit/tree/main/model_distillation) ## 📊 实验数据集与结果 我们严格地在三个不同的数据集上评估了我们的模型。所有评估指标、报告和详细分析均可在其各自的存储库中获得: ### 1. 标准漏洞集
Standard Set
- **数据集**: SmartBugs-curated [[1]](#) (143 个合约,182 个 DASP 分类漏洞) - **范围**: 10 种常见漏洞类型 - **评估结果**: [`evaluation`](https://github.com/LLMSmartAudit/FTSmartAudit/tree/main/EvaluationReports/standardContract) → 精确率/召回率指标、混淆矩阵、每种漏洞的细分 ### 2. 真实项目集
Real-World Set
- **数据集**: Code4rena-audited [[13]](#) (来自 72 个项目的 6,454 个合约) - **关键统计**: 243 个有问题的合约,784 个高/中严重性发现 - **评估结果**: [`evaluation`](https://github.com/LLMSmartAudit/FTSmartAudit/tree/main/EvaluationReports/ContestReports) → 排名优化分析、复杂度扩展测试、gas 优化影响 ### 3. CVE 基准集
CVE Set
- **覆盖范围**: 13 个关键 CVE(2025 年 1 月快照) - **类别**: ["整数溢出", "访问控制", "逻辑漏洞", "其他关键"] ## 🔗 链接和资源 | 类型 | 链接 | | ------------------------------- | --------------------------------------- | | 📚 **文档与维基** | [阅读我们的维基](https://github.com/LLMSmartAudit/FTSmartAudit/wiki) | | 🥇 **基准测试** | [详情](https://github.com/LLMSmartAudit/FTSmartAudit/tree/main/Benchmark)| | 🌐 **评估** | [报告](https://github.com/LLMSmartAudit/FTSmartAudit/tree/main/EvaluationReports)| ## 🐞 漏洞类别 智能合约漏洞可分为两类:机器可审计和机器不可审计。机器可审计的漏洞可以通过常规工具识别,而机器不可审计的漏洞需要人工审计员进行检测。在我们的研究中,我们将机器可审计的漏洞标记为“可检测漏洞”,将机器不可审计的漏洞标记为“不可检测漏洞”。我们的微调数据集包含了这两种类型,总共 112 个不同的漏洞标签。 ### 🔍 可检测漏洞 这些漏洞可以通过常规自动化工具识别。
| 漏洞类型 | 描述 | |--------------------|-------------| | 重入 | 允许函数在完成前被中断和重新进入 | | 可预测的随机性 | 使用确定性值进行随机数生成 | | 整数溢出 | 算术运算超出数据类型的最大值 | | 未检查的低级调用 | 未检查低级函数调用的返回值 | | 抢跑攻击 | 利用区块链中的交易顺序 | | 拒绝服务 | 阻止合法用户访问合约 | | 访问控制 | 对谁可以执行某些函数的限制不当 | | 时间操纵 | 利用区块时间戳依赖 | | 未初始化的结构体 | 使用未正确初始化的结构体变量 | | 短地址 | 利用 EVM 填充行为处理函数参数 |
### 🕵️ 不可检测漏洞 这些漏洞由于其复杂性或上下文依赖性,需要人工审计员进行检测。 1. 价格操纵 2. 缺乏输入验证 3. 隐藏的拥有者变更 4. 无限制的初始化 5. 状态操纵 6. 在循环中误用 `msg.value`7. 不正确的允许更新逻辑 8. 数据损坏 9. 缺乏提款功能 10. 缺少授权检查 11. 存储错误 12. 哈希碰撞 13. 在没有上下文的情况下误用 `shr` 14. 未初始化的返回变量 15. 构造函数误声明 16. 潜在的不当行为 17. 缺少 `onlyOwner` 修饰符 18. 状态变量隐藏 19. 未初始化的状态变量 20. 不当的结构体初始化 21. 不当的初始化检查 22. 没有适当访问控制的提款函数 23. 数组长度的直接修改 24. 汇编 `return` 的不当使用 25. 未检查的转账 26. 不安全的枚举转换 27. 精确匹配的不切实际性 28. 缺乏功能性 29. 映射删除 30. 隐藏状态变量 31. 对无符号整数比较的误读 32. 冗余条件 33. 导致精度损失的整数除法 34. 原子性和顺序 35. 构造函数继承 36. 构造函数执行顺序 37. 未使用的返回值 38. 遮蔽内置的 XX 39. 不正确的数据类型 40. 未初始化的函数指针 41. 在声明之前使用变量 42. 变量的作用域不当 43. 变量 `max` 的作用域不正确 44. 构造函数调用不正确 45. 带有外部调用的无界循环 46. 缺少状态变量声明 47. 不正确的增量操作 48. 不正确的操作 49. 对外部调用无限制的 gas 50. 不正确使用 `assert` 51. 不必要的比较 52. 已弃用的特性 53. 不可预测的初始化 54. 冗余语句和语法错误 55. 实现不完整 56. 循环中低效的状态修改 57. 映射 Getter 的误用 58. 取消授权 59. 余额计算差异 60. 依赖外部数据 61. 复杂性 62. 资金费率计算精度 63. 铸造权限 64. 闪电贷费用操纵 65. 集中化风险 66. 单点故障 67. 潜在的拥有者劫持 68. 不安全的所有权删除 69. 构造函数语法 70. 未初始化的 `creator` 变量 71. `withdraw` 函数中错误的 require 条件 72. 未初始化的构造函数 73. 缺少零地址检查 74. 对敏感函数缺乏访问控制 75. 签名可变性 76. 不正确的签名验证 77. 潜在的不一致性 78. 预言机操纵 79. 预言机宕机 80. 缺少 nonce 增量 81. 链下签名 82. 重放攻击 83. 对关键函数拥有绝对控制权的拥有者 84. 误用 `msg.sig` 进行授权 85. 未检查的 ERC20 转账返回值 86. 可能导致不准确数据 87. 未验证价格源 88. SafeMath 库中缺少适当的错误处理 89. SafeMath 函数缺失除法 90. 未检查的除以零 91. `transfer` 和 `transferFrom` 函数中的溢出和下溢 92. 单点故障 93. 已弃用的 `throw` 94. 硬编码时间戳 95. 使用已弃用的函数 96. 状态机实现中的逻辑错误 97. 潜在的代币锁定 98. 无限制的代币批准 99. 不正确的事件发射 100. ETH 转账处理不当 101. 缺少拉取支付实现 102. 不正确使用 fallback 函数 ## 新发现的漏洞: 我们的模型已成功识别出 **4 种不同类型** 的 **13 个** 未被检测到的漏洞。

📜 完整未检测漏洞列表

- **潜在代币锁定**: -- 在 yVault.sol 中,`earn` 函数将可用代币传输给控制器,没有任何检查或限制。如果控制器合约未正确实现或存在漏洞,可能会锁定代币并使其无法检索。 ``` function earn() external { uint256 _bal = available(); token.safeTransfer(address(controller), _bal); controller.earn(address(token), _bal); } ``` -- sYETIToken.sol 中的 `mint` 函数,将 YETI 代币发送到 sYETI 合约,使用了 `yetiToken` 合约的 `sendToSYETI` 函数。如果 `yetiToken` 合约存在漏洞或未正确实现,可能会锁定代币并使其无法检索。 ``` function mint(uint256 amount) public returns (bool) { User memory user = users[msg.sender]; uint256 shares = totalSupply == 0 ? amount : (amount * totalSupply) / effectiveYetiTokenBalance; user.balance += shares.to128(); user.lockedUntil = (block.timestamp + LOCK_TIME).to128(); users[msg.sender] = user; totalSupply += shares; yetiToken.sendToSYETI(msg.sender, amount); effectiveYetiTokenBalance = effectiveYetiTokenBalance.add(amount); emit Transfer(address(0), msg.sender, shares); return true; } ``` - **输入验证不足**: 在 sYETIToken.sol 中,`setTransferRatio` 函数检查新比率是否为零,但未检查溢出。恶意拥有者可以设置非常高的 transferRatio,从而潜在地操纵再平衡机制。 ``` function mint(uint256 amount) public returns (bool) { User memory user = users[msg.sender]; uint256 shares = totalSupply == 0 ? amount : (amount * totalSupply) / effectiveYetiTokenBalance; user.balance += shares.to128(); user.lockedUntil = (block.timestamp + LOCK_TIME).to128(); users[msg.sender] = user; totalSupply += shares; yetiToken.sendToSYETI(msg.sender, amount); effectiveYetiTokenBalance = effectiveYetiTokenBalance.add(amount); emit Transfer(address(0), msg.sender, shares); return true; } ``` - **无限制的代币批准**: 在 IdeleYieldSource.sol 的 `initialize` 函数中,合约使用 `safeApprove` 和 `type(uint256).max` 批准 `idleToken` 无限制地花费 `underlyingAsset` 代币。如果 `idleToken` 合约被攻破或存在漏洞,可能会导致批准的资金被耗尽。 在 NFTXSimpleFeeDistributor.sol 的 `_sendForReceiver` 函数中,合约使用 `IERC20Upgradeable(_vault).approve(_receiver.receiver, amountToSend)` 批准接收合约无限制地花费代币。这种做法通常不推荐,因为它在接收合约被攻破或行为恶意时存在安全风险。 `SingleTokenJoinV2.sol` 中的 `_maxApprove` 函数在当前允许额度小于合约代币余额时,为指定支出者授予无限制的代币批准。这可能导致支出者转移比预期更多的代币。该合约在调用 `joinPool` 之前使用 `_maxApprove` 为篮子中的每个代币批准无限制的代币支出。如果篮子中的任何代币是恶意的或存在漏洞,它们可能会耗尽合约中批准的资金。 Vault.sol 合约未处理某些外部函数调用的返回值。例如,在 `earn` 函数中,未检查 `_controller.earn` 的返回值。如果外部函数失败或返回意外值,可能会导致不一致或意外行为。 `XDEFIDistribution.sol` 合约中的 `lockWithPermit` 函数使用 `IEIP2612` 接口的 `permit` 函数来批准代币转账。然而,在进行代币转账之前,没有检查 `permit` 调用是否成功。 - **未受保护的函数**: 未受保护的 `setMinter` 函数:Position.sol 合约中的 `setMinter` 函数允许合约拥有者设置任何地址作为 minter。但是,没有机制来防止拥有者意外或恶意地设置一个未预期的地址。 未受保护的 `setParams()` 函数:USDV.sol 合约中的 `setParams()` 函数允许 DAO 设置 `blockDelay` 参数。但是,可以设置的值没有任何限制。控制 DAO 的攻击者可以设置任意的 `blockDelay`,可能会干扰合约行为或启用攻击。重要的是要验证并限制可以为关键参数设置的值的范围。 未受保护的 `setMin` 函数:Vault.sol 中的 `setMin` 函数允许策略师设置 `min` 值,该值决定了可用于赚取的最小代币数量。但是,对 `_min` 值没有上限或验证。恶意策略师可以设置一个非常高的 `min` 值,从而有效地锁定金库的大部分代币。 未受保护的 `migrate` 函数:MapleLoan.sol 中的 `migrate` 函数允许工厂合约将合约迁移到新实现。但是,对于 `migrator_` 地址或传递给函数的 `arguments_` 没有限制。这可能导致未经授权的迁移或资金损失(如果未正确实现)。 ## 🏋🏿 训练详情
Training Loss Training Loss Graph
GPU Memory Usage GPU Power Consumption
![](https://i.ibb.co/sJ7RhGG/image-41.png) ### 😘 感谢 - [Unsloth AI](https://unsloth.ai) 提供更快的接口计划,加速我们的评估。
标签:AI辅助审计, Colab, FTSmartAudit, HKT-SmartAudit, HuggingFace, Solidity, 专业模型, 以太坊, 凭据扫描, 区块链安全, 反取证, 大模型安全, 安全分析, 安全评估, 对称加密, 开源审计工具, 推理优化, 教师学生框架, 智能合约安全, 智能合约审计, 模型下载, 模型蒸馏, 深度学习, 自动化审计, 轻量化模型, 逆向工具