![](https://img-blog.csdnimg.cn/20210715210810700.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
智能合约审计
文章平均质量分 83
以太坊智能合约审计
FLy_鹏程万里
国内网络安全研究员,专注于Web渗透、移动安全、代码审计、应急响应、内网渗透、区块链安全、云安全等研究方向,擅长渗透测试、红蓝对抗、内网渗透、云安全、区块链安全。
展开
-
智能合约审计之权限校验错误
Tx.origin鉴权简单介绍tx.origin是Solidity的一个全局变量,它遍历整个调用栈并返回最初发送调用(或事务)的帐户的地址,在智能合约中使用此变量进行身份验证可能会使合约受到类似网络钓鱼的攻击。案例分析contract Phishable { address public owner; constructor () public { owner = msg.sender ; } function () public pa原创 2021-07-16 09:49:23 · 2902 阅读 · 0 评论 -
智能合约审计之后门漏洞概述
文章前言智能合约的概念可以追溯到1994年,由Nick Szabo提出,但直到2008年才出现采用智能合约所需的区块链技术,而最终于2013年,作为以太坊智能合约系统的一部分,智能合约首次出现。智能合约包含了有关交易的所有信息,只有在满足要求后才会执行结果操作,智能合约和传统纸质合约的区别在于智能合约是由计算机生成的,因此,代码本身解释了参与方的相关义务,与此同时,用户可以根据规则开发自己想要的智能合约。而随着智能合约普及,合约的安全问题也引起了众多合约开发者和安全研究人员关注,比较典型的就是随原创 2021-07-16 09:44:54 · 556 阅读 · 0 评论 -
智能合约审计之冻结账户绕过
漏洞概述在一些智能合约中会存在freezen()函数,用于冻结账户,而“冻结账户绕过”该漏洞就触发在“转移代币”时,合约为校验来源账户、发起账户、目标账户是否被冻结而导致的。漏洞实例如下所示,在智能合约转移代币时只校验了发起账户是否处于冻结状态,而未校验目标账户是否处于被冻结状态:该漏洞导致的安全危害是向冻结的账号转账后冻结的账号资产无法转出。防御措施增加对资产接收地址账户的冻结状态的检查,例如:...原创 2021-07-16 09:34:27 · 1043 阅读 · 0 评论 -
智能合约审计之假充值漏洞
漏洞细节以太坊代币交易回执中status字段是0x1(true)还是 0x0(false),取决于交易事务执行过程中是否抛出了异常(比如使用了 require/assert/revert/throw等机制),当用户调用代币合约的transfer函数进行转账时,如果transfer函数正常运行未抛出异常,该交易的 status即是0x1(true)如图代码,某些代币合约的 transfer 函数对转账发起人(msg.sender)的余额检查用的是 if 判断方式,当 balances[msg.s.原创 2021-07-16 09:16:42 · 3247 阅读 · 2 评论 -
智能合约审计之DDOS概述
拒绝服务(DOS)对智能合约进行DOS攻击的方法有很多种,其根本的目的是使合约在一段时间内或者永久无法正常运行,通过拒绝服务攻击,也可以使合约中的ether永远无法提取出来,下面将会列出几种常见的攻击场景:未设定Gas费用的外部调用在这种情况下,您可能希望对未知合同进行外部调用并继续处理事务,而不管该调用是否失败,通常通过call操作码来实现的,如果调用失败,调用操作码不会还原事务(有关更多详细信息和示例)案例分析下面我们考虑一个简单的例子,我们有一个钱包合约,当调用withdraw(.原创 2021-07-16 09:13:31 · 1166 阅读 · 3 评论 -
智能合约审计之条件竞争
文章前言与大多数区块链一样,以太坊节点汇集交易并将其形成块,一旦矿工解决了共识机制(目前Ethereum的ETHASH PoW),这些交易就被认为是有效的,解决该区块的矿工也会选择来自该矿池的哪些交易将包含在该区块中,这通常是由gasPrice交易决定的,在这里有一个潜在的攻击媒介,攻击者可以观察事务池中是否存在可能包含问题解决方案的事务,修改或撤销攻击者的权限或更改合约中的对攻击者不利的状态,然后攻击者可以从这个事务中获取数据,并创建一个更高级别的事务gasPrice并在原始之前将其交易包含在一个区块原创 2021-07-16 09:07:51 · 3159 阅读 · 0 评论 -
智能合约审计之错误使用随机数
文章前言智能合约中可能需要使用随机数,虽然Solidity提供的函数和变量可以访问明显难以预测的值,如block.number和block.timestamp,但是由于它们公开透明而且可预知且容易受到矿工的影响,即这些随机数在一定程度上是可预测的,所以恶意用户通常可以复制它并依靠其不可预知性来攻击该功能,常见的区块参数如下:block.blockhash(uint blockNumber) returns (bytes32):指定区块的区块哈希,仅可用于最新的256个区块且不包括当前区块,而 blo原创 2021-07-16 09:04:19 · 634 阅读 · 0 评论 -
智能合约审计之返回值未检查
文章前言返回值调用验证问题多出现在和转币相关的智能合约中,故又称作静默失败发送或未经检查发送,在Solidity中存在transfer()、send()、call.value()等转币方法,都可以用于向某一地址发送Ether,其区别在于:transfer发送失败时会throw,并且进行状态回滚,只会传递2300gas供调用,防止重入攻击 send发送失败时会返回false,只会传递2300gas供调用,防止重入攻击 call.value发送失败时会返回false,传递所有可用gas进行调用(.原创 2021-07-16 09:01:48 · 2045 阅读 · 0 评论 -
智能合约审计之重入攻击
文章前言以太坊智能合约中的函数通过private、internal、public、external等修饰词来限定合约内函数的作用域(内部调用或外部调用),而我们将要介绍的重入漏洞就存在于合约之间的交互过程,常见的合约之间的交互其实也是很多的,例如:向未知逻辑的合约发送Ether,调用外部合约中的函数等,在以上交互过程看似没有什么问题,但潜在的风险点就是外部合约可以接管控制流从而可以实现对合约中不期望的数据进行修改,迫使其执行一些非预期的操作等。案例分析这里以Ethernaut闯关游戏中的一个重入原创 2021-07-15 22:35:43 · 580 阅读 · 1 评论 -
智能合约审计之整形溢出攻击
溢出原理计算机中整数变量有上下界,如果在算术运算中出现越界,即超出整数类型的最大表示范围,数字便会如表盘上的时针从12到1一般,由一个极大值变为一个极小值或直接归零,此类越界的情形在传统的软件程序中很常见,但是否存在安全隐患取决于程序上下文,部分溢出是良性的(如tcp序号等),甚至是故意引入的(例如用作hash运算等)。以太坊虚拟机(EVM)为整数指定固定大小的数据类型,这意味着一个整型变量只能有一定范围的数字表示,例如:一个uint8只能存储在范围[0,255]的数字,若试图存储256到一个ui.原创 2021-07-15 21:28:25 · 554 阅读 · 1 评论 -
智能合约审计之访问控制
基础知识权限的概念权限是指为了保证职责的有效履行,任职者必须具备的对某事项进行决策的范围和程度。它常常用“具有xxxxxxx的权利”来进行表达,比如:公司的CEO具有否定某项提议的权利。 站在合约的管理角度来讲,智能合约中的用户可以分为合约的owner、合约的普通用户两类。合约的owner是合约的拥有者,他可以执行合约中所有的函数;合约的普通用户可以执行合约中约定范围内的函数,对于一些对权限有校验或对执行者身份有要求的函数(比如:用onlyowner修饰器修饰的函数)是无法执行的。函数可见性原创 2021-07-15 21:25:48 · 3305 阅读 · 1 评论 -
智能合约审计之evilReflex攻击
文章前言在这篇文章中,我们对曾经出现过的一种叫做evilReflex的安全漏洞进行分析研究,攻击者可以通过该漏洞将存在evilReflex漏洞的合约中的任意数量的token转移到任意地址。漏洞分析 漏洞函数approveAndCallcode()代码如下所示:approveAndCallcode函数的用途是在完成approve操作时发出相关的调用通知,而在上述代码的L136处_spender.call(_extraData)中的_extraData为用户可控参数,而在solidity语.原创 2021-06-29 08:35:16 · 625 阅读 · 1 评论 -
智能合约审计之变量覆盖
漏洞简介在智能合约语言Solidity当中,存在Storage(存储器)和Memory(内存)两个不同的概念,Storage变量是指永久存储在区块链中的变量,Memory变量是临时的,这些变量在外部调用结束后会被移除Solidity中struct和数组在局部变量中默认是存放在storage中的,因此可以利用未定义的存储指针的问题,p会被当成一个指针,并默认指向slot[0]和slot[1],因此在进行p.name和p.mappedAddress赋值的时候,实际上会修改变量testA,testB的值:原创 2021-06-29 23:07:56 · 1339 阅读 · 2 评论