两篇论文,都是关于智能合约漏洞检测的综述文章
[1]崔展齐,杨慧文,陈翔等.智能合约安全漏洞检测研究进展[J/OL].软件学报:1-33[2024-03-05].https://doi.org/10.13328/j.cnki.jos.007046.
[2]王丹,黄松,王兴亚.以太坊智能合约测试研究综述[J].信息技术与信息化,2023(10):52-58.
两篇文章中主要内容都是总结了13种常见的漏洞类型并进行简单介绍、几类测试方法以及未来的工作和展望。在第一篇论文中还介绍了当前的基于机器学习的测试方法的公开数据集。
1 漏洞类型
不单单是这两篇论文,在其他的智能合约漏洞检测论文中,都是从高级语言层、EVM层和区块链层三层来进行大分类的。由于目前常见的合约语言都是solidity语言,所以大部分的高级语言层也可以说是针对solidity语言来编写代码的漏洞。
下图是[1]文献中的漏洞分类表:
其中,重点了解了重入漏洞。
1.1 重入漏洞
在了解重入漏洞之前,需要先了解一下转账函数和回调函数:
转账函数主要有三种:transfer()、send()和call()函数,三者的区别在于遇到异常的时候是否会抛出异常以及后续的代码是否还会继续执行;
回调函数是指fallback()函数,该函数在向合约转账的时候会自动调用。
所以在重入攻击事件中,账户A在向攻击合约转账之后,会自动调用fallback函数,如果攻击函数在fallback函数中添加了withdraw函数,该函数就会继续完成账户A向合约转账的行为,就会一直循环下去,因为call函数是没有上限的,所以会一直转账直到A中没有余额。
所以想避免这样的情况发生,就需要:
1)避免使用到call函数
2)在转账之前要先修改状态,这样下一次就算自动调用转账,也会因为状态不满足而无法执行
3)引入互斥锁,锁定合约状态
2 漏洞检测方法
在两篇论文中,主要提到的测试方法有:
- 符号执行:模拟程序的所有可能执行路径来检查代码中潜在错误
- 模糊测试:通过向程序提供随机生成的、异常的或无效的输入来观察其行为,以发现程序中的错误。
- 机器学习:通过将智能合约代码转化为模型能够识别的特征,构建机器学习或深度学习模型学习漏洞模式,然后对未知的智能合约进行安全漏洞检测。
- 形式化验证:利用数学方法证明程序的安全性。通过对问题建立数学模型,利用数学语言描述整个系统的全部状态,从而验证程序在各个状态下是否保持安全性和可靠性。
下图是在机器学习方面著名的模型:
文献[2]
文献[1]:
其中图表征、序列表征和文本表征是指对代码进行怎么样的处理:
- 图表征:将源代码或字节码转换为控制流图、数据流图等表示形式,有效地抽象出智能合约代码的控制流逻辑、数据依赖关系等信息。反映代码中的语法和语义特征:GCN
- 序列表征:对源代码或字节码进行词法分析,提取变量访问、函数调用序列或语句调用序列等特征信息,并利用记忆力机制等方法学习提取出的序列信息:LSTM
- 文本表征:利用自然语言处理中的词嵌入算法,将智能合约转换为词向量。此方法直接把代码文本作为输入:Eth2Vec
3 展望
1、增加对其他平台或其他语言编写智能合约的检测工作,如Go、Java或Python智能合约。
2、在符号执行中采用静态和动态结合的方式,以缓解路径爆炸问题。
3、建立更精准的模糊测试模型,或构建验证器确认触发漏洞的测试用例。
4、构建可解释性更强的机器学习模型,或利用解释分析方法分析检测结果。
5、将动态检测方法作为静态分析的补充,对静态分析结果进行动态确认。