【04】区块链安全技术

4-1 智能合约安全

区块链安全概述

区块链典型应用架构

存储层存储应用产生的数据文件

协议层构建分布式、去信任的共识网络

  • P2P构建对等通信网络
  • 非对称密码机制提供安全保证
  • 基于共识机制维持区块有序运行

扩展层为区块链应用提供支撑平台

  • 智能合约实现复杂业务流程自动化
  • 奖励、惩罚机制规范节点行为

应用层为各行业应用落地提供完整生态

区块链技术应用架构安全风险应对分析

区块链安全突出问题

智能合约往往与交易资金相关,黑客利益驱使会深入研究智能合约漏洞,一旦找到漏洞便立刻发起攻击,让很多项目方和参与者损失惨重

虚拟机运行机制本身的一些缺陷

区块链本身的很多特性给智能合约带来安全风险

区块链Solidity智能合约安全技术

变量覆盖问题

变量覆盖漏洞是一个典型的由高级语言设计缺陷所导致的安全漏洞,其影响特定版本的solidity编写的智能合约

出现问题原因

在受影响版本的solidity语言编写的智能合约函数中,其默认声明的数组或者结构体变量会被编译器误用为storage类型的变量。对这些变量的操作将导致对智能合约storage存储区的非法覆盖

恶意的攻击者更是可以利用这个漏洞来构造恶意的攻击载荷,将特定的变量覆盖为指定的值,从而实现管理员篡改,增加攻击账户余额等攻击

如何解决

函数中声明结构体时,需要加上关键字memory

尽量使用最新版本编译

机制

函数中其默认声明的数组或结构体变量会被编译器误用为storage类型的变量

案例 

 Open Address Lottery(合约代码)使用未初始化的存储变量覆盖漏洞从一些可能的受害者那收取ether

整数溢出问题

智能合约中的整数溢出问题,主要是因为用户没有对运算结果进行安全地溢出检察而造成的,可以分为上溢出和下溢出

无限循环

非预期的整数溢出将导致智能合约被攻击者利用于绕过检察、篡改余额等重要数据

案例
Beauty Chain 漏洞

乘法运算溢出,产生了非预期amount数值,并且外界可以通过调用receivers和_value的数值进行操控

代码为确保当前用户拥有的代币余额大于等于转账的总币数才进行后续转账操作。因为通过调大单地址转账数额_value的数值,amount溢出后可以为一个很小的数字或者0,很容易绕过balances[msg.sender] >= amount的检查代码。从而产生巨大_value数额的恶意转账

SafeMath库

SafeMath库使用

建议:任何使用都不要在代码中直接使用数学运算+、-、*、/,而使用SafeMath减少不必要的错误

未校验返回值

某些低级函数/全局函数会产生返回值作为执行结果,如果没有对其返回值进行判断,则容易出现逻辑错误

拒绝服务DoS攻击

用户所需要的正常服务请求无法被系统处理的行为被称为DoS攻击(Denial of  Service)。区块链DoS漏洞可简单理解为:不可恢复的恶意操作或者可控制的无限资源消耗行为

拒绝服务攻击场景
在外部操纵映射或数组循环

映射或数组循环在外部能被其他人操纵,由于映射或数组循环的长度没有被限制,从而导致大量消耗Gas,最后使得智能合约暂时或永久不可操作。

所有者操作

智能合约通常有一个所有者账户,其拥有开启/暂停交易的权限。如果所有者账户地址丢失,从而使得整个合约无法被操作,导致非主观的拒绝服务攻击

基于外部调用的进展状态

若智能合约改变依赖于外部函数执行的结果,但又未对执行一直失败的情况做出防护,此时如果外部调用失败就可能会造成拒绝服务攻击。

历史案例
KotET事件

2016年2月6日至8日,游戏KotET遭受到了拒绝服务攻击,导致部分角色的补偿和未接收款项无法退回玩家的钱包中。

GovernMental合约攻击

2016年6月GovernMental合约遭受到了拒绝服务攻击,当时1100个以太币通过使用250万个gas交易而获得,这笔交易超出了合约能负荷的gas上线,从而导致交易暂停

影子状态变量问题

在复杂的智能合约中,多个有关联的作用域中的相同命名变量极易引起合约编写、阅读和理解的逻辑问题,从而引发合约影子状态变量漏洞。

继承变量

Solidity允许继承时对状态变量进行歧义命名。在更复杂的合约系统中,这种情况可能不会引起注意,并随后导致安全问题

合约内变量

当在合约函数层级存在多个定义时,影子状态变量也可能在单个合约内发生。这种情况可能不会引起注意,并随后导致安全问题

案例

整改方案

影子变量问题属于未正确遵循编码规范,有两种方法避免该安全漏洞

鉴权暴露问题

访问控制缺陷是开发者在编写智能合约时对某个判断不严谨或者笔误导致的

函数默认权限使用不当

Solidity语言,若没有权限修饰符修饰函数,默认是所有人能看到

谨慎使用析构函数

Solidity语言内置析构函数,若没有严谨修饰,会导致任意调用,产生不可预测的结果

案例分析

韩国区块链项目ICON智能合约(ICX),在2018年6月被暴露安全漏洞将使Transfer功能失效,导致转账、交易等重要功能无法正常使用

其他安全问题

合约千千万,漏洞千千万,无法穷尽。需要培养安全意识,在新合约开发中快速发现漏洞,纠正不规范代码才是最重要的。

浮点数精度

Solidity语言只有整数除法,整数除法会损失精度,小于除数的精度都会被舍弃。

谨慎使用构造函数

Solidity版本0.4.22之前,构造函数是一个和合约同名的函数。若合约名改变但构造函数名没有变化,原来的构造函数就会变成常规的可以调用的函数,这就会导致合约漏洞

4-2 虚拟机及区块链体系安全

重入Reentrancy问题

重入漏洞是指合约在本该属于原子性事务的“修改Storage变量并转账”的操作中,采用了先转账再修改Storage变量的顺序。如果转账的目的是一个带有恶意fallback函数的合约,则可能会被恶意合约对受害合约发起递归调用,从而破坏操作的原子性,绕过检查以重复获得转账收益

分析

攻击者调用Attack合约中的hack函数发起攻击,步骤如下:

  • 攻击者通过hack函数发起攻击,调用ERCToken合约中的withdraw函数进行转账;
  • withdraw函数检查是否符合转账条件
  • 符合条件,调用call函数与合约进行交互,执行转账功能
  • call函数执行后,调用Attack合约的回调函数fallback
  • 通过fallback函数调用withdraw函数,因为没有“生效”,即credit[msg.sender]一直没有变,所以每次调用withdraw函数进行检查时,都返回True,于是可以循环调用withdraw函数
  • 直到Gas耗尽,最终重复多次获取转账收益,甚至会盗取大笔资金,构成重入攻击。

案例分析
众筹项目TheDAO
事件

2016年6月17日,TheDAO项目遭到了重入攻击,导致300多万个以太币被从TheDAO资产池中分离出来,而攻击者利用TheDAO智能合约中的splitDAO()函数重复利用自己的DAO资产进行重入攻击,不断地从TheDAO项目的资产池中将DAO资产分离出来并转移到自己的账户中,最终导致了以太坊经典(ETC)的硬分叉

攻击手段

黑客先创建一个合约HackDao,这个合约拥有一个回调函数。

黑客提交了splitDao,地址是HackDao的地址。在函数withdrawRewardFor中把金额退还给了用户,然后退出函数之后将函数余额置为0。

黑客利用了call函数的机制,在合约中再次调用转账申请,由于上一次转账申请的余额还没有更新,所以第二次也会成功。相当于在循环中的重复调用自己,编程中的递归

代码注入问题

由call系列函数引起的外部合约注入,即外部合约A调用B合约中的私有、具有权限限制的函数。

案例分析

短地址攻击问题

模拟

其他安全问题

合约虚拟机运行在区块链各个节点之上,相比传统计算机运行环境具有更多的攻击安全隐患

逃逸漏洞

虚拟机在运行中,一般进程只能在沙盒的限制中执行相应的代码,逃逸漏洞指的是进程越过虚拟机范围,进入到宿主机的操作系统中,这种漏洞会使攻击者退出沙盒环境,执行其他本地不能执行的代码。

堆栈溢出漏洞

虚拟机的调用栈有确定的最大深度,在一些攻击者的恶意调用下,有可能导致栈的深度超过虚拟机允许的最大深度,或不断占用系统内存导致内存溢出漏洞

资源滥用漏洞

攻击者在虚拟机中执行恶意代码,故意消耗系统的网络资源、存储资源、计算资源、内存资源。在虚拟机系统中必须要有一些限制机制来防止系统的资源被滥用漏洞

时间戳依赖

合约中取得的时间戳是由运行其代码的节点(矿工)的计算机本地时间决定的。理论上本地时间是可以由矿工控制的。如果在智能合约中不正确地使用区块时间戳可能导致合约执行结果有差别。

条件竞争

智能合约中仅通过交易顺序来作为决策条件的程序逻辑所引起的漏洞,智能合约的调用是通过发起交易进行的,然而交易的发起时间和交易被确认从而使合约调用生效的时间并不具有严格相关性。

随机性不足

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

其他安全问题

尽管区块链的防篡改、分布式存储、用户匿名等技术优势为其发展应用提供了大量的创新空间,区块链本身仍存在一些内在安全风险,去中心化、自组织的颠覆性本质也可能在技术应用过程中引发一些不容忽视的安全问题。

日蚀攻击

面向对等(P2P)网络的一种攻击类型,攻击者通过攻击手段使得受害者不能从网络中的其他部分接收正确的信息,而只能接收由攻击者操纵的信息,从而控制特定节点对信息的访问。

双花攻击

51%攻击(双花攻击),因某矿工或者矿池将一个加密货币多次支付而得名。通常,其目的并不仅是为了重复使用加密货币,而是为了攻击某个区块链网络,破坏它安全性,让它失去人们的信任。

女巫攻击

利用P2P网络的分布式特性,将一个节点伪装成多个节点,并将这多个伪装节点(也叫做Sybil节点)广播到整个P2P网络中,从而做一些干扰区块链正常秩序的活动,比如获得网络控制权。

长程攻击

就是攻击者创建了一条从创世区块开始的长区块链分支,并试图替换掉当前的合法主链。该分支上可能存在有和主链不同的交易和区块

Nothing-at-Stake

在PoS共识系统出现分叉(fork)的情况时,出块节点可以在“不受任何损失”的前提下,同时为多条链出块,从而有可能获得“所有收益”

蚂蚁链智能合约安全审计服务介绍

产品架构与核心优势
产品定位

为蚂蚁链智能合约提供自动化的安全漏洞扫描、业务逻辑验证和隐私规范检查

场景覆盖

为蚂蚁链落地的50+场景提供智能合约安全扫描服务,达到金融级的准确度与覆盖度

安全即服务

依托检测平台及强大的云计算能力,给到直观、快速、高效、易用的使用体验

检测平台提供全方位检测报告,精确的安全链路追踪及安全修复建议

通过集成BaaS/IDE安全插件,持续化集成,提供安全能力同时不影响研发效能

引擎能力

多方位:覆盖已知/未知漏洞、逻辑正确性、隐私规范检查

多角度:结合静态分析、模糊测试、形式化验证多角度技术

安全检测能力

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FrancyZhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值