前言
在DApp市场高速发展下,黑客成为威胁生态良好发展的主要阻碍因素,经历大规模被盗的DApp大多难逃死亡的厄运。安全问题已经变得愈加重要。
区块链安全包含链上和链下,我们这次只讲链上部分,后续有机会我会分享链下部分。
链上安全的四大部分可以分为:公链安全、DApp安全、钱包安全和交易所安全。
公链安全
目前主流的公链主要包括BTC、ETH和EOS:
- BTC(比特币)
上线时间:2008-10-31
官方网站:https://bitcoin.org/
开源地方:https://github.com/bitcoin
- ETH(以太坊)
上线时间:2015-10-16
官方网站:https://www.ethereum.org
开源地址:https://github.com/ethereum
- EOS(柚子)
上线时间:2018-06-01
官方网站:https://eos.io
开源地址:https://github.com/eosio
目前公链数量已经越来越多,那么如何判断一条链是否靠谱?靠谱的前提主要为以下三个:
- 链:稳定运行
- 官方钱包:安全可靠
- 区块浏览器:稳定可用
其中链是否能够稳定运行可以从以下几个因素来看:共识机制、节点配置安全、节点RPC接口安全。
共识机制的构成
共识机制是很多人都有所了解的,主要包括POW(Proof of Work) 工作量证明、POS(Proof of Stake)权益证明和DPOS(Delegated Proof of Stake)委托权益证明。这三种共识机制各有优劣:
1、 POW(Proof of Work)工作量证明
优点:
(1)算法简单,容易实现
(2)节点间无需交换额外的信息即可达成共识
(3)破坏系统需要投入极大的成本
缺点:
(1)运行大量算力挖矿需要消耗大量电能,每年电费大概在50亿美元
(2)由于专业矿机公司的出现,算力过于集中,导致了趋于中心化
(3)区块的确认时间(交易速度)难以缩短
(4)容易产生分叉
2、POS(Proof of Stake)权益证明
优点:
(1)缩短了区块之间共识达成的时间
(2)减少了能耗
缺点:
持币多的将垄断记账权
目前用POS机制共识算法的币有:OMG(嫩模币)、BTS(比特股)、DASH(达世币)、XLM(恒星币)等。
3、DPOS(Delegated Proof of Stake)委托权益证明
优点:缩小了参与验证和记账节点的数量,可以达到秒级的共识验证
缺点:整个共识机制需要大量的代币,但是大多数商业应用是不需要代币的
目前用DPoS机制共识算法的币有:EOS(柚子币)等
怎么衡量什么样的共识机制才是最好的?很多人都听过区块链领域的不可能三角。高效、安全和去中心化很难同时得到满足。
高效:每秒处理的交易笔数
安全:不可篡改,保证数据安全和一致性
去中心化:共识机制的一种实现方式,无须依赖某个机构来进行记账。
因此,单纯地去追求这三点同时满足是没有意义的。我们要根据使用场景做取舍。显然,符合场景的共识机制才是最好的。
节点配置安全
除了共识机制,节点配置安全在衡量公链的好坏中也至关重要。相比共识机制,节点配置可能很多人都没有了解过。
下面我们看三个节点配置的例子:
BTC节点配置安全
RSK节点配置安全
看过了技术文档,那么什么样的节点配置才是安全的?满足以下三个条件可以认为是基本安全的:
一、有权限认证机制:默认不允许攻击者调用
二、有接口白名单:敏感高危接口只能本地调用
三、有接口请求日志:日志定位问题和溯源
接口安全
最后一点要看节点RPC接口安全,它包含 3 个方面:接口设计安全、接口权限设计安全、接口默认配置安全。
让我们看一个失败的接口设计:
- RPC接口可以直接读取任意目录文件,攻击者读取Linux服务器/etc/password
- RPC接口可以直接读取私钥,攻击者远程获取全节点钱包私钥
- RPC接口调用频率未受限制,攻击者发起大量无效请求导致节点服务器异常
以上三点是在接口设计时一定要避免的。同时要注意接口权限的设计。
下图是一个高危接口暴露的例子:
接口默认配置安全则包含:默认用户名,密码;默认开启管理后台;默认一切你都知道并开启。大多数被黑的案例中都存在因为默认配置导致被黑。
官方钱包
钱包中首要要保证的是交易安全。交易安全中有两种主流的攻击手段需要防备:
- 双花攻击
双花攻击是同一笔UTXO在不同交易中的花费,双花不会产生新的货币,只能把自己花出去的钱重新拿回来。
- 51%攻击
攻击者占有超过全网50%的算力,所以他可以创造一条高度大于原来链的新链。那么旧链中的交易会被回滚。攻击者可以发送一笔新的交易到新链上。
私钥安全
配置安全:
区块浏览器主要承载了数据展示和查询交易的功能。
在Web端的安全风险主要在于:网站被劫持、特定地址查询返回特定数据、伪造交易成功数据展示。
公链的安全在任意一个点都有可能导致巨大的损失,轻则对个人和组织造成经济损失,重则导致链的分叉,而分叉又将导致社区的分歧和不稳定。
每一条公链都可以看作一个在不断进化的细胞,在进化的同时也会吸收其他链最新进化的功能并复制到自身,所以链与链之间的竞争也可以互相促进并减少试错时间,最终找到区块链技术的最佳实践。
一次完整的交易过程
- 无论是以太坊的客户端还是比特币的钱包都是在组装原始的交易数据
- 原始的交易必须经过签名才能证明交易者对货币的实际控制权
- 经过签名的交易经过P2P广播到相关节点(如矿机和其他确认节点)
- 矿机采集相关交易,然后将交易通过共识算法衔接到上一个区块上
- 矿机挖到矿之后,将结果进行广播,其他节点验证并写到本地服务中
DApp安全
DApp是Decentralized Application的缩写,去中心化应用,核心逻辑或者数据放在区块链上的应用。
以太坊智能合约
以太坊智能合约的出现给DApp提供了运行的基础。以太坊基于Solidity语言开发。
优点:
- 开发工具完善
- 开发人员众多
- 生态丰富
- 用户基数大
缺点:
- 容易拥堵
- 交易成本高
以太坊的DApp是目前发展最久的,超过1000个DApp。以太坊DApp的安全问题主要包括以下几个类型:
溢出
条件竞争
权限控制
假充值
EOS智能合约
EOS基于EOS网络,C++语言开发。
优点
- 速度快
- 无交易费用
缺点
- 安全问题多
- 开户成本高
- 开发工具不够完善
EOS DApp目前增长速度很快,数量超过了100个。EOS DApp安全问题主要包括以下几种类型:
溢出
问题本质
编译后字节码
最终原因
官方修复
恶意占用RAM也是目前EOS DApp中存在的一个问题:
Require_recipient来订阅转账通知
合约账号实现字节的transfer方法
恶意消耗账号from的RAM资源
在例子中komo::transfer故意用账户from的授权写了很多无用的记录到stabe db,而这个操作用户在授权eosio::transfer时是不知情的。
权限校验
EOS假币
为什么智能合约会出现问题?可能的原因如下:
一、参考了不安全的合约
二、开发者自身专业技能不够熟练
三、官方存在未知安全问题导致
四、没有做专业的安全审计
EOS DApp被攻击案例
例子一:
例子二:
被攻击合约存在的共性在于:假币、随机数可预测、业务逻辑绕过。
DApp如何保证安全
事前保证安全的主要手段是风控。风控则主要包括以下几点:
- 开发设计层风控:设计时候考虑到极端情况和异常处理
- 交易风控:控制每一笔转出最大最小金额
- 一切用户输入都是不可信的:让用户选择
一旦出现安全问题,则要尽快采取应急措施:
- 快速止损:突发异常交易立即转走余额
- 定位问题:配合攻击者请求日志分析合约代码(合约账号攻击,代码被重置)
- 修复方案:问题复现和审计,防止引入新的BUG
长期来看,提升合约开发团队自身的专业技能是保证安全的最重要手段。除此之外,找专业的安全审计团队审计合约也是一个不错的选择。
对区块链游戏感兴趣,欢迎持续关注JBB.ONE