第七章 去中心化自治组织(DAO)

6.5 如何保证项目安全

请注意:我要谈的是整个项目的安全,光谈你的代码安全已经远远不够。

  1. 安全保障有多困难?

以一个像比特时代(aex.com)那样的交易所网站为例,它最少的软件构成为:

软件类型

常用可选软件

操作系统

Debian或Ubantu或Centos

Web服务器

Nginx或Apache

数据库服务器

MySQL或PostgreSQL

邮件服务器

Exim或SendMail

FTP服务器

VsFTP

服务器日志文件监控

AWStats或Analog

程序语言支持

PHP

数据库管理

PHPMYADMIN

PHP执行速度优化

Zend Optimizer

安全防护

ASSP或Devil-Linux

各种钱包

Bitcoin core等超过30个钱包软件

网站程序

多个开发小组开发的网站程序

各类型软件的安全漏洞,都可能让你的网站被黑客侵入。

2000年起,信息安全专业进入中国高校。不过如果你去看看他们的课程安排,只有少数几个会让你有安全感。

由于基础制度的影响,国内早期在服务器底层的操作系统上选择了windows而非Linux,这是我们在开源领域严重缺乏参与、缺乏经验传承的一个重要原因。国内开发网站比较少使用开源软件,这其实会导致更大的安全问题。

像Joomla这样的开源建站系统,平均每个月有一次升级。有些升级就是专用于解决安全隐患。另外一些升级则是为了修复涉及功能的bug。按这种频率,基本上比特时代网站每天都有升级工作,而每一次升级之前,都必须对升级包进行全面的备份和安全评估——同时还要做兼容性、稳定性等方面的评估和测试,绝非易事。

以上列出的绝大多数软件都是开源软件,而开源软件有个问题:它们都是全球黑客的重点研究对象,你是一次疏漏都不能出现的,其艰难程度可想而知!

比如最不应该出问题的比特币核心钱包本身也出过几次重大问题,如2010年8月15日,有人通过bitcointalk报告他在比特币区块链的第74638块上发现了匪夷所思的交易,这笔交易竟然涉及184,467,440,737.09551616个比特币,即1844亿多个比特币——这是因为黑客利用核心钱包程序里的大整数溢出漏洞,绕过了系统的平衡检查,成功实现了一次偷袭。

幸运的是,在发现这一异常现象后不到半天的时间,比特币核心开发人员就开发完成了比特币补丁版本,并启动了硬分叉,最终有惊无险地解决了这次比特币历史上最为重大的危机。

2016年5月份刚创造众筹项目世界记录的以太坊上的区块链项目The DAO,6月17日就遭遇了重大事故:一份合约(或者说黑客)利用DAO的代码漏洞,劫持了高达360 多万以太币(事发时的价格折算约合5亿人民币)!这一事件不光震惊了整个区块链业界,全球软件界和金融界都为之震动!

好在按照智能合约的技术设定,child DAO里面的资金28 日之内无法被提走,因此以太坊官方团队迅速启动拯救计划:先是尝试以更新以太币协议即软分叉的形式将所有此期间The DAO相关的交易做无效处理,以追回被劫持的以太币。不幸的是:该软分叉出现严重bug,攻击者可以利用它瘫痪整个以太坊网络。不得已官方马上启动了硬分叉方案。北京时间7月21日下午2点30分左右,以太坊在得到社区多数人的支持后开始执行区块链硬分叉,新区块链开始把The DAO被盗资金返还到初始投资者的账户里。

问题是:硬分叉是采用区块链回滚到事发前的某天,然后重新以一个新分支分叉,这直接导致那以后的实际交易全部无效,很容易想到的一个问题是:一些交易是没法自动还原到交易前的状态的。好比有人拿支付宝在网上买了个手机,现在他和商家支付宝里面的钱都自动恢复到交易前的状态,但是手机已经到了买家的手里,如果买家不退还手机,商家就会蒙受损失!

于是一个更严重的问题爆发了:在受损者、投机者、盗取The DAO的黑客以及不同理念者的共同参与下,社区发生了严重的分裂!一种币分裂出两种币:不接受硬分叉的ETC和接受硬分叉的ETH。

实际上,在黑客和数字货币的较量中,数字货币还从来没有赢过,哪怕一次都没有!黑客简直可以说为所欲为!

  1. 对区块链的主要攻击方法

  2. 51%攻击(51% Attack)、双花攻击(Double-spending)、拒绝服务攻击

如果一些区块链网络参与者(如矿工)掌握了全网的51%算力,或获得大多数“投票”,他们将能够控制共识,并达到以下目的:

  1. 修改自己的交易记录,这可以使他进行双重支付(双花攻击);

  2. 阻止区块确认部分或者全部交易(拒绝服务攻击);

  3. 阻止部分或全部矿工开采到任何有效的区块。

2018年4月4日,匿名加密货币Verge的网络遭受了所谓的“攻击51%”。结果在3小时内,攻击者完全控制了网络以及其内进行的交易。而且它是首次因代码中的错误而不是因为攻击方掌握计算能力或者通过贿赂等手段而发生:其代码中存在一个错误,允许黑客每秒,而不是规定的30秒,向网络添加新区块!

  1. 女巫攻击(Sybil Attack)

大规模的p2p系统面临着有问题的和敌对的节点的威胁,为了应付这种威胁,很多系统采用了冗余。然而,如果一个有恶意的实体模仿了多个身份,他就可以控制系统的很大一部分,破坏了系统的冗余策略。我们把这种模仿多个身份的攻击定义为女巫攻击(Sybil Attack)。对于区块链,攻击者利用单个节点来伪造多个身份存在于P2P网络中,从而达到削弱网络的冗余性,降低网络健壮性,监视或干扰网络正常活动等目的。

  1. 垃圾信息攻击(粉尘攻击)

一则假说是这样的:“Bitcoin现在非常拥挤,超过220,000未确认交易,于是Bitcoin cash可以进行粉尘攻击,加入超级多的超小交易来让Bitcoin更加阻塞更加慢。”

在具体的技术实施上,攻击者可以把1个比特币作为输入,1亿个1聪作为输出(就是通过脚本同时给1亿个地址中的每个地址转账1聪),比特币转账手续费是按每千字节(kilobyte)数多少比特币来收的,如果手续费过低,那么就很容易受到粉尘攻击,造成其它正常交易被阻塞。另外,在网络效率较低时,超多的交易请求也是粉尘攻击。

  1. 重放攻击

传统计算机术语中,重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的数据包,来达到欺骗系统的目的。重放攻击在任何网络通讯过程中都可能发生,是计算机世界黑客常用的攻击方式之一。

在区块链技术中,重放攻击是指“一条链上的交易在另一条链上也往往是合法的”,重放攻击通常出现在区块链硬分叉的时候,因为硬分叉的两条链如果没有经过防范处理,它们的地址和私钥产生的算法相同,交易格式也完全相同,因此导致在其中一条链上的交易在另一条链上也是完全合法的,也就是在其中一条链上发起的交易,可以到另一条链上去重新广播,也会得到交易确认。这就是“重放攻击”。

2016年7月,以太坊The DAO事件造成社区分裂而发生硬分叉。两个以太坊网络(以太坊和Ethereum Classic)都没有提前准备好应对重放攻击,结果一些交易所深受其害。

  1. 可塑性攻击(延展性攻击)

转帐比特币需要用户的签名,而这个签名是通过数学算法生成的。签名的这种数学算法有个特性:它会导致签名被更改后,这个签名可以依然有效,这笔交易依然会被验证通过。

换言之,交易签名具有可塑性,有多种写法。修改交易签名引起交易的哈希值改变,即TXID改变,导致原TXID无法找到,但两个TXID都有效,通过劫持等手段,造成攻击漏洞。

  1. 智能合约的回调攻击

只要一个智能合约在调用外部未知函数之后还修改状态值,就可能遭受到回调攻击。回调该合约的某个函数“抢先”修改本来要修改的状态值,这样就会造成数据混乱。

The DAO的失败,就是源于智能合约的回调攻击。

  1. 日食攻击(Eclipse Attack)

在日食攻击(日蚀攻击)中,攻击者控制所有来自以目标受害者的节点及将要连接目标受害者的节点。这样,攻击者就可以防止受害者获得关于网络其他部分的完整信息。

2018年3月,波士顿大学副教授Sharon Goldberg在一篇题为《对以太坊点对点网络进行的低资源日蚀攻击》披露了在以太坊网络上进行日食攻击的方法。他们发现针对比特币网络节点的“日食攻击”需要数千个恶意节点才能拿下某个受害者的节点,而以太坊网络中,攻击者仅需两个恶意以太坊节点就能隔离并影响另外一个节点。而且“日食攻击”还能通过覆盖被遮蔽节点的区块链视图针对以太坊合约发动攻击,从而延迟该节点对可能为智能合约内部计算所使用的多种参数的视图,导致产生遭攻击者利用的不正确的智能合约内容。

好在早在1月9日他们就已经通过以太坊的的bug bounty program(漏洞奖励计划)提交了他们的发现,并协作了补丁代码的评估工作。

  1. 网络攻击

譬如DDoS攻击(分布式拒绝服务,Distributed Denial of Service)。

  1. 欺诈

通过伪造分发糖果等欺诈手段,获得用户的私钥

  1. 黑客侵入

很尴尬的现实是:在软硬件领域,黑客是真正的专家!所以代码bug,可能才是给我们造成最大损失的主因。

  1. 区块链未来会否有自己的解决方案?

以上问题都非区块链本身的问题。不是说区块链技术本身经常出现漏洞。恰恰相反,正是因为区块链技术固若金汤,它才突然火起来的!

但因为公开、透明等等都是区块链的特性,所以区块链需要一个应对黑客破坏的解决方案!否则一旦被黑客乘隙而入,后果就不堪设想。

从目前情况来看,通过智能合约标准的发展,特别是去中心化自治的身份管理协议等等,应该慢慢会找到靠谱的方法。就区块链的价值、现状以及未来的发展前景来说,在这个领域还有很多工作值得大家去探索。

剩下的便只能说,开放源代码要写严谨,要重视平台的安保工作!

  1. 项目开源更安全还是更危险?

2018年2月23日,有人使用工具对以太坊上面的近100万份智能合同分析,发现其中34,200份(大约3.4%)是易受攻击的。研究报告【Finding The Greedy, Prodigal, and Suicidal Contracts at Scale】)更惊悚地指出,目前在以太坊中,有89%的智能合约代码都或多或少存在安全漏洞或安全隐患!

那么开源更安全吗?

这是一个比较难回答的问题。因为我们缺乏这方面的详尽的统计数据。

说项目开源更安全,一大原因是开发团队明白开源后的巨大风险,在写代码和做测试时,更重视代码中是否有安全bug。这有点像飞机如果出现动力故障,那会死很多中上层人士,并且上了天就必死无疑,而汽车则完全没那么严重,所以我们相信飞机的动力故障一定比汽车的动力故障少。另一大原因是开源后,你会获得很多的用户和参与在项目里的程序员,人多眼杂,安全bug难逃他们的法眼(Given enough eyeballs, all bugs are shallow),这样你能在很短的时间内得到反馈。

尽管更多的人认为非开源软件的安全漏洞更多,但因为开源软件的代码是公开的,相比非开源软件,黑客更容易乘虚而入。而且,譬如一旦黑客找到Joomla某个最新版本的安全漏洞,他往往能黑掉一批网站!并且还名利双收!所以更大的问题是:黑客更乐意花大量的时间精力研究开源软件。一旦你的区块链项目成为一个承载很多项目的系统,围攻的黑客可就乌泱乌泱的了!

  1. 建立多重安全保护机制

激励式开源协作

开源内容管理系统Joomla官方除拥有自己的Joomla Bug小组(Joomla! Bug Squad)外,还有作为oCert(开源软件及系统紧急反应小组)之分支小组的Joomla安全小组(Joomla! Security Strike Team),以及Joomla功能扩展漏洞监控小组(The Joomla! ® Vulnerable Extensions List)。另外,应急事件追踪小组(Issue Tracker Team)和众多的用户交流小组(User Group)也可以起到一定的信息传递作用。

如果你需要最高级别的保护,你应该深入到每种软件领域之内。我在2.5.1里列出的交易所网站所需十多种软件里,每一个领域都有它自己的安全小组。你可以与它们保持密切的合作!而如果你的人力有限,那么Joomla安全小组(Joomla! Security Strike Team)就是一个典型的精简模式——oCert(Open Source Computer Security Incident Response Team)是一个开源软件及系统紧急事件反应小组。

这样通过各公司网站服务器的专业管理员、全球程序员、全球用户、自身的多种安保小组以及跨领域的专业安保小组的监测和反馈,能够确保Joomla对安全问题具有非常快速的反应,确保Joomla能够及时监测和修复其安全Bug隐患,确保Joomla网站所遭遇的安全问题能够得到最快速、最专业和最彻底的处理。

黑客分布于软件的各个层次,潜伏于白天与黑夜,并且也有自己的社区与专业化团队,如果缺乏多重安全小组,你如何赢得胜算?

见招拆招不是高手的做法,在一个技术仍然在快速发展的阶段,要懂得如何充分利用开源社区的力量。

严格的区块链开发的安全管理

  1. 安全培训

  2. 开源激励式协作

  3. 理论攻击

  4. 内部攻击测试

  5. 部署测试网络

  6. 公测

  7. 应急预案

  8. 用户教育