1. 先搞清楚:AI找漏洞,到底是在测什么?
最近看到不少关于“Claude 8分钟发现钱包漏洞”的讨论,很多人第一反应是“AI要逆天了,安全工程师要失业了”。但作为一个实际做过安全测试和代码审计的人,我觉得这个标题背后,真正值得讨论的不是AI有多强,而是它到底在什么条件下、用什么方法、发现了什么级别的漏洞。这决定了AI在安全领域当前的真实定位,是玩具、是辅助工具,还是能独立作战的专家。
首先,这个“钱包漏洞”大概率指的是加密货币钱包或类似数字资产应用的智能合约漏洞。这类漏洞的发现,通常有几个关键前提:
- 代码可得性:AI需要能完整、准确地看到目标合约的源代码。在真实黑盒测试中,这第一步就不成立。
- 问题定义清晰:测试者需要给AI一个非常具体的任务,比如“检查这个Solidity合约中是否存在重入攻击风险”,而不是笼统地说“找找有没有漏洞”。模糊的指令会得到模糊甚至无用的结果。
- 环境与上下文:AI需要理解以太坊虚拟机(EVM)的特性、常见代币标准(如ERC-20)以及该合约要实现的业务逻辑。缺少这些上下文,它可能会误报或漏报。
所以,当我们在说“AI发现漏洞”时,更准确的描述是:在一个代码可见、任务明确、上下文相对完备的沙箱环境里,一个大型语言模型(LLM)基于其训练数据中的漏洞模式,对一段代码进行了自动化代码审查,并指出了其中可能存在的安全问题。
这个定位很重要。它意味着AI目前的核心能力是模式匹配和知识检索,而不是具备真正理解系统、进行逻辑推理和创造性攻击的“黑客思维”。对于安全从业者来说,这非但不是威胁,反而是一个强大的效率工具。它的价值在于处理那些重复、繁琐、基于固定模式的初级代码审查工作,把人解放出来去处理更复杂的逻辑漏洞和业务风险。
2. 模拟一次:用AI辅助进行代码安全审计的实操流程
那么,如何在实际工作中利用像Claude这样的AI来辅助安全审计呢?我一般会把它嵌入到我的工作流中,而不是让它独立运行。下面是一个模拟的、更贴近真实场景的步骤。
2.1 环境与材料准备
首先,你需要一个能运行Claude的环境。根据网络热词,很多人卡在安装上,尤其是Windows的虚拟化平台问题。这里的关键不是“安装Claude”,而是获得一个可靠的、能处理代码的AI对话接口。
- 方案A:使用官方或第三方Web接口:这是最直接的方式。访问提供Claude模型的平台(如Anthropic官网或某些集成了Claude的AI工具站),将代码粘贴进去进行分析。缺点是代码长度可能受限,且涉及敏感项目代码时有泄露风险。
- 方案B:本地部署或API调用:如果你有API权限,可以通过编程方式(如Python脚本)调用Claude的API,实现自动化扫描。这适合集成到CI/CD流程中。对于个人学习,也可以寻找一些开源项目,它们可能封装了调用方式。
- 关于“Virtual Machine Platform not available”:这个错误通常出现在一些试图在本地沙箱环境中运行Claude Code的桌面应用上。它要求Windows启用虚拟化功能。解决步骤是:
- 重启电脑进入BIOS/UEFI设置,确保CPU的虚拟化技术(Intel VT-x / AMD-V)已启用。
- 在Windows中,打开“启用或关闭Windows功能”,勾选“Hyper-V”和“Windows虚拟机监控程序平台”。
- 完成更改后重启。如果问题依旧,可能是硬件不支持或与某些安全软件冲突。
对于安全审计工作,我更推荐方案A或B。桌面应用往往限制较多,而Web接口或API更灵活,便于复制粘贴代码片段和进行多轮对话。
准备的材料就是你将要审计的智能合约代码。以一个简单的、有潜在漏洞的ERC-20转账函数为例:
// 这是一个有重入漏洞的简化版合约 contract VulnerableBank { mapping(address => uint) public balances; function deposit() public payable { balances[msg.sender] += msg.value; } function withdraw(uint _amount) public { require(balances[msg.sender] >= _amount, "Insufficient balance"); (bool success, ) = msg.sender.call{value: _amount}(""); require(success, "Transfer failed"); // 漏洞点:在转账后才更新余额 balances[msg.sender] -= _amount; } }2.2 给AI布置明确、具体的审计任务
不要直接扔过去整个文件说“找漏洞”。AI可能会泛泛而谈。应该像指导一个实习生一样,分步骤、给焦点。
第一轮提问(架构与功能理解):
“以下是名为
VulnerableBank的Solidity合约代码。请先理解它的功能:它似乎是一个简单的存款/取款银行。请为我总结一下,deposit和withdraw函数分别做了什么,并指出合约中管理用户余额的关键数据结构是什么。”
这个步骤是让AI“熟悉业务”。一个合格的回答应该能指出balances映射记录了余额,deposit增加余额,withdraw减少余额并转账。
第二轮提问(针对性漏洞检查):
“基于你对上述合约的理解,现在请以安全审计员的身份,重点检查
withdraw函数。请逐一分析以下经典漏洞模式在该函数中是否存在可能性:
- 重入攻击(Reentrancy):关注外部调用(
call)与状态变更(balances更新)的顺序。- 整数溢出/下溢:Solidity 0.8.x之前版本需要关注,本例中检查减法操作。
- 拒绝服务(DoS):检查是否有条件可能导致函数无法被正常调用或卡住。 请详细说明你的判断理由。”
这才是核心。你引导AI去应用它学过的漏洞模式库。一个正确的分析应该能明确指出:
- 存在重入漏洞:因为先执行了
msg.sender.call(外部调用,可能触发恶意合约的回退函数再次调用withdraw),之后才更新balances。在余额更新前,require(balances[msg.sender] >= _amount)的条件会一直成立,导致攻击者可以重复提款,清空合约资金。 - 整数下溢风险:如果使用旧版本Solidity(如0.7.x),
balances[msg.sender] -= _amount在余额不足时可能下溢。但本例中由于前面的require检查,理论上不会发生。不过AI应该能提到版本依赖。 - 潜在的DoS:
msg.sender.call如果向一个恶意合约(其回退函数消耗大量Gas或直接revert)转账,可能导致require(success, “Transfer failed”)失败,从而使合法用户的提款也失败。但这更偏向于业务逻辑设计问题。
2.3 验证与深化分析
AI给出答案后,你不能全盘接受。需要验证和追问。
- 验证正确性:自己根据安全知识判断AI的结论是否正确。对于重入漏洞,这个判断是准确的。
- 追问修复方案:“很好,你指出了重入漏洞。那么,按照最佳实践,应该如何修复这个
withdraw函数?请提供修改后的代码。” AI应该能给出两种常见修复方案:- 检查-生效-交互模式:先更新状态,再进行外部调用。
function withdraw(uint _amount) public { require(balances[msg.sender] >= _amount, "Insufficient balance"); balances[msg.sender] -= _amount; // 先扣款 (bool success, ) = msg.sender.call{value: _amount}(""); // 再转账 require(success, "Transfer failed"); } - 使用重入锁:引入一个状态变量锁。
bool private locked; modifier noReentrant() { require(!locked, "No reentrancy"); locked = true; _; locked = false; } function withdraw(uint _amount) public noReentrant { ... }
- 检查-生效-交互模式:先更新状态,再进行外部调用。
- 挑战边界:“如果攻击者是一个普通的外部账户(EOA),而不是合约,这个重入漏洞还能被利用吗?为什么?” 这个问题是检验AI是否真正理解漏洞原理。它应该回答:不能,因为EOA接收ETH的调用没有关联的代码执行,无法在回调中再次发起对
withdraw的调用。
通过这样多轮的、有引导的交互,你才能把AI变成一个高效的“初级审计助手”。整个过程可能不止8分钟,但产出物的质量是可控的、可解释的。
3. AI安全审计的能力边界与当前局限
通过上面的实操,我们可以更冷静地看待AI在安全领域的实际能力与局限。
3.1 AI擅长什么:模式识别与知识库查询
- 快速扫描已知漏洞模式:如重入、整数溢出、未检查的call返回值、错误的可见性设置等。对于训练数据中高频出现的漏洞,AI的识别速度和准确率可以很高。
- 代码规范与最佳实践检查:能指出不符合Solidity样式指南或常见安全建议的写法,比如使用
transfer或send而非call,事件缺失等。 - 解释复杂代码段:对于新手来说,让AI解释一段复杂的链上逻辑或加密算法,可以帮助快速理解。
- 生成测试用例或POC思路:可以要求AI基于发现的漏洞,编写一个简单的攻击合约(Proof of Concept)框架,这能极大辅助验证工作。
3.2 AI不擅长什么:逻辑、业务与上下文
- 复杂的业务逻辑漏洞:这是AI的盲区。如果一个漏洞源于多个合约间错综复杂的状态交互、特定的业务规则组合或微妙的权限设计缺陷,AI很难发现。它缺乏对“业务意图”的真正理解。
- 新出现的、未广泛记录的漏洞类型:如果一种攻击手法是全新的,没有出现在其训练数据中,AI就无法识别。它是在“回忆”,而非“创造”。
- 环境与配置问题:AI分析的是代码文本,但很多安全问题出在链下:私钥管理、节点RPC配置、前端依赖库版本、运维脚本权限等。这些它完全看不到。
- 误报与漏报的权衡:AI为了追求覆盖率,可能会产生大量误报(将无害代码标记为可疑)。同时,它也可能因为代码写法变体或混淆而漏报真实漏洞。最终判断必须由人来做。
- 资源与成本:深度分析大型代码库需要消耗大量token,成本不菲。并且,将整个企业级项目代码发送给第三方AI存在严重的安全保密风险。
所以,标题带来的“担忧”有些过虑了。当前阶段的AI,更像是给安全工程师配了一个拥有超强记忆力和不知疲倦的“见习生”。它能把初级、重复的代码审查工作做得又快又好,但项目的整体安全架构、深度的逻辑审计、应急响应和最终决策,仍然牢牢依赖人类的经验和智慧。它降低了安全审计的门槛和部分成本,但远未达到替代专业人员的程度。
4. 将AI安全工具融入开发生命周期的建议
对于开发者和项目方,如何理性地利用这项技术呢?我的建议是将其作为开发流程中的一个自动化检查环节,而不是最终的“安全法官”。
4.1 在代码提交阶段:作为自动化扫描工具
在Git的pre-commit钩子或CI/CD流水线中,集成基于AI的代码安全扫描脚本。这个脚本可以:
- 针对变更的Solidity文件,调用AI API进行快速审查。
- 设定规则,只对高置信度的特定漏洞类别(如“重入”、“整数溢出”)发出警告或阻塞提交。
- 将AI的扫描结果与传统的静态分析工具(如Slither, Mythril)的结果进行对比,互为补充。
关键点:这个阶段的目标是捕获低级、明显的漏洞,防止它们进入代码库。要把AI的报警视为“必须查看的提醒”,而非“必须修复的错误”。
4.2 在代码审计阶段:作为人类审计员的辅助
在进行正式的人工代码审计时,审计员可以:
- 先将整个合约代码丢给AI,让它生成一份初步的“风险点报告”。
- 审计员不看AI的结论,自己先进行一遍独立审计。
- 完成独立审计后,再对照AI的报告,检查是否有自己遗漏的点,或者对AI标记的点进行二次研判。
这种方法既能利用AI的“记忆力”防止人类因疲劳而疏忽,又能确保审计的独立性和深度,避免被AI的误报/漏报带偏。
4.3 在安全学习与研究中:作为知识库和训练伙伴
对于学习区块链安全的新手:
- 用AI解释漏洞:当看到一个经典的漏洞代码时,可以让AI详细解释其原理、攻击步骤和修复方法,比单纯看文档更互动。
- 让AI出题:可以要求AI“生成一个包含重入漏洞的简单银行合约代码”,然后自己尝试去发现和利用它。
- 代码对比学习:给AI一个漏洞版本和一个修复版本,让它总结两者的关键区别,加深理解。
4.4 必须建立的安全红线
无论AI多么强大,有几条红线必须守住:
- 绝不将未脱敏的核心业务代码上传至不可控的第三方AI服务。考虑使用可本地部署的开源模型(虽然能力可能稍弱),或通过API使用但严格过滤输入信息。
- AI的结论必须经过人工复核。绝不能将AI的“建议”直接应用于生产环境,尤其是涉及资产转移、权限修改等关键操作。
- 不能依赖AI作为唯一的安全措施。传统的安全实践如多重签名、时间锁、漏洞赏金计划、第三方审计、监控和警报系统,依然是不可或缺的。
AI在8分钟内发现钱包漏洞,这个故事吸引眼球,但它揭示的真相是:我们多了一个强大的辅助工具。真正的“AI安全”担忧,不应该聚焦在“AI会不会取代黑客或安全工程师”,而应该转向“我们如何安全地使用AI”、“如何防止AI被用来生成更复杂的攻击代码”以及“如何确保AI工具本身不被污染或误导”。作为从业者,拥抱它,善用它,同时清醒地认识它的边界,这才是面对技术浪潮的务实态度。