| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 区块链 -> 智能合约场景下的模糊测试——智能合约基本介绍 -> 正文阅读 |
|
[区块链]智能合约场景下的模糊测试——智能合约基本介绍 |
智能合约场景下的模糊测试——智能合约基本介绍前言模糊测试和区块链的相关概念在此不再赘述,网络上有很多成熟的文档可以自行查阅。本人是在模糊测试领域有一年研究基础的CS研究生,应老板项目要求将模糊测试应用于区块链的智能合约场景并做一些新的尝试。奈何本人在区块链方向也是个小白,所以借此文对智能合约的相关概念作一个大致的了解并在此做一个总结,留作之后回顾。 如果内容有问题或者有歧义欢迎大家留言建议和交流。 一 基本概念1.1 智能合约智能合约是一种基于区块链平台运行,为缔约的多方提供安全可信赖能力的去中心化应用程序1。类似于一份不需要可信第三方监督或者参与的自动化合同,由技术手段来强制保证,在满足条件后能够自动履行承诺。 1.2 图灵完全2当一个数据操作规则(一门编程语言、或者一个指令集)能够实现图灵机模型里的全部功能时,就称它具有图灵完备性。其中被称为区块链2.0的以太坊,其最大的特点就是支持运行图灵完全的智能合约运行。 二 智能合约特性2.1 运行环境以太坊虚拟机(Ethereum Virtual Machine, EVM) 2.2 生命周期1)开发智能合约的开发语言包括Solidity、Vyper、idris等。其中Solidity是使用人数最多也是最活跃的。 2)编译所有语言开发的智能合约代码都需要被编译成统一的智能合约字节码(bytecode),才能在EVM上运行。被编译后还会生成相应的合约调用接口(Application Binary Interface, ABI). 3)部署合约的部署由一笔合约部署交易来完成,其中交易的数据(data),字段被设置为合约部署字节码,而交易的接收方被设置为空。矿工在进行交易打包时,将会按照交易发送者的地址(address)和交易序列号(nonce)信息来生成一个新的地址,并把合约的字节码部署到该地址。这个地址就是合约地址,也是合约的唯一标识。 4)调用区块链上的用户可以通过合约地址对合约进行调用。有两种调用方式: 5)销毁以太坊允许合约进行自我销毁,但是需要开发者在合约编写时加入这个功能。“销毁”只是意味着合约在当前的区块状态(state)中被标记为删除,且不能被后续调用,但其合约代码和Storage存储还是可以被恢复和查看。 2.3 程序特性1)Gas机制对合约的任何操作都需要申请固定额度的Gas,如果合约程序的执行开销超过了这个阈值,以太坊虚拟机就被抛出Out-Of-Gas异常来停止合约执行。Gas机制保障了合约程序的可终止性,但也会被利用以发起Dos攻击。 2)异常传递机制智能合约中的函数调用分为两种: 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)随机性不足指智能合约中误用了很多与区块链有关的变量作为随机源,但这样的做法将导致随机数可被预测。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 3:55:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |