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 驾驶舱图标——审计时它就是你的"侧边栏指挥台"
安装扩展与准备环境:最快配置方法
- 打开 VS Code 扩展面板,搜索Solidity Visual Developer(内部扩展 ID 为
solidity-visual-auditor,定义见 package.json),点击安装。它会自动带上 Solidity 语言支持、Graphviz 交互预览等依赖扩展。 - 克隆本仓库获取演练合约:
git clone https://gitcode.com/gh_mirrors/vs/vscode-solidity-auditor- 用 VS Code 打开仓库目录,打开 examples/simpleDao.sol,你会立刻看到"安全配色"生效:
payable修饰符、msg.sender、address.call()等安全敏感代码都被特殊高亮——这是被动的安全感知层,不用写任何配置。 - 在
Preferences → Color Themes中可选择专用的Solidity Visual Developer Dark / Light主题,审计体验更佳。
💡 所有功能均可在
Settings → Solidity Visual Developer(solidity-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.value、msg.sender等"攻击者可控"变量有专门的高亮颜色;- 状态变量
credit用金色框标注,一眼看出哪些函数在读写资金账本(装饰逻辑见 src/features/)。
审计心得:先读"颜色",再读代码。凡是"外部调用在前、状态修改在后"的函数,自动进入重点怀疑名单。
审计第二步:用 Cockpit 视图圈定攻击面
点击 VS Code 左侧活动栏的 Cockpit 图标(即上文配图),进入审计驾驶舱(视图注册与交互逻辑见 cockpit.js 与 package.json):
- Workspace: Top Level Contracts:列出最可能被部署的入口合约,避免把时间花在抽象基类上;
- Context: Public State-Changing Methods:光标停在
SimpleDAO上后,自动列出所有会改状态的 public 方法——donate和withdraw立刻浮出水面; - 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 类图,用于威胁建模和交付文档。
对NameRegistrar的register函数(uninit.sol)生成报告后,可以清楚看到:
resolve[_name]和registeredNameRecord两个全局映射先被写入;require(unlocked)后于状态修改执行——校验必须在副作用之前;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),实现"静态扫描 + 人工审计"双线并行。
审计交付清单:从演练到报告
完成一轮审计后,你可以交付如下成果,全部来自本工具链:
- 风险清单:
withdraw重入(高危)、register校验顺序 + 未初始化标志位(中危),用@audit标记逐行留痕; - 调用图 / UML 图:Surya graph 与 UML 导出,作为报告的架构插图;
- 自动报告:Surya
report生成的 Markdown 基线,附函数签名与状态变量访问摘要; - 修复对照:以 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),仅供参考