news 2026/9/11 23:43:21

Solidity 漏洞审计实战:用 vscode-solidity-auditor 审查 SimpleDAO 重入与未初始化合约的完整流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Solidity 漏洞审计实战:用 vscode-solidity-auditor 审查 SimpleDAO 重入与未初始化合约的完整流程

Solidity 漏洞审计实战:用 vscode-solidity-auditor 审查 SimpleDAO 重入与未初始化合约的完整流程

【免费下载链接】vscode-solidity-auditorSolidity language support and visual security auditor for Visual Studio Code项目地址: https://gitcode.com/gh_mirrors/vs/vscode-solidity-auditor

vscode-solidity-auditor(扩展名 Solidity Visual Developer)是一款为 Visual Studio Code 打造的 Solidity 语言支持与可视化安全审计工具,帮助开发者与审计人员通过安全导向的语法高亮、语义标注、Cockpit 驾驶舱视图和自动化图表,快速定位智能合约中的重入攻击、未初始化变量等真实漏洞。本文以项目自带的两个漏洞样本为演练对象,带你完整走一遍合约安全审计流程 🕵️

演练场景:两个真实漏洞样本

项目仓库的 examples/ 目录内置了多个用于练习的合约,本文用到以下两个经典漏洞样本:

文件漏洞类型一句话描述
simpleDao.sol重入攻击(Reentrancy)先转账、后记账,余额被反复刷取
uninit.sol未初始化逻辑缺陷注册函数在"解锁"前就修改了链上状态

再配一份"正确写法"作为对照:safe.sol 展示了先清零余额、再用transfer转账的安全模式,方便你理解修复思路。

Solidity Visual Developer 扩展的 Cockpit 驾驶舱图标——审计时它就是你的"侧边栏指挥台"

安装扩展与准备环境:最快配置方法

  1. 打开 VS Code 扩展面板,搜索Solidity Visual Developer(内部扩展 ID 为solidity-visual-auditor,定义见 package.json),点击安装。它会自动带上 Solidity 语言支持、Graphviz 交互预览等依赖扩展。
  2. 克隆本仓库获取演练合约:
git clone https://gitcode.com/gh_mirrors/vs/vscode-solidity-auditor
  1. 用 VS Code 打开仓库目录,打开 examples/simpleDao.sol,你会立刻看到"安全配色"生效:payable修饰符、msg.senderaddress.call()等安全敏感代码都被特殊高亮——这是被动的安全感知层,不用写任何配置。
  2. Preferences → Color Themes中可选择专用的Solidity Visual Developer Dark / Light主题,审计体验更佳。

💡 所有功能均可在Settings → Solidity Visual Developersolidity-va.*)中按需开关,完整清单见 README.md。

审计第一步:用视觉高亮建立"安全直觉"

打开 SimpleDAO 合约,重入漏洞的核心就藏在这三行里(simpleDao.sol 的withdraw函数):

function withdraw(uint amount) public { if (credit[msg.sender] >= amount) { msg.sender.call.value(amount)(""); // ① 先把钱打出去(外部调用) credit[msg.sender] -= amount; // ② 后扣减余额 } }

顺序错了:① 是外部调用,攻击者可以在回调中再次进入withdraw,而 ② 还没执行,余额检查永远通过。

在 vscode-solidity-auditor 中,这类危险代码会被"被动标红标黄":

  • address.call()等外部调用语句在代码行侧边栏显示 gutter 图标装饰(对应设置项solidity-va.deco.warn.externalCalls,源码见 deco.js);
  • msg.valuemsg.sender等"攻击者可控"变量有专门的高亮颜色;
  • 状态变量credit用金色框标注,一眼看出哪些函数在读写资金账本(装饰逻辑见 src/features/)。

审计心得:先读"颜色",再读代码。凡是"外部调用在前、状态修改在后"的函数,自动进入重点怀疑名单。

审计第二步:用 Cockpit 视图圈定攻击面

点击 VS Code 左侧活动栏的 Cockpit 图标(即上文配图),进入审计驾驶舱(视图注册与交互逻辑见 cockpit.js 与 package.json):

  • Workspace: Top Level Contracts:列出最可能被部署的入口合约,避免把时间花在抽象基类上;
  • Context: Public State-Changing Methods:光标停在SimpleDAO上后,自动列出所有会改状态的 public 方法——donatewithdraw立刻浮出水面;
  • Context: External Calls:列出合约内所有外部调用点,重入、ETH 转移风险点一目了然;
  • Context: Function Call Trace:跟踪函数调用链,评估调用深度与信任边界。

对 uninit.sol 里的NameRegistrar合约重复同样操作:register函数是唯一的状态修改入口,点进 External Calls 与 Public Methods 视图后,它的优先级立刻被标记为"最高"。

审计第三步:生成调用图与审计报告(Surya 集成)

插件深度集成了 Surya 分析引擎(依赖配置见 package.json),在文件上方会显示一排 CodeLens 内联操作(见 codelens.js):

  • graph / graphThis:生成可交互的调用图,支持点击高亮调用流——对withdraw点一下,重入回调路径在图上清晰可见(生图逻辑见 src/features/writer/);
  • report:一键生成结构化 Markdown 审计报告,包含函数列表、状态变量访问、复杂度等信息;开启设置项solidity-va.tools.surya.option.negModifiers后,缺失的修饰符会以删除线形式列出,帮你发现"忘加onlyOwner"这类低级但致命的问题;
  • inheritance / uml:生成继承图与 UML 类图,用于威胁建模和交付文档。

NameRegistrarregister函数(uninit.sol)生成报告后,可以清楚看到:

  1. resolve[_name]registeredNameRecord两个全局映射先被写入
  2. require(unlocked)后于状态修改执行——校验必须在副作用之前;
  3. unlocked初始为false且合约中没有任何构造函数将其置为true,注册功能永久锁死。

这正是"未初始化"类缺陷的完整证据链:顺序错误 + 标志位从未初始化。修复方向是在构造函数中unlocked = true(或提供unlock()管理函数),并把require提到赋值之前。

审计第四步:用 @audit 书签沉淀审计结论

审计不只要"发现问题",还要"记录结论"。插件通过 Inline Bookmarks 提供行内审计标记(功能说明见 README.md):

msg.sender.call.value(amount)(""); // @audit - 重入风险:外部调用先于余额扣减 credit[msg.sender] -= amount; // @audit-ok - 已按 CEI 模式修复,先记账后转账
  • @audit - 说明:标记需要人工复核或已确认的风险行;
  • @audit-ok - 说明:标记"已检查、非问题"的行。

标记会以彩色书签图标出现在行首,多人协作时相当于在代码里开了一场"审计讨论会"。此外,插件还能把外部扫描器(如 Slither 类工具)的 CDILI JSON 结果直接渲染成编辑器诊断(设置项solidity-va.diagnostics.cdili_json.import,处理逻辑见 genericDiag.js),实现"静态扫描 + 人工审计"双线并行。

审计交付清单:从演练到报告

完成一轮审计后,你可以交付如下成果,全部来自本工具链:

  1. 风险清单withdraw重入(高危)、register校验顺序 + 未初始化标志位(中危),用@audit标记逐行留痕;
  2. 调用图 / UML 图:Surya graph 与 UML 导出,作为报告的架构插图;
  3. 自动报告:Suryareport生成的 Markdown 基线,附函数签名与状态变量访问摘要;
  4. 修复对照:以 safe.sol 的 CEI(先改状态、后转账)写法为参照给出修复建议。

更多命令与配置(函数签名导出、Remix 跳转、测试桩生成等)可查看 README.md 与 package.json 中的命令定义,版本演进记录见 CHANGELOG.md。

常见问题(FAQ)

Q:CodeLens 不显示怎么办?A:修改并保存一次文件即可触发刷新;也可检查solidity-va.codelens.enable是否被禁用。

Q:UML 功能没有输出?A:UML 依赖本地 PlantUML 环境(Java),需要先按 PlantUML 相关扩展的说明完成环境配置。

Q:插件会替代静态分析工具吗?A:不会。它是"人工审计的放大器"——扫描器负责广撒网,视觉高亮、Cockpit 视图与图表负责帮你把网络收回来。

🎯 记住审计口诀:先圈攻击面(Cockpit)→ 再顺数据流(高亮 + 调用图)→ 最后留痕下结论(@audit 标记)。按这个流程走,一次 SimpleDAO 级别的演练大约 30 分钟即可完成。

【免费下载链接】vscode-solidity-auditorSolidity language support and visual security auditor for Visual Studio Code项目地址: https://gitcode.com/gh_mirrors/vs/vscode-solidity-auditor

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 15:03:10

R-Car V3M开发套件如何加速ADAS原型验证:从SoC选型到实践

做 ADAS 前我先说清楚:为什么 R-Car V3M 开发套件值得关注 我做嵌入式视觉开发有些年头了,前两年接过一个前视摄像头项目,主控芯片选的就是瑞萨 R-Car V3M。当时团队的第一反应是“先搞个开发套件”,于是申请了官方 Kit。做完整个…

作者头像 李华
网站建设 2026/9/2 18:40:02

AI大模型新动向:智能体蒸馏框架、图检索增强生成、多智能体推理

1、Optimizing Length Compression in Large Reasoning Models 大型推理模型(LRMs)取得了显著的成功,但它们往往会生成不必要的冗长推理链。本文识别出这一问题的核心是“无效思考”——模型在得出正确答案后,往往会重复地检查自己…

作者头像 李华
网站建设 2026/8/31 16:20:11

PHP代码五彩斑斓:php-mode语法高亮Face定制完全指南

PHP代码五彩斑斓:php-mode语法高亮Face定制完全指南 【免费下载链接】php-mode A powerful and flexible Emacs major mode for editing PHP scripts 项目地址: https://gitcode.com/gh_mirrors/ph/php-mode php-mode 是 Emacs 中强大且灵活的 PHP 主模式&am…

作者头像 李华