智能合约场景下的模糊测试——智能合约基本介绍

  • 前言
  • 一 基本概念
    • 1.1 智能合约
    • 1.2 图灵完全
  • 二 智能合约特性
    • 2.1 运行环境
    • 2.2 生命周期
      • 1)开发
      • 2)编译
      • 3)部署
      • 4)调用
      • 5)销毁
    • 2.3 程序特性
      • 1)Gas机制
      • 2)异常传递机制
      • 3)委托调用
      • 4)合约代码无法修改
  • 三 智能合约安全威胁
    • 3.1 高级语言层面
      • 1)变量覆盖
      • 2)整数溢出
      • 3)未校验返回值
      • 4)任意地址写入
      • 5)拒绝服务
      • 6)资产冻结
      • 7)未初始化变量
      • 8)影子变量
    • 3.2 虚拟机层面
      • 9)重入
      • 10)代码注入
      • 11)短地址攻击
      • 12)不一致性攻击
    • 3.3 区块链层面
      • 13)时间戳依赖
      • 14)条件竞争
      • 15)随机性不足

前言

模糊测试和区块链的相关概念在此不再赘述,网络上有很多成熟的文档可以自行查阅。本人是在模糊测试领域有一年研究基础的CS研究生,应老板项目要求将模糊测试应用于区块链的智能合约场景并做一些新的尝试。奈何本人在区块链方向也是个小白,所以借此文对智能合约的相关概念作一个大致的了解并在此做一个总结,留作之后回顾。
本篇文章总结自注脚1中的综述,如若感兴趣可自行阅读原文。

如果内容有问题或者有歧义欢迎大家留言建议和交流。

一 基本概念

1.1 智能合约

智能合约是一种基于区块链平台运行,为缔约的多方提供安全可信赖能力的去中心化应用程序1。类似于一份不需要可信第三方监督或者参与的自动化合同,由技术手段来强制保证,在满足条件后能够自动履行承诺。
并且智能合约在部署到区块链平台之后是不能修改的,这也是把模糊测试应用到这个场景的主要动机,合约上线之前需要进行充分的测试,而模糊测试是一种非常有效的测试手段。

1.2 图灵完全

2当一个数据操作规则(一门编程语言、或者一个指令集)能够实现图灵机模型里的全部功能时,就称它具有图灵完备性。其中被称为区块链2.0的以太坊,其最大的特点就是支持运行图灵完全的智能合约运行。

二 智能合约特性

2.1 运行环境

以太坊虚拟机(Ethereum Virtual Machine, EVM)

EVM是一个无寄存器,基于栈式运行的虚拟机。其为智能合约提供了三种不同的存储空间,分别为栈(Stack)、临时内存(Memory)和永久存储(Storage)。前两者是临时的,仅在智能合约被调用时使用,Storage的存储结果则是永久生效的;Stack用于保存各种临时数据,以32字节为访问粒度;Momory用于保存数组字符串等较大的临时数据,以单字节为访问粒度。

2.2 生命周期

1)开发

智能合约的开发语言包括Solidity、Vyper、idris等。其中Solidity是使用人数最多也是最活跃的。

2)编译

所有语言开发的智能合约代码都需要被编译成统一的智能合约字节码(bytecode),才能在EVM上运行。被编译后还会生成相应的合约调用接口(Application Binary Interface, ABI).

3)部署

合约的部署由一笔合约部署交易来完成,其中交易的数据(data),字段被设置为合约部署字节码,而交易的接收方被设置为空。矿工在进行交易打包时,将会按照交易发送者的地址(address)和交易序列号(nonce)信息来生成一个新的地址,并把合约的字节码部署到该地址。这个地址就是合约地址,也是合约的唯一标识。

4)调用

区块链上的用户可以通过合约地址对合约进行调用。有两种调用方式:
一种是由普通地址发起一笔合约调用交易,这被成为交易调用(Transaction Call),会在区块数据中留下调用信息;
另一种是由某个合约发起的对另一个合约中函数的调用,称为消息调用(Message Call),不会留下调用参数信息。

5)销毁

以太坊允许合约进行自我销毁,但是需要开发者在合约编写时加入这个功能。“销毁”只是意味着合约在当前的区块状态(state)中被标记为删除,且不能被后续调用,但其合约代码和Storage存储还是可以被恢复和查看。

2.3 程序特性

1)Gas机制

对合约的任何操作都需要申请固定额度的Gas,如果合约程序的执行开销超过了这个阈值,以太坊虚拟机就被抛出Out-Of-Gas异常来停止合约执行。Gas机制保障了合约程序的可终止性,但也会被利用以发起Dos攻击。

2)异常传递机制

智能合约中的函数调用分为两种:
对本合约或父合约中函数的内部函数调用
对指定地址的外部合约函数的外部函数调用
内部调用只需要指令跳转,外部调用需要使用CALL命令向外部合约发送消息。后者如果在执行中发生错误,则异常不会延调用栈进行传递,而是直接用bool类型的返回值来标识调用是否完成。这也引发了很多安全问题。

3)委托调用

DELEGATECALL会改变函数调用者的上下文信息。所以一旦调用的目标地址被攻击者可控,攻击者就能在当前合约上执行任意代码…

4)合约代码无法修改

见1.1节

三 智能合约安全威胁

智能合约由很多区别于普通程序的特性,也因此带来了新的安全威胁。我按照注脚1综述中的顺序对智能合约中高级语言、虚拟机和区块链三个层面的安全漏洞作一个大体的概括。

3.1 高级语言层面

1)变量覆盖

solidity中没有特殊声明的变量应为Memory类型,但在某些版本的solidity中默认声明的数组或结构体会被误用为Storage类型的变量,而Storage中的变量一般为重要信息或者管理员信息。攻击者可以利用这个漏洞对关键信息进行恶意纂改。

2)整数溢出

各种计算机语言中常见的一种错误,需要加安全性检测。

3)未校验返回值

本文2.3.2的异常传递机制中说过,对外部合约调用的返回值只是简单的bool,因此开发者需要对这些返回值进行提前的预校验而不是交给合约的使用者自己处理,这容易造成合约内部控制流状态混乱。

4)任意地址写入

合约中包含用户可控的对任意Storage地址写入数据的漏洞。

5)拒绝服务

不安全的代码编写规范导致合约易受Dos攻击。

6)资产冻结

智能合约的一个重要作用是管理区块链平台上的数字资产。开发者如果在开发合约时只有接受ETH的功能而没有任何允许ETH转出的操作,则合约接受到的ETH资产将被永久冻结= =,一定程度上也因为合约部署之后无法被修改。

7)未初始化变量

没有被初始化的Storage变量可能会指向位置的Storage存储内容,对这些变量的读取会导致未知事件。

8)影子变量

各种情况下的全局变量和局部变量重名引起的逻辑问题。

3.2 虚拟机层面

特指EVM

9)重入

理应是原子性事务的“修改Storage变量并转账”这个操作采用了先转账再修改Storage变量的顺序,转账操作被恶意利用反复递归执行,从而破坏操作的原子性,进而重复获得转账收益。

10)代码注入

智能合约中的DELEGATECALL会使用调用目标的上下文信息,如果外部合约的地址是由攻击者可以控制的,攻击者就可以任意修改这个地址在当前合约中执行任何想要执行的代码。

11)短地址攻击

攻击者通过构造末尾为零的地址进行合约调用,并在调用参数中故意将地址末尾的零社区,从而利用虚拟机对于数据的自动补全机制将第二个参数进行移位放大。如果合约没有对用户输入长度进行校验,就会因为这个漏洞使得实际转账金额被扩大若干倍。

12)不一致性攻击

指智能合约因虚拟机实现不一致从而导致的智能合约状态混乱。

3.3 区块链层面

13)时间戳依赖

指智能合约在代码中使用严格的时间戳来进行重要的控制流决策,从而引入的安全漏洞。区块时间戳看似具有偶然性,但却是可以被矿工在一定的取值范围内操控的。

14)条件竞争

指智能合约中仅通过交易顺序来作为决策条件的程序逻辑所引起的漏洞。原因在于交易在由用户发起后,便可以被网络中的部分节点观测到,但此时离交易被打包尚有一段时间,且矿工通常先打包手续费更高的交易,因此攻击者可以快速发起同样的交易并通过提高手续费的方式让自己的交易被优先打包。条件竞争漏洞的根源在于区块链的交易打包和手续费机制。

15)随机性不足

指智能合约中误用了很多与区块链有关的变量作为随机源,但这样的做法将导致随机数可被预测。


  1. 倪远东, 张超与殷婷婷, 智能合约安全漏洞研究综述. 信息安全学报, 2020. 5(03): 第78-99页. ↩︎

  2. 什么是图灵完备?https://www.zhihu.com/question/20115374 ↩︎

智能合约场景下的模糊测试——智能合约基本介绍相关推荐

  1. 智能音箱场景下的性能优化

    QCon是由InfoQ主办的综合性技术盛会,今年是Qcon举办的第10个年头,半吊子全栈工匠有幸作为演讲嘉宾分享一个近两年来的实践经验--智能音箱场景下的性能优化,隶属于曾波老师出品的"场景 ...

  2. 虹科物联网设备安全分析与防护平台——更智能的工业通信协议黑盒模糊测试

    工业控制系统 (ICS) 可能成为大型工业企业的重大漏洞.攻击者如果发现系统中的漏洞,可以将其作为攻击向量,也可以将其用于受攻击网络中的横向运动,在不同系统之间传播攻击. 传统上,连接工业控制系统的计 ...

  3. Backtrack5 下WEB模糊测试

    什么是WEB模糊测试 Web浏览器最初只是被设计为浏览Web页以及解析HTML页,现在Web浏览器已经发展成为和瑞士军刀的多功能性相等价的计算机设备.现代的Web浏览器可以处理动态HTML页.类型表单 ...

  4. 使用Jenkins自动远程调用压测机实现不同用户场景下的并发测试

    需求分析: 性能测试过程中,由于环境的不足,或者项目需求,需要在凌晨才能执行性能测试,这样就需要实现自动执行性能测试场景,并且能实现多次执行不同用户并发.并且自动生成结果 本文就介绍如何使用jenki ...

  5. jeep智能手表软件测评中心的测试,智能手表哪款好之Jeep新款智能手表试用测评...

    现如今人们的生活水平提高了,更注重健康了,所谓健康就要坚持运动,让身体达到最佳的状态,所以在运动的同时就需要一款能"监督"我们的产品,比如说你跑步时,你的心率正不正常,你跑了多长的 ...

  6. 同步盘场景下windows桌面测试注意事项(一)

    # windows桌面 desktop.ini简介 desktop.ini是系统可识别的一个文件,作用是存储用户对文件夹的个性设置(用户更换文件夹图标等等都会生成desktop.ini) 用户看到桌面 ...

  7. 模糊测试技术简单整理(一)

    模糊测试技术 2022-01-09- 文章目录 模糊测试技术 预处理 1. 插桩: 2. 符号执行 3. 污点分析 基于AFL的模糊测试方法 输入构造 评估 结果分析 具体应用场景下的模糊测试 物联网 ...

  8. 软件测试 | 测试开发 | 智能音箱语音交互系统简介与测试初探

    随着AI技术的发展,智能语音交互技术也得到了巨大的发展和应用.由于语音是最自然的交互形态之一,有着输入效率高.门槛低.方便解放双手以及能有效进行情感交流的优势,使得智能音箱成为语音交互的典型应用产品. ...

  9. 智能音箱语音交互系统简介与测试初探

    随着AI技术的发展,智能语音交互技术也得到了巨大的发展和应用.由于语音是最自然的交互形态之一,有着输入效率高.门槛低.方便解放双手以及能有效进行情感交流的优势,使得智能音箱成为语音交互的典型应用产品. ...

最新文章

  1. python3程序下载安装_程序猿的语言,Python 3.7.0下载安装
  2. 高压缩比 压缩软件 linux,Linux下压缩软件对比
  3. 详解@EnableEurekaServer和@EnableDiscoveryClient 或 @EnableEurekaClient注解
  4. 135、JS和Android交互范例
  5. powerbi的功能介绍_PowerBI 8月更新,这几个实用功能,你应该会用到
  6. rabbitmq怎么停止_rabbitmq 启动与停止
  7. dotnet core 微服务教程
  8. keyevent 封装_adb shell input keyevent 控制按键输入的数值(收藏版)
  9. Maven学习总结(30)——Maven项目通用三级版本号说明
  10. 文字两侧加横线的解决方案
  11. MySQL下xtrabackup与MTS造成的死锁
  12. LINUX下,ffmpeg增加NVIDIA硬件编解码的步骤及解决办法
  13. 【实用开发工具】将BAT脚本打包成exe可执行文件
  14. ApacheCN 翻译活动进度公告 2019.6.15
  15. JVAV - 对接支付宝- 下载对账单接口
  16. opencv学习日记
  17. F(x) - NU ABO 韩中(繁)ass字幕
  18. 运算放大器分析----虚短和虚断(转载)
  19. MYSQL数据库版本更新
  20. 内存溢出(Memory Overflow)和内存泄露(Memory Leak)的区别

热门文章

  1. 垂直行业(新站)SEO流量快速起飞的核心思路
  2. 关于高频信号/LVDS/示波器使用心得
  3. UI设计师零基础入门指南(附2019最新UI设计学习线路图)
  4. 学习笔记2-Sisco硬件
  5. mysql 修改表字段裂隙_[terry笔记]data guard基础知识
  6. 编写java应用程序,使用Scanner对象输入并输出学生基本信息
  7. HIve的聚合模式室友不知道,我学会了给他们讲
  8. Android 秒表 Demo 介绍
  9. 【JDK8、JDK11资源分享-迅雷下载】
  10. 手机拍摄界面的各种符合如何使用-以小米10为例