基于随机森林的智能合约漏洞检测方法CDRF
在区块链技术中,智能合约的安全性至关重要。然而,现有的智能合约漏洞检测方法存在诸多不足。本文将介绍一种基于随机森林的智能合约漏洞检测方法CDRF,它能有效检测智能合约中的四种常见漏洞。
1. 现有检测方法分析
传统的智能合约漏洞检测方法包括特征代码匹配、形式化分析方法、符号执行方法、静态分析方法、污点分析方法和模糊测试方法等。近年来,出现了三种主流的检测方法:特征代码匹配、形式化验证以及基于符号执行和抽象约束的自动化审计方法。
-
特征代码匹配
:从包含漏洞的智能合约源代码中提取特征,将每种漏洞代码抽象为一组漏洞语义匹配模板。但以太坊上的大多数智能合约只提供字节码,检测前需将字节码逆向分析转换为源代码,大量的准备工作限制了该方法的发展。
-
形式化验证
:基于形式化验证的审计工具支持的智能合约漏洞类型较少,且大多使用严格的数学定理证明和复杂的机制进行漏洞验证,不适合实际的智能合约漏洞检测。
-
符号执行
:大多数基于符号执行的检测工具能支持更多类型的合约漏洞检测,但收集所有可执行路径不全面且耗时较长。
通过对现有研究方法的分析,发现检测效果不佳,部分方法缺乏对漏洞代码语义特征的理解,未考虑通用的检测方法。因此,提出了基于随机森林的智能合约漏洞检测方法CDRF。
2. 相关基础知识
在深入了解CDRF方法之前,需要先了解一些相关的基础知识。
-
以太坊
:作为一个公开可用的区块链平台,以太坊是一个去中心化的公共账本,用于验证和记录交易。它提供了一个去中心化的以太坊虚拟机(EVM),使用户能够在区块链上部署基于智能合约的应用程序(DApps)。目前,以太坊使用工作量证明(PoW)共识协议来确保账本数据在不可靠的异步网络中的一致性和正确性。
-
智能合约字节码和操作码
:在以太坊上,合约的部署主要通过以下三个步骤:
1. 开发者使用Solidity编写智能合约。
2. 编译器将源代码编译为字节码,字节码是由一串十六进制数字编码的字节数组。
3. EVM读取十六进制数字的字节码,以一个字节为单位进行分析,每个字节代表一个EVM指令或一个操作码。目前,EVM提供140个操作码指令,其中135个在以太坊黄皮书中有定义。
-
常见漏洞介绍
:
-
重入漏洞
:2016年,黑客利用重入漏洞窃取了约6000万美元。该漏洞是由智能合约独特的回退机制引起的。当智能合约进行跨合约转账操作时,接收方合约中的回调函数会被触发。如果恶意攻击者在回调函数中添加恶意代码,会递归调用受害者合约的转账函数,直到燃气耗尽。
-
tx.origin漏洞
:tx.origin是智能合约中的一个全局变量,它遍历调用栈并返回最初发起调用的合约地址。如果智能合约使用tx.origin进行用户身份验证或授权,攻击者可以利用该漏洞攻击智能合约,窃取以太币。
-
时间戳依赖漏洞
:智能合约通常使用矿工确认的区块时间戳来实现时间约束。然而,矿工可以在约900秒的误差范围内调整时间戳,攻击者可以利用这一漏洞生成特定的时间戳进行攻击。
-
整数溢出漏洞
:在智能合约中,整数溢出包括加法溢出、减法溢出和乘法溢出。以太坊虚拟机(EVM)为整数分配固定大小的数据类型,Solidity支持uint8到uint256。如果将超出范围的值存储到uint8类型的变量中,会导致整数溢出错误。
3. CDRF模型构建
CDRF模型的构建分为三个步骤:数据预处理、特征提取和漏洞检测。
-
数据预处理
:
-
数据集
:从以太坊官方网站收集了53651个在2022年6月之前经过验证的智能合约,数据集包含四种漏洞类型的合约,具体数量如下表所示:
| 分类器 | 该类型(有漏洞) | 其余(无漏洞) | 总数 |
| ---- | ---- | ---- | ---- |
| 整数溢出 | 10209 | 43442 | 53651 |
| 时间戳 | 3720 | 49931 | 53651 |
| 重入 | 1710 | 51941 | 53651 |
| tx.origin | 987 | 52664 | 53651 |
-
标签
:使用Oyente和Mythril工具对智能合约进行标记,并手动判断工具标记的漏洞。每个检测的合约有四个标签,分别对应四种漏洞类型,标签相互独立。
-
操作码简化
:将智能合约数据集编译为字节码,使用vandal工具将字节码反编译为操作码,通过去除操作数来简化操作码片段。
下面是数据预处理的流程图:
graph LR
A[收集智能合约] --> B[标记漏洞类型]
B --> C[编译为字节码]
C --> D[反编译为操作码]
D --> E[去除操作数简化操作码]
-
特征提取 :
- 操作码片段提取 :分析四种漏洞的原理和关键漏洞语句,提取包含关键漏洞指令的操作码片段。
- 特征矩阵 :将操作码片段输入到word2vec中,生成特征向量矩阵,每行代表一个操作码的特征向量,包含10个特征。将操作码的10个特征求和代表该操作码的特征向量,将每个操作码的词向量组合成一个数组代表操作码片段特征。
- 降维 :由于操作码片段长度不同,词向量长度也不同。以最长词向量的长度为标准,若词向量长度小于该标准,则用0填充。然后使用PCA对填充后的词向量进行降维。
-
漏洞检测 :使用五种机器学习算法,即随机森林(RF)、Light Gradient Boosting Machine(LightGBM)、极端梯度提升(XGBoost)、自适应提升(AdaBoost)和支持向量机(SVM)来检测智能合约中是否存在漏洞。
4. 操作码片段提取
针对四种常见漏洞,分别提取其操作码片段。
-
重入漏洞
:
-
攻击过程
:攻击者调用攻击合约的函数,触发受害者合约的转账函数,在转账时自动运行攻击合约的回退函数,再次调用受害者合约的转账函数,循环执行。
-
关键漏洞语句
:
require(msg.sender.call.value (amount)()); balances[msg.sender]-= amount
。
-
漏洞操作码片段
:如果操作码片段中CALL指令所在位置没有KECCAK256(SHA3)、SLOAD和SSTORE指令,说明在转账操作前未更新账户余额,合约存在重入漏洞。
-
tx.origin漏洞
:
-
攻击过程
:受害者调用易受攻击的合约向攻击合约发送交易,触发攻击合约的回退函数,通过验证并将资金转移到攻击者地址。
-
关键漏洞语句
:
require(tx.origin== owner)
。
-
漏洞操作码片段
:如果操作码片段中包含ORIGIN、EQ和ISZERO指令,说明智能合约使用tx.origin进行身份验证,合约存在tx.origin漏洞。
-
时间戳依赖漏洞
:
-
攻击过程
:矿工在900秒内调整时间戳,使其能被15整除,先向合约转账10个以太币,从而获得之前转入该合约的所有以太币。
-
关键漏洞语句
:
pastBlockTime = now;if(now % 15==0)
。
-
漏洞操作码片段
:如果操作码片段中包含TIMESTAMP、SSTORE和ISZERO指令,说明合约存在时间戳依赖漏洞。
-
整数溢出漏洞
:
-
漏洞原因
:程序员在计算时未检查用户输入,对加法、减法和乘法操作结果没有进行溢出判断。
-
关键漏洞语句
:
return max + 1; return min −1; return mul * 2
。
-
漏洞操作码片段
:如果操作码片段中ADD、GT或MUL指令所在位置没有LT、ISZREO和EQ指令,说明对加法、减法和乘法操作没有进行溢出判断,合约存在整数溢出漏洞。
5. 训练集、分类算法和模型选择
- 训练集划分 :将数据集按照8:2的比例划分为训练集和验证集。
-
分类算法
:使用四种集成学习算法(RF、LightGBM、XGBoost、AdaBoost)和一种简单的监督分类算法SVM进行智能合约漏洞检测。
-
随机森林(RF)
:
- 随机采样:通过bagging从样本集中随机选择n个样本。
- 特征随机化:从所有特征d中随机选择k个特征(k < d),然后从k个特征中选择最佳分割特征作为节点构建CART决策树。
- 重复上述两步m次,构建m个CART决策树,形成随机森林。
- Light Gradient Boosting Machine(LightGBM) :基于GBDT的改进模型,决策树使用叶向策略控制模型复杂度,目标函数改进为二阶泰勒展开,并添加正则化项。
- eXtreme Gradient Boosting(XGBoost) :一种提升算法,提高了速度和效率,在目标函数中添加正则项以控制模型复杂度,防止过拟合。
-
Adaptive Boosting(AdaBoost)
:
- 初始化原始数据集的权重。
- 使用加权数据集训练弱学习器。
- 根据弱学习器的误差计算其权重。
- 增加分类错误样本的权重,相对降低分类正确样本的权重。
- 重复步骤2 - 4 K - 1次,将K - 1个弱学习器的结果加权组合。
- 支持向量机(SVM) :目的是找到一个划分超平面,将样本分为正样本或负样本,并选择具有最佳泛化能力的划分超平面,以最大化正样本和负样本之间的间隔。
-
随机森林(RF)
:
CDRF方法通过对智能合约进行数据预处理、特征提取和漏洞检测,能够快速有效地检测四种智能合约漏洞。在实际合约上运行时,F1分数的最高预测值为98.03%,其余均高于93%;AUC的最高预测值为99.56%,其余均高于94%,且每个智能合约的平均检测时间为3秒。这种方法为智能合约的安全检测提供了一种有效的解决方案。
基于随机森林的智能合约漏洞检测方法CDRF
6. 检测效果评估
为了验证CDRF方法的有效性,在实际的智能合约数据集上进行了测试。测试结果表明,该方法能够快速且高效地检测出四种智能合约漏洞。
| 评估指标 | 最高预测值 | 其余范围 |
| ---- | ---- | ---- |
| F1 - 分数 | 98.03% | 高于93% |
| AUC | 99.56% | 高于94% |
同时,每个智能合约的平均检测时间仅为3秒,这说明CDRF方法在检测效率上表现出色。
下面是CDRF方法检测效果的流程图:
graph LR
A[输入智能合约] --> B[CDRF方法检测]
B --> C[输出检测结果]
C --> D{是否有漏洞}
D -- 是 --> E[标记漏洞类型]
D -- 否 --> F[无漏洞提示]
7. 方法优势与创新点
- 全面性 :CDRF方法能够同时检测四种常见的智能合约漏洞,包括重入漏洞、tx.origin漏洞、时间戳依赖漏洞和整数溢出漏洞,覆盖范围广。
- 高效性 :通过数据预处理、特征提取和降维等步骤,减少了数据的复杂度,提高了检测效率。同时,使用多种机器学习算法进行漏洞检测,能够充分发挥不同算法的优势,提高检测的准确性。
- 创新性 :总结了四种包含关键漏洞指令的操作码片段,并通过word2vec和PCA进行特征提取和降维,获得一维二进制特征,这种方法在智能合约漏洞检测领域具有创新性。
8. 实际应用场景
CDRF方法在智能合约的开发、部署和维护过程中具有广泛的应用场景。
-
开发阶段
:开发者可以使用CDRF方法对智能合约进行漏洞检测,及时发现并修复潜在的安全问题,提高智能合约的安全性。
-
部署阶段
:在智能合约部署到区块链之前,使用CDRF方法进行检测,确保合约在上线前没有安全漏洞,避免因漏洞导致的经济损失。
-
维护阶段
:定期对已部署的智能合约进行检测,及时发现新出现的漏洞,并采取相应的措施进行修复,保障智能合约的长期稳定运行。
9. 未来展望
尽管CDRF方法在智能合约漏洞检测方面取得了较好的效果,但仍有一些方面可以进一步改进和完善。
-
漏洞类型扩展
:随着智能合约技术的不断发展,可能会出现新的漏洞类型。未来可以进一步扩展CDRF方法的检测范围,以应对不断变化的安全挑战。
-
算法优化
:可以尝试使用更先进的机器学习算法或深度学习算法,进一步提高检测的准确性和效率。
-
与其他安全技术结合
:将CDRF方法与其他安全技术,如形式化验证、符号执行等相结合,形成更加完善的智能合约安全检测体系。
10. 总结
本文介绍了一种基于随机森林的智能合约漏洞检测方法CDRF。该方法通过数据预处理、特征提取和漏洞检测等步骤,能够快速有效地检测四种常见的智能合约漏洞。在实际合约上的测试结果表明,CDRF方法具有较高的检测准确性和效率,为智能合约的安全检测提供了一种有效的解决方案。同时,我们也对CDRF方法的未来发展进行了展望,希望能够不断完善该方法,为智能合约的安全运行提供更有力的保障。
以下是CDRF方法的整体流程总结:
1. 数据预处理
- 收集智能合约
- 标记漏洞类型
- 编译为字节码
- 反编译为操作码
- 去除操作数简化操作码
2. 特征提取
- 操作码片段提取
- 特征矩阵生成
- 降维处理
3. 漏洞检测
- 使用五种机器学习算法进行检测
4. 评估与优化
- 评估检测效果
- 根据结果进行算法优化和漏洞类型扩展
通过以上步骤,CDRF方法能够为智能合约的安全检测提供全面、高效的解决方案,帮助开发者和用户更好地保障智能合约的安全性。
超级会员免费看
5

被折叠的 条评论
为什么被折叠?



