如何给网络披上铠甲?



  • 原著 汤强 ,原文链接:https://mp.weixin.qq.com/s/Q3usFdsJqfPQLzYdtSvOBg

    远古互联网时期有个段子:

    官员:给我100万,在北京没有办不成的事。煤老板:这是1个亿,把天安门上的照片换成我爹。

    官员拿钱走人。

    一周过去,煤老板看见城楼上的照片没变,叫着退钱,但官员说事已办好,煤老板回派出所一查,发现自己的名字被改成了毛岸英。

    这个段子除了告诉我们逆向思维能赚钱外,还在诉说一种隐性需求:身份信息应该上链。但这里有个小问题:政务不是商业项目,不可能为了激励不作假,而让公安机关去挖矿。

    有没有技术可以摆平?有,它的名字叫TEE。

    一、什么是TEE?

    可信执行环境(TEE,Trusted Execution Environment):在硬件层面划出一块独立于操作系统的区域,能无忧无虑地运行代码。

    看名字可能不眼熟,但TEE在我们日常生活中早已普遍,比如手机会把你的指纹和密钥存在可信环境中,当需要验证指纹时,在TEE中执行判断,直接输出结果,保障隐私。

    很多TEE技术基于CPU芯片,而Intel公司的SGX(Software Guard Extensions)则把安全范围从CPU芯片拓展至内存条。

    SGX并不像杀毒软件那样监控恶意软件和篡改行为,而是把合法软件的安全操作封装在一个独立区域中,这个区域的名字叫Enclave。
    0_1538093711408_680754b9-79c6-437b-b74f-a0b5800810cd-image.png
    Enclave ['enkleiv] 原指本国境内隶属另一国的领土,在TEE中指独立于操作系统外、安全的硬件区域,相当于一块被钢板保护的世外桃源。

    即使恶意软件感染操作系统,也无法篡改代码。于是,如果在服务器上使用SGX,这台服务器就能向其他人证明:它跑的代码就是它声称要跑的代码,它记的数据就是它本应记的数据。

    最终很多台服务器搭建出一个分布式网络,即使没有激励,也能正确读写数据。但是,以SGX为代表的TEE技术真的如此完美么?

    二、没有绝对可信的执行环境

    只要是个装着金条的保险柜,总会吸引潜在攻击者,问题是,都已经在硬件上做到隔离了,攻击者又如何通过软件执行恶意呢?不过,确实有种攻击可以穿透硬件防卫,而且多次得手,它的名字叫Rowhammer。
    0_1538093771254_c87eeba4-519d-406e-b8dd-51ded1ab4ae7-image.png
    Rowhammer攻击目前还没有像样的中文名字,机械翻译应该是“用榔头横敲竖打”,把内存里本来的0敲成1,本来的1敲成0,听起来很玄幻,但真的不是说段子,这是怎么做到的?

    计算机的内存由无数个存储单元组成,存储单元中的电容充满电子时表示1,清空电子时表示0。不过电容会漏电,充满电子后,只需几毫秒电就会漏光,需要CPU对电容继续充电,保持1的状态。

    本来好好的,但是最近几年内存容量大幅上涨,电容排列越来越密,一旦高频读写某段内存区域,相邻存储单元很容易因为电容泄漏产生“比特位翻转”。

    这就好像一张桌子上铺满硬币,本应按正常程序翻转硬币的正反面,可是因为翻得太快,桌面一抖,某些硬币脱离指令翻了身。

    一旦因缘际会,关键比特位上的0和1发生翻转,那么TEE就会被攻破,进而能执行未经授权的代码。Rowhammer攻击是一种源自硬件的问题,软件层面很难解决。

    2016年9月,出现一种名叫风水翻转(Flip Feng Shui)的攻击技术,本质上就属于Rowhammer类型。风水翻转在物理内存上动手脚,把关键信息存储到容易被Rowhammer攻击的物理内存区域,然后启动高频读写,几榔头下去,就能把TEE的铁皮盒敲成牛皮纸。

    在Rowhammer攻击面前,Intel公司的王牌产品SGX也未能幸免,2017年10月,有论文指出,SGX炸弹攻击(SGX-Bomb Attack)可以触发远端服务器enclave进程自锁,系统出于自我保护会重启,这对云端服务器是一个重大威胁。实测环境中的SGX炸弹攻击,攻击者用了64毫秒刷新一次的频率,不到5分钟就让系统挂了。

    虽然Intel公司修复过一些同类漏洞,但无论怎么努力,可信执行设备始终处于看不见的军备竞赛中,道高一尺魔高一丈,天也不知道会从天而降哪些妖怪啃光TEE的安全性,不过区块链技术却带来一剂解药。

    三、TEE+BFT:试水无币区块链

    为记录数据的节点披上TEE的铠甲,即使个别节点被攻破,执行恶意的代码,却依然有条件正确地记账,因为只要故障节点低于总节点数的1/3,使用BFT的共识机制就能在数学上保证分布式账本不出错。

    顺着这条逻辑,就能推演出无币区块链:并不需要用币激励矿工保护链上数据。

    大多数区块链的coin或token,客观上的作用只有一个:保护数据不被篡改。因为币的存在,恶意篡改者必须先和矿工肉搏,矿工靠币谋生,如果不卖力抵抗,账一错,信任体系奔溃,币价大跌,自己倒霉。

    所以,和普遍认知相反,区块链技术本身并不能必然保证数据准确,最终保护账本的是矿工的利益。区块链最多只是一种分布式记账技术,如果有足够强大的恶意外力,同样的代码并不能必然保证数据准确,同样的正确,可能源自完全不同的争斗过程。

    而TEE技术的加入,在很大程度上降低了搏斗成本,使得数据趋向可信。不过任何“可信”都讲究成本收益,如果篡改数据的收益大于成本,潜在攻击者就会冒出,原来挡住恶意者的是矿工,而现在多了一项技术:可信执行环境。

    当然,在TEE组成的网络环境中,也能引入传统矿工奖励,让账本得到双重呵护,在这方面的试水者很多,让时间陪着我们静静观察。

    结语

    实际场景中到底使用TEE还是矿工,归根到底是个数学问题:谁的成本收益更划算谁就上场:

    那些牵扯利益广泛的底层应用,由矿工牵头使用矿机挖矿保护安全相对划算,比如比特币。如果比特币必须使用TEE技术才能接入记账,那很难有人可以保证TEE技术的研发者和生产商不在芯片里面埋后门。所以,比特币挖矿成本高,可如果使用TEE技术记账,它的成本会更高。

    那些针对特定场景的表层应用,更容易铺设TEE网络、记录分布式账本,比如公司内网和政府机构的数据库,毕竟TEE技术能提升作恶成本,削减审计费用,比如很难再有内部人员能篡改别人名字了。

    区块链应用停留在炒币阶段,鲜有成果落地,不是因为技术难,而是分布式系统本身就很贵。如果一件事一个人能做好,就没必要摊出去让大家做,这是很简单的常识,但却很容易在山呼海啸的宣传会中被人忽略。

    只有那些一个人做、必然没有很多人一起做更有效率的事,才有必要摊出去让大家一起帮忙,比如发行竞争货币,比如确认权利归属。

    分布式系统节点数多、天生贵,常常不如中心化系统有效率,这是现在很多区块链项目推不动的底层原因:成本贵过收益。站在这个角度想一想,其实90%的项目你根本不用看。

    0_1538093852107_a3d69bd0-9c0e-4b7e-99f7-8bf081215a8b-image.png



  • 这篇文章对理解Mixin项目很有帮助,讲解的也很通俗易懂,可读性很强。