本文提出一种AI智能合约安全审计新方法:将Solidity语义转化为结构化自然语言,而非直接分析代码。作者认为LLMs擅长处理语言,这种“语义同构”方法能更有效地识别漏洞,早期实验结果也支持了这一观点。
大型语言模型(LLMs)主要通过语言进行训练,而非形式化的编程语义。然而,目前大多数AI审计方法仍要求它们直接对原始Solidity代码进行推理。
我的论点很简单:将智能合约语义转化为结构化的自然语言表示,可以使LLMs更容易检测到漏洞。
我们不再要求LLM对语法繁重的Solidity代码进行推理,而是将代码转换为语义叙述,明确捕捉以下内容:
然后,我们要求模型分析该表示,以发现矛盾、缺失的前提和不安全行为。
关键假设是,当程序语义以LLMs训练的领域——即语言——表达时,它们的推理更为可靠。
概念上的灵感来源于道格拉斯·霍夫施塔特(Douglas Hofstadter)的《哥德尔、埃舍尔、巴赫》(Gödel, Escher, Bach)。书中反复出现的一个主题是同构性(isomorphism):两个系统即使看起来完全不同,也可以共享相同的底层结构。
书中的例子包括:
不同的表示,相同的结构。
这个想法引出了一个问题:如果智能合约代码能够被翻译成另一种符号系统——语言——同时保留其语义,那会怎样?
换句话说,Solidity程序和结构化的自然语言系统描述可以是相同底层逻辑的同构表示。如果这种映射足够忠实,那么程序中的错误就应该表现为叙述中的逻辑不一致。
我实验的方法大致是:
Solidity → 语义提取 → 结构化英语表示 → LLM推理 → 潜在漏洞。
这种结构化表示不仅仅是文档。它明确描述了:
例如,一段Solidity代码序列:
token.transfer(msg.sender, amount);
balances[msg.sender] -= amount;
可以被翻译成语义表示,例如:
在这种形式下,模型无需从语法中推断语义。因果关系已经明确。
大多数智能合约漏洞并非语法错误。它们是语义不一致,例如:
这些本质上都是对逻辑规则的违反。
LLMs非常擅长检测矛盾、缺失的假设、因果不一致和叙述上的不连贯。
因此,与其要求模型解析Solidity语法并自行恢复语义,不如直接以语言形式呈现语义。
为了快速验证这个想法,我进行了一个非常简单的实验。
设置:
我在Code4rena Thor Wallet代码库上进行了测试,该代码库有公开记录的发现。
在相同的提示下:
在包含义务规则的其他测试中,两种表示都能检测到问题,但英语版本产生了更清晰的因果解释。
这些仍然是小型实验,但结果表明表示方式的改变可能确实很重要。
原始Solidity代码包含大量的语法噪音。模型必须恢复语义关系,例如:
结构化英语消除了这种负担,直接暴露了语义。
这种差异类似于比较机器码和源代码。计算是相同的,但一种表示方式更容易推理。
如果这个想法能够扩展,它将预示着AI审计工具的不同架构。
我们不再将LLM直接与原始代码结合,而是可以构建一个包含以下管道的系统:
代码 → 语义图 → 受控自然语言表示 → LLM推理 → 验证器循环。
在这种设计中,LLM成为语义推理引擎,而非代码解析器。
潜在的好处包括:
目前的原型仍处于非常早期阶段。接下来的步骤包括:
在CodeHawks First Flights(由于合约规模小,更适合小代币预算)、Code4rena竞赛和ScaBench/其他基准测试等数据集上进行测试,以验证表示优势是否适用于更多合约。
当前版本仍然有些描述性。更强大的版本将包括:
这将使系统更接近逻辑风格的语义语言。
漏洞通常只有在代码与明确的规则(例如:授权必须主导特权写入、可变权限必须在外部调用前被消耗、记账不变式必须保持一致)进行比较时才变得明显。编码这些义务允许模型检测规则违反,而不仅仅是可疑模式。
最终,发现的结果应被编译回不变式、模糊测试或符号执行查询,以确认漏洞是否真实存在。
这种方法可能最适用于语义漏洞,例如:
它可能对以下方面帮助不大:
但语义错误代表了真实DeFi漏洞的很大一部分。
核心思想很简单:智能合约漏洞通常是逻辑不一致。如果我们把代码翻译成一种表示形式,让这些不一致成为语言上的矛盾,那么语言模型可能会更有效地对其进行推理。
早期实验表明,与原始Solidity分析相比,结构化英语表示有时可以提高漏洞检测能力。
该项目仍处于起步阶段,但它提出了一个有趣的可能性:语言可能不仅仅是解释程序的一种方式,它也可能是AI推理程序的一种更好方式。
- 原文链接: x.com/arniesec/status/20...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!