【论文阅读】关于智能合约的漏洞检测

两篇论文,都是关于智能合约漏洞检测的综述文章
[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
分类2
其中,重点了解了重入漏洞。

1.1 重入漏洞

在了解重入漏洞之前,需要先了解一下转账函数和回调函数:
转账函数主要有三种:transfer()、send()和call()函数,三者的区别在于遇到异常的时候是否会抛出异常以及后续的代码是否还会继续执行;
回调函数是指fallback()函数,该函数在向合约转账的时候会自动调用。
所以在重入攻击事件中,账户A在向攻击合约转账之后,会自动调用fallback函数,如果攻击函数在fallback函数中添加了withdraw函数,该函数就会继续完成账户A向合约转账的行为,就会一直循环下去,因为call函数是没有上限的,所以会一直转账直到A中没有余额。
重入攻击
所以想避免这样的情况发生,就需要:
1)避免使用到call函数
2)在转账之前要先修改状态,这样下一次就算自动调用转账,也会因为状态不满足而无法执行
3)引入互斥锁,锁定合约状态

2 漏洞检测方法

在两篇论文中,主要提到的测试方法有:

  1. 符号执行:模拟程序的所有可能执行路径来检查代码中潜在错误
  2. 模糊测试:通过向程序提供随机生成的、异常的或无效的输入来观察其行为,以发现程序中的错误。
  3. 机器学习:通过将智能合约代码转化为模型能够识别的特征,构建机器学习或深度学习模型学习漏洞模式,然后对未知的智能合约进行安全漏洞检测。
  4. 形式化验证:利用数学方法证明程序的安全性。通过对问题建立数学模型,利用数学语言描述整个系统的全部状态,从而验证程序在各个状态下是否保持安全性和可靠性。
    下图是在机器学习方面著名的模型:

文献[2]模型1

文献[1]:模型2
其中图表征、序列表征和文本表征是指对代码进行怎么样的处理:

  1. 图表征:将源代码或字节码转换为控制流图、数据流图等表示形式,有效地抽象出智能合约代码的控制流逻辑、数据依赖关系等信息。反映代码中的语法和语义特征:GCN
  2. 序列表征:对源代码或字节码进行词法分析,提取变量访问、函数调用序列或语句调用序列等特征信息,并利用记忆力机制等方法学习提取出的序列信息:LSTM
  3. 文本表征:利用自然语言处理中的词嵌入算法,将智能合约转换为词向量。此方法直接把代码文本作为输入:Eth2Vec

3 展望

1、增加对其他平台或其他语言编写智能合约的检测工作,如Go、Java或Python智能合约。
2、在符号执行中采用静态和动态结合的方式,以缓解路径爆炸问题。
3、建立更精准的模糊测试模型,或构建验证器确认触发漏洞的测试用例。
4、构建可解释性更强的机器学习模型,或利用解释分析方法分析检测结果。
5、将动态检测方法作为静态分析的补充,对静态分析结果进行动态确认。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/732851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法设计与分析(超详解!) 第一节 算法概述

1.算法的定义 算法的非形式化定义:算法是规则的有限集合,是为解决特定问题而规定的一系列操作。 可以理解为:算法(algorithm)是指在解决问题时,按照某种机械的步骤一定可以得到问题的结果(有的…

【黑马程序员】STL实战--演讲比赛管理系统

文章目录 演讲比赛管理系统需求说明比赛规则程序功能 创建管理类功能描述创建演讲比赛管理类 菜单功能添加菜单成员函数声明菜单成员函数实现菜单功能测试 退出功能添加退出功能声明退出成员函数实现退出功能测试 演讲比赛功能功能分析创建选手类比赛成员属性添加初始化属性创建…

iOS小技能:设置app语言(跟随系统和特定语言)

文章目录 引言I 读取本地化字符串的方式1.1 设置当前语言工具类(封装读取本地化字符串)1.2 获取系统语言环境1.3 跟随系统1.4 根据特定bundle读取本地化字符串II 设置app语言2.1 设置语言2.2 语言切换界面2.3 重新加载所有界面以更新语言2.4 资源文件III 案例:登录界面切换中…

数据分析-Pandas最简单的方法画矩阵散点图

数据分析-Pandas直接画矩阵散点图 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据表&…

有点炫酷有点diao的免费wordpress模板主题

这是一款经典的免费wordpress主题,被广泛应用于多个行业的网站。 https://www.wpniu.com/themes/189.html

在Ubuntu 20.04中设置开机自启动脚本

这里写目录标题 1. 在Ubuntu 20.04中设置开机自启动脚本2. 取消上面的命令 1. 在Ubuntu 20.04中设置开机自启动脚本 在Ubuntu 20.04中设置开机自启动脚本,您可以使用systemd服务来实现。下面是如何将您的脚本设置为开机自启动的步骤: 创建systemd服务文…

vulhub中Weblogic < 10.3.6 ‘wls-wsat‘ XMLDecoder 反序列化漏洞(CVE-2017-10271)复现

Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。 访问http://your-ip:7001/即可看到一个404页面,说明weblogic已成功启动 …

Kubernetes 安全秘籍:5 个你必须知道的知识点

Kubernetes 安全和身份验证是确保集群和应用安全的关键。今天将深入探讨 Service Account、身份验证和RBAC的关键概念和实践,帮助您构建安全可靠的应用。今天本文将着重于安全相关的内容,并提供更详细的示例和配置说明,帮助兄弟们更深入地理解…

Vue的table组件合并行方法

/*** param {Array} data - 原始数据集合* param {string} addParamer - 这个是自定义的参数,向每个对象中添加一个参数 按照这个参数的个数进行合并* param {} args - 剩余参数 这个是合并规则 ,比如按照时间合并 那就传入对象中的时间参数date&#xf…

String StringBuffer StringBuilder StringJoiner区别

String、StringBuffer、StringBuilder和StringJoiner在Java中都是处理字符串的工具,但它们各自有不同的特点和适用场景。 String: 是不可变的字符序列,一旦创建就不能更改其内容。每次对String进行修改时,实际上会生成一个新的String对象。这…

机器人期刊:Science Robotics and IEEE Transactions

文章目录 1. Science Robotics (出版商 AAAS)2. IEEE Transactions on RoboticsReference1. Science Robotics (出版商 AAAS) https://www.science.org/journal/scirobotics 2. IEEE Transactions on Robotics

10kV/35kV并网分布式光伏系统-实现错峰有序用电

根据国家电网 Q/GDW1480-2015 《分布式电源接入电网技术规定》:分布式电源并网电压等级可根据各 并网点装机容量进行初步选择,推荐如下: • 8kW 及以下可接入 220V ; • 8kW~400kW 可接入 380V ; • 400kW~60…

Solidity Uniswap V2 Pair中交换Token

交换意味着使用一定数量的TokenA来换取Tokenb。但我们需要一些额外的辅助服务: 1.提供实际汇率。 2.保证所有的交易都是在正确的汇率下进行的。 GitHub - XuHugo/solidityproject: DApp go go go !!! 我们在研究流动性供应时学到了一些关于 D…

【Appium问题】每次启动appium都会安装一次uiautomator

问题 每次启动appium,都需要安装一次uiautomator2比较麻烦 解决 在配置文件capabilities 中增加参数skipServerInstallationTrue

【C++专栏】C++入门 | 函数重载、引用、内联函数

博客主页:Duck Bro 博客主页系列专栏:C专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ C入门 | 函数重载、引用、内联函数 文章编号:C入门 / 02 文…

mongodb的备份与恢复

查询语句 show dbs use leshusanguo show tables db.user.find() db.user.find({},{uid:1,nickname:1,max_level:1}) db.user.find({max_level:1},{uid:1,nickname:1,max_level:1}) db.user.count() db.user.find({max_level:1,uid:672064,},{uid:1,nickname:1,max_level:1}) …

Docker的奇幻漂流

航海日志:Docker的奇幻漂流 欢迎各位探险家们,今天我们将启航进入一个由容器构成的神秘海域——Docker。在这个由代码构建的奇妙世界里,我们将学习如何驾驭这些名为“容器”的神奇船只。准备好了吗?让我们扬帆起航,探…

ORACLE RAC反应卡顿时enq: SV - contention和latch: row cache objects的分析

某客户数据库系统使用ORACLE RAC 11G版本,两个节点。在上午8点钟之后,业务开始大量进行时,出现严重的卡顿问题;在工程师分析后,发现当时出现了很多异常等待数据,如典型的enq: SV - contention 、enq: TX - …

基于单片机的老人防丢系统设计

目 录 摘 要 I Abstract II 引 言 3 1 系统总体架构 6 1.1方案设计与选择 6 1.2 系统架构设计 6 1.3 系统器件选择 7 2 系统硬件设计 9 2.1 单片机外围电路设计 9 2.2 LCD1602液晶显示电路设计 12 2.3 短信模块电路设计 14 2.4 GPS模块电路设计 14 2.5 电源与按键控制电路设计…

用 reduce 实现 map 的功能

Array.prototype.map function (callback) {const array this;return array.reduce((acc, cur, index) > {acc.push(callback(cur, index, array));return acc;}, []); }; 测试: var m [1, 2, 3, 4, 5].map(function (v, i, arr) {return v v; }); console…