内容简介:1. 区块链底层的密码学算法中挺多坑,使用不当会引入非常多的安全问题。
要点速览:
1. 区块链底层的密码学算法中挺多坑,使用不当会引入非常多的安全问题。
2. 未来一年里还会出现各种花式的共识协议安全漏洞。
3. 尽管智能合约代码就那么点,几十行到几百行,但是漏洞百出。
4. 即使密码学算法本身很安全,但是开发者没有用正确姿势调用算法,也会直接让安全性崩塌。
5.以太坊智能合约语言 Solidity 里面有很多坑,开发者一定要小心。
6.如果一个不熟练的新手写合约,几乎100%掉到各种坑里面。
7.研究的越多,越觉得到处都是坑。
9月9日20:00,安比(SECBIT)实验室创始人郭宇做客「火星财经创始学习群」,分享了自己对区块链安全的研究和思考。在加入区块链安全事业之前,郭宇一直扎根学术界,是国内领先的形式化验证学者。
他表示,区块链安全包含密码学安全、私钥安全、共识协议安全、智能合约安全。这些虽然不是很新的问题,都当它们在去中心化系统中搅在一起时,会让“区块链安全”这个问题变得复杂无比。
随着对区块链安全研究的深入,他坦言研究的越多,越觉得到处都是坑。总之,安全是个永恒的话题,系统安全是基于很多安全假设的,而很多安全假设大家已经习以为常,非常容易疏忽。
以下为郭宇分享原文,由火星财经(微信:hxcj24h)整理:
一、区块链安全的4道坎
区块链安全其实是一个纷繁复杂的领域,涉及非常多的东西。
首先,区块链底层充斥着大量的密码学算法、密码学协议,这些密码学算法还使用了大量密码学最新研究的结果,比如椭圆曲线上的各种运算、零知识证明、同态加密、格密码等等。 其实这些密码学算法里面挺多坑的,使用不当会引入非常多的安全问题。
另一个是用户私钥的安全性,在区块链上,用户或者个体使用自己的私钥来参与区块链体系中。私钥是什么?到底意味着什么?其实大多数人并没有理解清晰,这会带来非常多的安全隐患。 私钥安全是很多初入区块链系统的用户面临的一道坎。
还有一个层面是共识协议安全,它其实并不是传统安全领域研究的课题,而是分布式计算领域中研究了几十年的东西。自从比特币诞生以来,依赖算力的共识协议成为很多区块链系统的一部分,当然,从POW更改出来的 POS也有相似的问题。
依赖算力就安全么,真不一定。其实过去已经发生过多起依赖算力的共识协议出现重大安全的问题案例。共识协议的安全性也是一个很大的坑。 我谨慎地预测未来一年里还会出现各种花式的共识协议安全漏洞。
区块链还引入了一个智能合约这个很牛的概念,通过编程来让任何人都能在区块链系统上建立自定义的共识,但是程序天生有bug这个特性从一开始被很多人轻视了, 尽管智能合约代码就那么点,几十行到几百行,但是漏洞百出。
我刚才讲了四个方面的安全:密码学安全、私钥安全、共识协议安全、智能合约安全。这些虽然并不是很新的问题,都是在去中心化系统中搅在一起,让“区块链安全”这个问题变得复杂无比。
二、密码学安全:开发者使用不当会让安全性崩塌
先讲几个密码学安全的问题。第一个讲讲比特币系统引入的ECDSA(椭圆曲线数字签名算法)。有一个比较著名的漏洞就是SONY的PS3游戏机,里面采用了ECDSA签名来进行安全校验,
在ECDSA这个签名方案中,依赖一个非常关键的随机数,但是这个随机数必须要随机,如果不随机,安全性就无法保证。然后PS3的 程序员 偷懒,用一个常数 4 代替了这个随机数。
如此一来,程序运行一点bug没有,但是破解PS3的黑客发现了一个异常,在每次进行ECDSA过后,签名值中有部分元素是相同的,这意味着随机数被重复使用了。根据ECDSA,如果用同一个随机数签名两次,黑客可以将两个签名值进行一个非常简单的运算,从而算出私钥。
这个案例,我想说明的是, 即使密码学算法本身很安全,但是开发者没有用正确姿势调用算法,会直接让安全性崩塌。 同样使用ECDSA的比特币是不是也会面临这样的问题呢?是不是我们同一个地址发2次币就会被黑客计算出私钥呢?
这种情况通常情况是不会发生的,钱包开发者们为了大家的资产安全,使用了RFC6979 定义的确定性 DSA 方案。这个关键的随机数由待签名消息经过一个确定性变化产生。简单的讲,由于比特币的UTXO结构,每一笔交易(即待签名消息)几乎不可能相同,也会导致随机数取值不同,所以确保了比特币不会出现SONY PS3上私钥被推导的情况。
这里的ECDSA安全性又基于了一个新的假设,比特币的UTXO结构会使得每一次签名用的“随机数”替代品很大概率不同。如果有一个新的区块链系统,忽略了这个非常重要的点,使用了账户模型,但是又是用的ECDSA,而且没有引入随机数,那么安全性将不复存在。
还有一个问题是很多人问过我的, 我也想分享一下。现在很多新的公链引入了格密码学作为抗量子的密码学基础,很多朋友会觉得比特币在量子计算机出来之后,就会面临灭顶之灾。其实事实上也不是这样,中本聪对于量子计算机的攻击也做了充分的考虑。
这样一个事实不假,量子计算机出来之后,根据Shor算法,能够在多项式时间内破解RSA与ECDSA。直接点讲,通过量子计算机,可以比较容易地通过公钥算出来私钥。但是比特币系统并没有直接暴露用户的公钥,而是对用户的公钥进行hash处理,这就是俗称的比特币地址, 通过比特币地址,量子计算机还是要算很久很久才能推导出私钥。
但是一旦用户花一次 UTXO,那么公钥就会暴露在区块链上,那么这时候私钥就不量子安全了,需要换一个新的比特币地址和私钥。所以,只要正确地使用比特币,仍然是抗量子的。
当然,这基于了一个很诡异的假设。这世界上没有一个聪明人想出一个高效的逆向算hash的量子算法。也许有个天才会毁灭比特币,这个说不清楚。
三、智能合约安全:潜在的坑数不胜数
接下来谈谈智能合约安全。这个问题其实网上挺多文章的,大家可以看到这种智能合约安全漏洞。言简意赅一点, 以太坊智能合约语言 Solidity 里面有很多坑,开发者一定要小心。
for (var i = 0; i<a.length; i++) { a[i] = i; },这个代码看上去人畜无害,是一个简单循环,但这里有一个很大的坑,如果数组 a 的长度超过 255 后, 这个循环是一个死循环。其实原理很简单,var i = 0 如果你这么声明 i,这个变量 i 是uin8,uint8最大是255,然后 i 会溢出。
如果一个不熟练的新手写合约,几乎 100% 掉到各种坑里面。 比如block.blockhash,这是一个系统api获取区块hash,但有一个很大的坑是这个api不能获取当前区块的hash,当前区块的hash等于0!block.blockhash(block.number) = 0。
还有很多的坑,数不胜数。
contract PingPong { function PingPong() { this.foo(msg.sender, msg.value); } function () { this.foo(msg.sender, msg.value); } function foo(address originalSender, uint originalValue) { originalSender.send(originalValue); }}
比如这样的代码看起来人畜无害, 但其实在构造方法里面是不能使用this的。这个和 Java 是不一样的。这些问题背后是各种合约安全血泪史。
不过我还是比较推崇Solidity,毕竟已经填了这么多坑了。很多还没填坑的各种新合约语言,请步子迈的小一点。
四、共识协议安全:每一个坑都不容易被发现
共识协议安全其实并没有得到充分暴露,因为每一个坑都是那么不容易被发现,还有大批的公链在研发各种新的共识协议。
我讲一个几个月前XVG算力攻击的案例。XVG是典型的POW币,POW大家都觉得挺安全的。XVG创新地引入了5种不同的挖矿算法,XVG的出块时间比较短,30秒一个。
5种挖矿算法听上去应该更牛才对,但是黑客只要能控制最小算力的那个挖矿算法算力,这要比控制总算力要简单的多,当黑客控制好某一个算力之后,就可以发起攻击。
通过一定的埋伏,连续出一定量的块,通过修改时间戳来导致别的区块失效,然后通过巧妙的拉长新生成区块的时间戳间隔,使得挖矿难度在不断降低,黑客可以一直干下去,把难度降低到接近0,最后统治整个区块链。
这个案例攻击方式非常巧妙,也是由于区块链系统设计者在改动POW的时候并没有深入思考。另外各种POS算法也要小心,有坑的概率更大。
五、“研究的越多,越觉得到处都是坑”
最后总结一下: 系统安全是基于很多安全假设的,很多安全假设大家习以为常了,非常容易疏忽;安全是个永恒的话题,因为我们总是忘记这样或者那样的安全假设。
也就是说,我们感觉到的“安全” 是基于某种东西的,当这种东西支撑不住的时候,安全会漏洞百出。
很多人会问“你觉得这个系统xx安全不安全”,我觉得很难回答,我觉得比较容易比较系统A 与系统B哪个更安全,如果系统A 依赖的安全假设比系统B的少,那么系统A就比B安全。
一个密码学算法虽然都是基于离散对数难题,但是一个是基于CDH,一个是基于DDH。这两个看着类似,但是前者比后者更弱,也就是更安全些。
对于区块链安全,我们需要层层深入,把这些安全假设都找出来,然后研究研究再研究。我们近期会总结一些关于共识协议方面的安全问题,还有密码学相关的安全文章。研究的越多,我们越觉得到处都是坑。
最后讲一下Fomo3D游戏里面的阻塞攻击。游戏中,最后一个购买游戏道具的人可以获得最终大奖,随着游戏临近结束,最后几秒时间内会有大量玩家试图争夺大奖,让自己的交易在最后一刻被矿工打包,而一个区块内可以打包的交易是有限的,具体由gas上限控制,因此矿工优先挑选手续费高的交易打包。
黑客在临近游戏结束时,可以发起少量超高手续费交易占满区块。这样一来,别人的交易就很难被打包。黑客可以利用打包策略来阻止他人正常参与游戏,从而提高自己获胜概率。
这一攻击手法利用了以太坊的共识机制,黑客可以以较低的成本连续阻塞多个区块。如何公平地让矿工打包,这是以太坊需要好好改进的地方。
问答环节
Q1:未来区块链安全在微观角度的发展趋势: 对于每个人来说,私钥的设置和保存能否尽可能的简单化? 各个钱包(冷、热)的安全性驱使大家会选择怎样的数字资产保存形式?
A1:这个问题很复杂。问我这个问题的朋友,我都推荐他们写在纸上,然后把纸装塑料袋里面并锁起来。当然现在有各种钱包,但我觉得还是纸片的安全假设更少一些。第一,纸片不联网;第二,纸片不会坏;第三,字写得潦草一点,还自带加密属性。
Q2:现在的各种智能合约,其安全性如何得到缓解?
A2:现在大家对智能合约的印象就是一堆的窟窿,但是我觉得这只是因为一开始大家并没有把智能合约安全问题当回事,大量的合约漏洞被拷贝来拷贝去,智能合约也缺少相应的 工具 和文档,很多安全漏洞靠的是口口相传。
我觉得这个问题会得到逐步的缓解,毕竟合约漏洞带来的损失巨大。各种合约安全工具正在逐步发布,逐步成熟,这需要一个过程。但是要想彻底解决合约安全问题,仍然是一个具有挑战性的难题,需要更加安全的开发流程,对于智能合约业务逻辑需要采用形式化验证等数学方法才能从根本上解决。
Q3:可不可以给大家深入浅出的讲一下,什么是形式化验证?
A3:形式化验证是一种利用数学逻辑推理来保证计算机正确性的理论技术,是一种静态方法。这里所谓的静态与动态是针对程序而言,动态方法就是通过运行程序来观察程序的行为,静态方法是在程序运行之前来观察程序,推测程序的行为。
形式化验证利用逻辑来100%覆盖程序行为的可能性,这要比传统的测试方法更可靠。测试就是一种动态验证方法,学习曲线非常陡峭,但是我相信随着一些形式化验证工具的研发,能降低形式化验证的成本,使之更加实用。
Q4:以太坊合约出了漏洞后,很多代币都会中招,甚至还有上了主流交易所的,这时如何升级补救?有没有成熟的模式?
A4:首先,合约要想办法暂停,让合约的参与者不再调用合约,然后重新部署合约,将老的问题合约中的账户余额迁移到新的合约中。有的合约增加了暂停功能,当合约管理员暂停合约之后,就能部署新合约,然后做数据迁移;有的合约直接增加了升级接口,这一类合约在暂停以及数据迁移方面成本会更低一些。
如果合约在一开始就没有考虑升级的话,出了问题或者想升级的时候就比较复杂了。如果想更安全的话,ERC20合约在设计的时候,可以考虑加入升级迁移的功能。这里有一个模板 https://github.com/sec-bit/tokenlibs-with-proofs/tree/master/erc20_upgradable
Q5:站在区块链技术架构层级的角度,风险事故最频发的受攻击面依次是业务层(71.17%)、合约层(20.72%)、共识层(4.51%)和网络层(3.6%)。从受攻击点来看,交易平台(34%)、智能合约(20%)和普通用户(19%)成为核心的受害人。 对于交易平台来说,如何更好的防范安全攻击?
A5:我觉得交易所要从代码层面仔细做审计,做充分的安全渗透测试,做好内部安全管控,做好安全事件处理预案,做好风控和预警。总之要以非常专业的角度来看待安全,不能疏忽大意,否则损失会非常惨痛。
当然,说起来比较容易,做起来很难,安全需要成本。
嘉宾简介
郭宇 / 安比(SECBIT)实验室创始人
中科大博士、耶鲁大学访问学者。专注于形式化证明与系统软件研究领域十余年,是国内早期关注并研究比特币与区块链技术的科研人员之一,二十余项区块链专利的核心发明人。研究专长:区块链技术、形式化验证、程序语言理论、操作系统内核。
对话发起人
岳汉超 / DoraHacks合伙人
全球最大Hacker组织DoraHacks合伙人,对外合作负责人;作为发起人举办过数十场大型黑客马拉松,对接全球数百个顶尖前沿科技组织+社区;清华大学经济学学士。
文章声明:本文根据「火星财经创始学习群」嘉宾分享内容整理,不代表火星财经立场,转载须在文章标题后注明“文章来源:火星财经(微信:hxcj24h)”。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 【EBTC·中国区块链技术大会】北京邮电大学区块链及安全技术联合实验室主任 马兆丰:区块链的未来是安...
- 区块链研究实验室 | 使用JavaScript编译和部署以太坊智能合约
- 区块链研究实验室 | 如何使用Oraclize基于原子互换技术构建分布式交易所
- Ceph实验室:第四课:Ceph监控
- Ceph实验室:第四课:Ceph监控
- 2018Android实验室CV培训总结
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
GUI设计禁忌2.0
Jeff Johnson / 盛海艳 等 / 机械工业出版社 / 2008 / 49.00元
本书描述软件开发人员在设计图形用户界面(GUI)时经常犯的“禁忌”,并提出避免这些错误的基本原则和理论依据。本书将GUI禁忌分为7种类型:GUI控件禁忌、导航禁忌、文字禁忌、图形设计和布局禁忌、交互禁忌、响应性禁忌以及管理禁忌,并分别进行详述。 本书编排独特,条理清晰,针对性极强,是不可多得的GUI设计优秀资源。本书适合软件开发人员、web站点设计人员、开发经理、用户界面设计人员等阅读。一起来看看 《GUI设计禁忌2.0》 这本书的介绍吧!