查看原文
其他

区块链技术重大挑战(一):“堵不住”的漏洞

2017-07-18 老董 老董区块链干货铺

这周老董实在没有一整天的时间可以抽出来做一个完整的视频教程,所以第三课就完全以图片+文字来呈现。另外由于不想让文章太长,而且恰好技术挑战之间相对独立,不特别需要“一气呵成”的连贯性,所以老董准备将技术挑战分在一周内连载。


另外干货铺最近想计划做一整套区块链智能合约编程的比较规范的线上课程,手把手,教大家如何精通Solidity和一些区块链的设计模式。老董觉得,不论短期的区块链价格波动如何,学习如何做区块链开发,就如同1999年当年学会做网站一样重要。


但在做之前,老董想看看有多少人感兴趣。所以感兴趣的同学,请私信本公众号或在这篇文章下留言,欢迎跟老董说自己想听到的内容,或者建议,谢谢大家!如果有足够的同学有兴趣,下周老董会公布整个课程的大纲。


听了头两节课,很多朋友都会觉得:我去,区块链太牛了,赶紧各种投资。但今天老董主要想唱唱反调,揭开隐藏在区块链狂热的表象下的一些重大技术挑战。老董认为这些技术挑战正是区块链投资者者所最需要注意的“投资系统性风险”。


所谓系统性风险,就是说大部分区块链技术平台和应用所共同面临的价值风险。换句话讲,不论是区块链货币,智能合约平台,乃至在他们之上衍生的应用,他们的价值都会受这些风险所影响。系统性风险的发生或彻底解决,都会对整个市场有着巨大而深远的印象。老董在这里不讨论各种微观层面的价格波动(操纵)和投机(比如最近的所谓“寒冬”)。虽然老董在投机方面有很多的教训可以分享,但老董觉得,掌握一些更本质的东西,对一个眼光长远的投资人来说,更为重要和有意义一些。


上干货。


今天我们讲的是,区块链智能合约程序安全性与漏洞的特殊性与高危性


乍一听,安全和程序漏洞(bug)这个概念貌似很泛泛,可以说哪里有程序哪里就会有安全问题和漏洞,老董难道开始给干货注水?显然没有!老董必须要强调的是,区块链,尤其是在其上部署的智能合约,对于程序安全和漏洞的苛刻要求是让人无法想象的。老董认为,这是短期内区块链以及智能合约系统所面临的最大风险。


为什么?


要讲明白安全对于区块链智能合约为什么这么重要,就要理解一个链下程序和链上程序的关键不同之处:谁在控制程序的部署与升级。对于链下程序(从微信,facebook, office之类的常规应用,到Windows, Linux等操作系统),当一个威胁程序安全的漏洞被发现的时候,程序的升级是可以迅速地甚至是在用户完全不需要干预的情况下进行的(想想windows的各种自动更新,想想你手机上微信过段时间就会自动重新安装,升级)。之所以链下程序可以做到这一点,是因为程序开发者完全控制了程序版本的升级和分发。记得前一段时间的Linux SSL漏洞,各大Linux分发商第一时间出了补丁,随后全球的系统迅速升级在短时间大范围地修补了这个问题。


然而区块链智能合约和普通的链下程序完全不同,一旦被部署,程序发布者立刻对这个程序的核心逻辑失去了控制。这也正是我们之前多次讲到的区块链核心价值:所有互不信任的人都信任这个大家共同维护的,一旦部署就不可变更的区块链程序。区块链“原教旨”主义者更是有“code-is-law” (代码即是最高规则)的说法。由于区块链智能合约具有这样的“一旦部署不可变更”的特性,一旦有程序漏洞或者安全性问题,只能眼巴巴的看着程序被黑,钱被强。你没有办法简单的说:我们升级打补丁就好了。智能合约就像一个深空探测火箭,一旦发射就不受任何人控制。即是火箭发射10秒之后你发现一个小数点算错,你只能眼睁睁的看着火箭爆炸成一个绚烂的礼花弹。我请大家花10秒体会一下这种绝望的感觉。




有人会说:那这个很简单啊,只要给当初部署区块链程序的人紧急暂停区块链程序的能力就好啦。但这个不行啊同志,这样的话,智能合约的可信任性会被大大削弱,因为实际上智能合约的命运还是掌握在那个程序的部署者手中的,与整个区块链的核心价值背道而驰。


老董是不是在危言耸听?


很多刚入坑的朋友可能并不是很了解去年发生的一个程序漏洞事件:DAO Attack(http://www.coindesk.com/understanding-dao-hack-journalists/)。 给大家迅速回顾一下。DAO(Distributed Autonomous Organization,中文译分布式自制组织)是什么呢?具象的来说,就是你开个公司,股东们投钱到这个公司里面,但是呢,你们把整个公司的预算决算表决过程,乃至整个公司的办事章程,区块化为了区块链智能合约,整个公司的运行,由所有的股东来通过智能合约投票表决(票数多少和投资额度成正比)。这个是DAO的整体概念,那么这个DAO最直接的应用是什么呢:众筹风投。简单来说,就是大家集中投资到一个池子(the DAO)里面,每人获得了相应的投票权。



这之后呢,希望获得这家众筹风投投资的初创公司,就来给公司的“股东”公布自己的商业计划和期望融资额度和股份出让意愿,然后每一个投资DAO的股东开始投票,最终决定是否共同投资这个初创公司。


按理来说,这个“投票决定接受不接受融资请求”的逻辑确实是挺简单的,感觉搞个程序实现实现不是什么难事。很多人也是这么想的,而且觉得这事儿靠谱啊,群策群力搞风投,棒棒哒,于是在短时间内,众筹额度达到了1.5亿美元(如果按照今天的ETH价格算,大概是13亿美元)。老董也是当时的众多投资者之一,主要是因为DAO提供了短期稳定价值货币,同时有比较稳定的upside。


之后一天半夜,我刚刚睡着,手机突然发了狂,不停的震动一堆邮件。一看,原来是我写的交易所数据监控程序挂了,自己写的邮件通知系统在疯狂报警。


心说怪了,这程序已经跑了六个多月了稳定运行,而且一般的错误都能自己恢复过来,这到底是怎么了。心想算了,估计交易所系统维护掉线了,明天再说吧,就把手机关了机。


Z

Z

z

z

z

z

.

.

.

.

.

.

.

.

.

.



第二天,老董睡眼惺忪的起床刷牙,边刷手机想看一眼交易所昨晚怎么回事儿。于是看到了下图的优美价格直线,老董吓得把牙膏都咽了。



一夜之间 价格砍半。




老董确认了自己不是在做梦之后,迅速刷起了新闻,得知了晴天霹雳:众筹风投 the DAO合约代码被发现漏洞,价值6000万美元的ETH被盗,而且盗窃还在不断进行当中。


昨天我的数据监控系统宕机正是因为the DAO被黑之后,最先知道消息的投资者全部恐慌性出逃,导致当时不成熟的交易所交易系统彻底被挤爆。我本来可以躲过一劫,但居然就这么被我睡过去了。



相信我,任何粗口都无法表达我当时崩溃的内心,对自己,以及对被黑的DAO。


各大论坛上也是彻底炸了锅。但同时一个非常具有魔幻现实主义的的场景出现了:所有人都在齐声咒骂着攻击DAO的黑客,但所有人都只能眼巴巴的看着,眼巴巴的看着啊朋友们!大家呆呆地站在原地,看着盗贼一卡车一卡车的把自己的钱烧成灰烬。因为智能合约一旦部署,无法修改,DAO is code, code is law。甚至从这个角度来说,盗贼“并没有犯错”,只是执行了智能合约中的某种隐藏的逻辑(漏洞)。



最为搞笑的是,这个贼偷到一半,居然特么停手了!留了一多半的钱在众筹风投里面,让众多投资者在风中凌乱。


所有人都懵逼了,大家不约而同的都在想:这接下去怎么搞???难道就这么被抢了?


关键是,现在这劫匪是自己决定停下来抢劫的脚步啊,随时都可以再次出发!而且因为所有的transaction都是公开的,任何对EVM工作机制有深度理解的人,都可以通过分析这次抢劫工作的方式,一秒变劫匪好么!整个Ethereum系统可以说是面领着前所未有的重大危机。


万幸的一点是,盗贼利用的漏洞是在DAO分割(split)的代码当中,而分割出去的子DAO需要等28天才能将里面的钱取出来,这给大家带来了一点缓冲的时间和希望。


那么当务之急,就是止血:断绝劫匪继续取钱的能力,以及最终将钱取走的能力。为此大家提出了在ETH上进行“软分叉”。所谓软分叉的意思是,不改变任何已经发生的转账和程序执行历史,也不改变整个protocol,但对未来的交易和程序执行作出针对性限制,简单来说就是,希望所有人都能共同抵制对DAO的任何改变(包括黑客的取钱行为)。将未来所有对DAO的操作,暂时放入黑名单,冰封整个DAO的智能合约。“软分叉”也是“分叉”,从严格意义上来讲,也是对区块链信任程度的一个损坏,因为你可以认为软分叉在挽救DAO,但同样可以认为,软分叉是在“和谐”关于DAO的所有操作,这也是严重有悖于区块链无人控制+无人和谐的核心价值的。


但两害相权取其轻,大家普遍同意了进行软分叉。然而天有不测,在软分叉就要开始的前几个小时,有人发现了软分叉本身是有重大漏洞的。一旦软分叉发生,攻击者可以利用这个漏洞使得整个区块链充满垃圾transaction,导致整个区块链停摆。



唯一的希望之火破灭了,ETH价格再次大跌。


那么留给大家的只有一个选择:硬分叉。什么是硬分叉呢?简单的来说就是“耍赖”。大家一起,暴力地将已经发生的抢劫有关的所有转账记录全部抹掉,以及整个DAO的智能合约全部重写成一个简单的取款机,然后大家各自取款,回家找妈妈。


听起来喜大普奔?


并没有,非常没有,特别没有!


大家想想这什么意思:简单来说,这就是说,区块链上的信息是可以更改的,区块链的共识其实是不稳定的,随时可以被抹掉的。


因为这和区块链所提供的核心价值是背道而驰的。

因为这和区块链所提供的核心价值是背道而驰的。

因为这和区块链所提供的核心价值是背道而驰的。


不带这么玩儿的啊!当初不是这么保证我们的好么!


从价值观上来讲,这事儿确实是不能干的,因为对整个Ethereum的信用程度确实有很大损害,但是如果不硬分叉,强盗薅了那么多的羊毛,对整个Ethereum系统的信心(虽然这完全赖DAO自己)也会大打折扣。


前有饿狼,后有猛虎,怎么搞?


社区展开了长时间的辩论,期间各种drama不表。


最后ETH内部分裂,变成了两种货币,坚持原教旨主义的ETC和进行了硬分叉,重置了整个DAO attack的ETH。整个Ethereum市场和信心也陷入了漫长的寒冬。


老董是基本支持ETH的,不光是因为一己私利。我认为,任何早期技术,都应该给予犯错和改正的机会。ETH当时还处在幼年,虽然硬分叉绝对不是一件好事,但两害相权取其轻,还是可以干的。但老董也知道,only time and market will tell。


讲了这样一个小漏洞引发的巨大惨案,想必大家已经了解了在智能合约系统下,安全性的挑战和其他链下系统的不同之处。而且也意识到了这个风险的系统性。


老董自己写了非常多的程序,老董明白程序漏洞是永远无法避免的。但大家想想,the DAO这么一个简单的逻辑,都会出问题,那么之后更多花哨的,复杂的区块链应用会不会出问题呢?老董觉得,这根本不是一个会不会的问题,问题100%会出。无非就是,什么时候出问题,以及出多大的问题而已。


那么这么巨大的系统性风险,如果没有可能的解决方法,区块链投资还搞什么?搞搞投机好了?


不不不,老董相信,没有过不去的火焰山,尤其当ETH开着一辆用金子坐的车的时候。


怎么解决?请关注老董明天的干货:


程序形式验证:保证区块链程序安全的曙光。




作者简介:

老董(BS'12, PhD' 17),UIUC计算机科学系博士,主要研究领域:高速低延迟广域网数据传输系统,网络安全与形式验证,博弈论,企业软件定义数据中心架构,分布式系统。


博士期间作为创始成员加入网络安全初创公司Veriflow,现担任核心算法与系统架构技术团队负责人,同时兼任大客户管理和一部分市场运营的工作。


在业余时间,老董是区块链技术爱好者,区块链技术全栈工程师。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存