区块链安全初探

端御科技  2019-03-14  区块链/区块链Blockchain栏目  

  

  <  版权声明  >

  1.本文版权归上海端御信息科技有限公司所有;

  2.转载或引用本文内容请注明来源,否则将视为侵权;

  3.对于不遵守此声明或其他违法使用本文内容者,本公司保留追究其法律责任的权利。

  前言 FORWORDS

  区块链作为一种集分布式存储、P2P网络、共识机制、加密算法等技术于一体的价值传输体系,近年来得到长足发展,其生态系统已经延伸到云计算、物联网、人工智能等领域,并衍生出了数字货币、共享金融、跨境支付、开发基础、数字征信、数字防伪等应用领域,已经引发了一些技术创新和产业变革。作为先进技术的初级阶段,区块链的安全问题一直是迄今为止伴随其成长的最重要问题之一。

  对于企业来说,信息安全一直是作为成本项来看待的,其价值一直是按照发生信息安全事件所能造成的损失来衡量,所以从这个角度看金融企业、互联网企业对于信息安全的重视程度是最大的。区块链行业作为一个交叉的新兴行业,其绝大多数数字资产都是在线上,可以说对信息安全的依赖程度是更大的,任何一个信息安全风险都可能造成区块链项目的颠覆性失败。所以我们认为区块链对于信息安全领域来说是一个前所未有的机遇和挑战。

  端御科技作为一家信息安全新锐,具有丰富的网络安全攻防经验,切入区块链安全后,我们对不同业务应用场景下发生的主流攻击事件进行跟踪、还原和探索,经过分析和总结,逐步建立起一套集渗透测试、节点加固、合约审计于一体的安全解决方案,并逐步与区块链行业的企业建立起深度合作关系,为建立起安全可靠的区块链技术生态体系出一份力。

  一. 区块链安全概况

1.1 

  区块链泛安全

  区块链是一个交叉行业,它的出现不仅带来了技术上的创新,也带来了金融、伦理、社会治理的一些思考。我们从几个不同视角来看下区块链行业在非传统安全领域带来的新问题:

  1.1.1 资产联动:数字虚拟资产的跨平台联动性(交易所事件)

  加密货币是区块链最具魅力的数字资产,其核心魅力来自于打破国界的低成本的跨域流通和 流动性,这直接产生的一个附属属性就是各资产交易平台短时间资产的紧密联动性,这里存在着 无数的币圈的量化交易者,这里就是跨平台套利和量化交易的天堂——也是地狱。黑客可以通过制造各种安全事件来搅动这个特定的交易市场,发生了安全事件后即使平台管理者及时地冻结了、回滚了该平台的交易,黑客依然可以利用各交易平台数字资产的强联动性合法地从被攻击平台的 外围市场进行做空牟利,这是一场没有硝烟的战争。

  

  我们来回顾下发生在某著名交易所的一个案例:

  • 事发前夜

  - 潜伏扫货:

  在其他不易引人注意的小交易所利用自有资金,静默地持续地买入 VIA 币(维尔币,一个流动性很差的虚拟币)。

  同时通过期货交易挂了比特币的大量空单。

  - 盗取了大量用户账户:

   通过钓鱼、入侵等方式,控制了大量用户的 API key 交易接口(包括 Access key 和 Private key)。

  - 开发量化交易代码:

  黑客通过交易所提供的 API 以程序化交易的方式大批量、并发地操作众多用户的账户,同时买进卖出,形成脉冲交易。

  • 实施攻击

  北京时间 3 月 6 日晚,黑客先是把所控制用户账户里的数字货币,全部换成了比特币。然后, 黑客再通过程序化交易同时通过VIA/BTC 交易对,脉冲买入 VIA。该交易对瞬间涌入上万比特币, 直接击穿 VIA/BTC 交易对的 OrderBook,使得 VIA 价格被瞬间拉高 110 倍。

  

  - 应急响应:

  该异常交易触发了交易所的风控系统,即时冻结了提币交易,锁定场内黑客资金的外逃。但是,黑客根本就没打算从交易所将币提走,在高位卖掉的 VIA 币只是黑客的一个很小的头寸。

  • 价格联动——真正的收割

  此时各交易平台量化交易的资金成了背后的推手,他们使得在其他交易所的 VIA 币价产生了强联动性追随币安的 VIA 价格上涨,随着这波拉升,黑客高价从容甩货给了量化交易和追随短线交易者。VIA 在随后的 24 小时内的成交量,高达 1.4 亿美金。保守估计,有 1 亿美金,都被黑客卷走。

  • 利空事件导致整体性价格下跌——二次收割

  随后此事件震动币圈,所有加密货币经历了一波大幅度下跌,黑客再次从容地从之前的空单中大捞了一笔,完成第二波的完美收割,至于之前在该交易所中没有转出的获利头寸只不过障眼法罢了。

  

  • 第二季 SYS

  - 不同的包装同样的味道——重装上阵:

  7 月 5 日,黑客使用同样的手法再次从该交易所拉升交易对 SYS/BTC,SYS 的最高价格达到了惊人的 96BTC(约合人民币 416 万元), 是此前价格的 320 万倍。币安之外,黑客利用同样手法在 Bittrex、Upbit 等平台上提前埋伏,趁机出货,SYS 产生了超过 8000 万的交易量,随后比特币跌去 130 美元。

  

  区块链加密货币的金融联动是一个巨大的安全挑战。蝴蝶效应已经无法形容区块链加密货币各平台各币种之间的强联动性,在这个领域黑客利用强联动性来获利的套路已经不是小概率的“黑天鹅”,而是必然会反复重演的“灰犀牛”,随着区块链越来越走进我们普通人的视野,区块链 加密货币带来的金融联动性是一个值得重视的安全挑战,这种金融套路一旦被反复利用,带来的将是市场巨大的不稳定性。

  

  1.1.2 人机共治:去中心化和效率平衡的挑战(EOS 仲裁风波)

  有关加密货币的终极目标是实现“Code is Law”这一理念,是很多币圈人士的信仰。他们希望寻求一个完全程序化自治的生态,用算法来解决治理和利益平衡的问题。如果找到这种合理的治理生态的方式,那么它一定会推动社会治理形态的发展。但最近在 EOS 仲裁风波中很多人对之前这种理念产生了动摇和怀疑。

  

  PBs bypass ECAF:

  6 月 17 日 EOS 网络的 21 位区块生产者在没有经过 ECAF (EOS 仲裁机构)裁决的情况下: 一致决定冻结 7 个被怀疑持有被盗资金的账户以阻止其进行交易。

  EOS 的仲裁案,引起了整个 EOS 社区的争议,EOS 系统里面本来就有个核心仲裁论坛,它的仲裁流程与现实法院也基本一致,是个比较完整的仲裁流程,但是这次 21 个超级节点 bypass 了仲裁机构,直接通过电话会议,合伙去冻结别人账户,这似乎已经违反了 EOS 宪法。EOS 仲裁事件,实际上是   EOS   生态系统的“司法部门”未能处理的一系列的安全漏洞,使区块生产商采取单方面行动冻结危险账户。

  过度追求效率带来的中心化问题:

  这次事件凸显了DPOS 算法的中心化问题。EOS 的拥护者们想要一个既快速(效率高,打包快) 又便宜(节省算力)的区块链,同时其治理结构能够做出最有利于用户的决策,但实际上过度的 追求效率就带来了过度中心化的代价。

  人机共治的探索之路:

  仲裁风波对EOS 来说应该是一个良好的契机,是使得 EOS 从新开始审视社区治理的重要性。

  EOS 的创始者是希望将 EOS 打造成完全的去中心化自制体系,里面有共识算法、宪法,也有行政部门、仲裁机构、社区,用代码和人共同的治理为区块链发展带来新思路,这条曲折的探索之路也许会给我们社会治理带来一些新的启示。可见寻求一个效率和去中心化的最佳平衡点是一个很难的挑战。

  

  1.1.3 网络暴力:繁荣地下交易还是劳动致富新途径(暗网和蠕虫)

  暗网的繁荣在很大程度上依赖于加密货币的发展,直接上图,最近的几起泄密数据交易均是以 BTC 计价:

  

  

  

  ShadowBrokers 叫卖的 NSA 漏洞库、希拉里竞选时被曝光的内部邮件都是通过加密货币来进行的地下交易。

  网络蠕虫军团是网络空间的暴力军团,他们通过将网络安全漏洞转化成中心化的蠕虫网络, 最后变成了网络暴力形式。

  

  随着发展蠕虫军团的暴力形式不断演化,直到挖矿行为的出现……

  

  挖矿给网络暴力军团提供了一种更温和地利用网络资源的获利方式,一定程度上降低了网络暴力对现实世界造成的逐步升级的危害。

1.2 

  区块链安全性分析

  区块链根据其特性,主要面临以下四个方面的挑战:

  (1)加密算法安全性

  加密算法是区块链底层的基础,这一块的安全性依赖于密码学的安全性,属于密码学安全的范畴。目前区块链项目所使用的加密算法主要是非对称加密算法和 Hash 算法,其安全性是建立在加密算法的高计算复杂度上的,这里存在两个问题:一是所选用的加密算法是否可靠,比如BTC 系统所选用的有限域椭圆曲线方程为 y^2=x^3 7, 质数模数、基点、序次都是极大的数值, 被定名为 secp256k1 方案,该方案的参数选取是否合适,很多人就怀疑看起来随机的数字可能存在重构私钥后门;二是随着量子计算机技术的发展,会有越来越大的可能可以证明 NP问题也是属于BQP(只有量子计算机才能解决的问题),那么高计算复杂度的加密算法再不是安全的堡垒。

  (2)区块链特有的安全性

  区块链的P2P 组网、共识机制、奖励机制、智能合约及 Dapp 这些组成了区块链项目的核心, 是区块链独有的逻辑架构。这里面存在着很多区块链独有的安全问题,比如分叉攻击、51% 的算力攻击、双花攻击以及各类合约漏洞。这些是在构建一个区块链项目时最容易面临的安全问题。

  (3)区块链中参与者的安全性

  “人”永远是信息安全中最不确定的一环,在区块链中也如此。无论是区块链项目的管理者、运维者还是参与使用者,稍有不慎都会成为木桶原理的短板。比如区块链项目的管理者的主机被 攻陷,管理、运维或使用者被社会工程学攻击、钓鱼攻击、水坑攻击,甚至是来自内部的攻击, 这些都是区块链项目管理和运维不可忽视的重要安全因素,由于针对“人”的攻击技术成本是最低的,往往也是最有效和容易实施的,稍有不慎都可能造成毁灭性的打击。Mt.Gox   最终破产起初就是源于其一名审计人员的电脑被攻陷盗取了 6 万用户的资料。

  (4)承载区应用系统的安全性

  区块链项目的平台、节点、软件系统、虚拟机、Dapp,构成了区块链项目应用的运行生态,都会存在各类安全问题,这一块本质上和传统的安全是相通的,所以从攻击的角度来看,其攻击技术也更加成熟,基本上目前区块链领域大多数攻击都是针对这一块的。相应的针对传统攻击的防御技术也是更加成熟的,只是目前对安全这块还是不够重视。

1.3 

  区块链项目分层框架

  区块链项目的架构大致包括数据层、网络层、共识层、激励层、合约层、应用层。各层之间相互配合实现一个去中心化的价值传输机制。各层之间都有各自独特的技术特点,也各自都面临着一些显著的安全问题。

  

1.4 

  区块链安全事件发展趋势

  近五年区块链行业得到一个迅猛的发展,起初区块链还主要是集中在加密货币应用上,随着以太坊、EOS 这类区块链 2.0 平台型项目的落地,区块链在各领域得到迅速推广。随之而来的各类安全事件也呈现爆发性增长。

  

  

  区块链安全事件造成的损失和区块链的整体规模是正相关的,从以上两图我们可以看到,在2016 年前区块链安全事件损失是和比特币的价格走势高度相似的,说明了基本上在这之前安全事件主要是加密货币平台的损失。2016 年后,整个区块链由于安全事件造成的损失,脱离了比特币价格的走势,说明造成的安全事件的重灾区已经由交易所向各类区块链项目发散,呈现遍地开花的走势。

  下面我们把近年来发生的区块链安全事件进行了分类统计:

  

1.5 

  区块链漏洞分类

    

  通过对区块链分层框架的分析,结合我们对区块链项目所发生历史安全事件的统计,我们认为攻击行为对象主要是以下几个方面:

  • 加密算法及数据区块

  • 基础网络 

  • 共识机制

  • 智能合约

  • 承载平台及应用

  • 区块链节点

  • 区块链参与者

  1.5.1 攻击路径线索

  其中基于时间戳的链式数据区块结构、P2P 节点的共识机制、可编程的智能合约是区块链最具代表性的创新点,其攻防技术在安全领域也属于比较新的研究范畴;其他几方面的攻防技术则可以归为传统的安全研究范畴,可以拿出较成熟的解决方案。另外我们通过攻击事件还原发现,从攻击者的角度主要有以下两条攻击路径起点:

  • 区块链项目中的中心化对象:交易平台、在线钱包、公有链的启动节点和全节点;

  • 区块链项目的去中心化对象:共识机制、智能合约、Dapp。

  前者将攻击聚焦于“点”,侧重于APT 的攻击艺术;后者将攻击聚焦于“面”,侧重的是漏洞的挖掘,这在防御的方式上是有很大区别的。

  1.5.2 攻击方式分类

  下面列举了区块链各环节一些常见的攻击方式:

  

  其实攻击方法远不止这些,我们只是抛砖引玉,后面我们会对其中具有代表性的漏洞进行案例分析。

  二. 区块链安全分类案例分析

2.1 

  加密算法与数据区块

    

  2.1.1 恶意信息攻击

  由于区块链具有数据不可删除的特性,信息一旦被写入区块链后很难删除,所以区块链可以作为数据的一个永久性中转媒介。

  • 作为蠕虫或僵尸网络的 C&C 中转,获取指令和数据政治敏感等方面的信息:

  https://github.com/i3visio/blockchain_c2c 就是一款利用区块链进行 C&C 通讯的例子。这款蠕虫不需要像传统蠕虫那样建立 C&C 服务器,而只需要通过公有链来作为 C&C 指令传输的媒介。

  

  • 政治敏感等方面的信息:

  2018  年  4  月,北大外国语学院一学生将“北大请愿书事件”写入了以太坊区块链,可以通过以下链接查看具体内容:https://ETHerscan.io/tx/0x2d6a7b0f6adeff38423d4c62cd8b6ccb7 08ddad85da5d3d06756ad4d8a04a6a2from=timeline&isappinstalled=0

  

  该事件也使得区块链掀开了具有信息发布属性的新的一页,具有里程碑式的作用。

  2.1.2 针对算法的攻击

  • 碰撞攻击

  散列函数算法都是“无限域”向“有限域”的映射,所以理论上必然存在碰撞攻击。MD5 和 SHA-1 算法都属于比较典型的找到构造碰撞方法的案例。

  • Hash 长度扩展攻击

  此种攻击主要出现于 MD5、SHA-1、SHA-256 等基于 Merkle–Damgård 构造的算法。其原理就是在已知 hash 密文和密钥长度的情况下,计算出密文与另一消息拼接后计算出的 hash。

  可以使用

  HashPump(https://github.com/bwall/HashPump)来构造这种攻击。 

  • 后门攻击

  非对称加密算法本身没有问题,但是通过精心选取初始化的参数可以植入后门。

  - Dual_EC_DRBG 后门

  NSA 收买 RSA 将 NSA 推荐的算法 Dual_EC_DRBG(双椭圆)设置为 Bsafe 中的默认随机数生成算法,攻击者可以利用 Dual_EC_DRBG 后门推算出该算法后续所有的随机数值。

  - secp256k1 方案

  比特币也使用了 ECC 来生成随机数,但是比特币神秘创始人中本聪在 2009 年发明比特币的时采用了小众的 secp256k1 的曲线参数而不是有问题的 secp256r1(NIST P-256),神奇地躲过了 NSA 的密码学子弹。但近年来有人怀疑 secp256k1 构造的高阶参数依然可能存在后门。

  • 量子攻击

  目前密码学算法的基础基本上是依赖于大数分解、椭圆曲线、离散对数这类 NP 问题在传统计算机上的时间复杂度。随着量子计算机的发展,量子计算机能解决 BQP 问题(量子计算机在多项式时间内解决的决策问题),目前尚未证明 NP 问题属于 BQP 问题,一旦取得突破,那么将会动摇区块链密码学基础。

2.2 

  基础网络

  P2P 网络是区块链的底层基础架构,是区块链安全的重要一环。由于区块链的节点可能是普通的 PC,也可能是云服务器,很多节点的加入和退出也具有很大的随意性,且没有一套统一的安全防护标准,安全防护能力层次不齐,一旦被攻击者攻陷其中不安全的节点,可能会危及整个网络。下面我们分析其中的一两个典型案例。

  

   2.2.1 节点泄露漏洞

  区块链的网络节点,对区块链来说非常重要,很多高级别的攻击行为都是从发现节点开始的, 无论是针对节点的脆弱性配置攻击还是 0day 攻击,第一步都是始于节点发现。

  区块链的节点发现(IP 和 Port)主要有以下几种方式:

  (1)通过客户端本身获取硬编码的节点地址

  (2)通过 DNS 服务去发现节点

  以比特币网络为例,节点在启动时,发布 dns 解析请求,请求种子节点的地址。种子节点的域名列表如下:

  seed.bitcoin.sipa.be

  dnsseed.bluematt.me

  dnsseed.bitcoin.dashjr.org

  seed.bitcoinstats.com

  seed.bitcoin.joNASschnelli.ch

  seed.btc.petertodd.org

  (3)通过节点与其他节点交互地址列表获取地址

  以某类以太坊区块链项目为例,通过其公开的客户端,我们只要修改 p2psrv 部分的代码就可以打印出 boot 节点和周边连接的节点:

  • 通过修改 p2psrv/server.go 中的 dialLoop() 函数,在新节点连接成功后记录节点 IP 可以看到 boot 节点 IP。

  

  

  • 通过修改 p2psrv/server.go 中的 discoverLoop () 函数,在新节点连接成功后记录节点IP可以看到中继节点 IP。

  

  

  (4)在客户端启动的配置文件里寻找节点地址

  比特币数据目录中名为“addr.txt”的文件里就存放了节点地址。从文本文件加载的地址最  初被赋予零时间戳,因此它们不会响应“getaddr”请求而被公布。

  (5)通过区块链节点特征 Discover Port 或者 Json RPC Port 的特征去做全网 42 亿地址的扫描

  比如了解到某区块链节点的 Discover Port 为 55555,Json RPC 为 5676,可以通过masscan 这样的快速扫描器去做全网扫描(根据上行带宽情况,可能时间会比较久),也可以借助 Shodan 类似的平台去做检索,不过时效性比较差。

  

  (6)通过区块链的信息平台去发现节点

  我们在帮助某区块链项目做节点审计时发现其某个信息平台存在信息泄露漏洞,可以通过截获其 webSOCket 推送数据发现其所有节点的 IP。

  

  

  可以从中提取出所有节点的 IP。

  2.2.2 BGP 劫持攻击

  BGP(边界网关路由协议)劫持,是利用 BGP 操纵路由路径,使得流量被接管,无论是网络犯罪分子还是政府都可以利用这种技术来进行流量引导和拦截。比较经典的一个案例就是youtube 劫持案例

  巴基斯坦政府决定封锁 Youtube,于是在巴基斯坦电信的路由上使用黑洞路由大法将其中一个网段定向到 Null0 口:

  ip route-static 208.65.153.0 24 NULL 0

  不幸的是电信工程师把这条静态路由发布到 BGP 了,BGP 把这条路由向其他 AS 路由器同步了,很快同步到了全世界,这时大部分互联网用户上 youtube 的数据都被导向了巴基斯坦, 并定向到了 Null0 口,导致全部无法访问 youtube。

  这个案例意味着只要控制了任何一个 ISP 的任何一个 BGP 路由,都将具备影响全世界互联网的能力,而且 BGP 劫持很难被发现(youtube 案例如果不是被导向 Null0 口,数据包就会在巴基斯坦网络转一圈最后到达 Youtube)。针对区块链领域,理论上可以实施以下攻击:

  • 分割攻击

  攻击者利用BGP 劫持将区块链网络分割成两个隔离的网络,此时区块链会分叉为两条并行链。攻击停止后,区块链会重新统一以最长的链为主链,将短链废弃,其上的交易和奖励都将无效。

  - 攻击路径:

  (1)攻击者发动 BGP 劫持,将区块链网络分割成不同大小的两个网络 ;

  (2)在小网络中,攻击者通过交易卖出自己的加密货币,兑换成法币 ;

  (3)经过小网络的“全网确认”,这笔交易生效,攻击者获得等值的法币 ;

  (4)攻击者释放 BGP 劫持,大网络和小网络互通,小网络上的一切交易被大网络否定,攻击者的加密货币全部回归到账户,而交易得来的法币,依然还在攻击者手中,完成获利。

  • DNS 劫持攻击

  MyEtherWallet 被 DNS 劫持攻击:美国时间 4 月 24 号上午,亚马逊权威域名服务器遭到 BGP 路由劫持攻击。攻击者的目的是利用 DNS 和 BGP 固有的安全弱点来盗取加密货币。该劫持波及了澳洲、美国等地区。

  

  - 攻击细节 :

  本次事件中,亚马逊自治网络 AS16509 持有以下IP 前缀,并向外发起它们的路由起源通告:

  

  它们均用于提供 DNS 服务。互联网用户所使用的 DNS 解析器对该 IP 段发起针对某个域名的 DNS 查询,这些查询会被送往 AS16509 中的 DNS 权威服务器,而 DNS 权威会返回该域名相应的 IP 地址。例如,以下查询会返回域名 myetherwallet.com 的 IP 地址:

  $dig short myetherwallet.com @205.251.195.239 54.192.146.xx

  而在当天上午为时两小时的过程中,攻击者(AS10297)对以下前缀发起了路由起源声明:

  

  根据 BGP 路由选择的最长前缀匹配原则,对这些 IP 段发起的 DNS 查询都被劫持到了攻击者所在的 AS10297。攻击者只对 myetherwallet.com 的查询请求回复以虚假的 IP 地址(对其他域名的查询请求则不予以回复),用户稍后对该网站的访问流量被全部劫持到一个俄罗斯 ISP 提供的非法网站。如果用户在该网站中输入登陆信息(用户名和密码),攻击者就会拿到这些登陆信息,从而窃取受害用户的数字货币。MyEtherWallet 已发声明表示很多用户成为本次攻击的受害者。

2.3 

  共识机制

   

  共识机制是区块链独有的技术灵魂,是它与其他 P2P 技术的差异所在。共识本质是一个社会过程,而人类相当擅长专注自己的共识,本不需要来自算法的帮助,但人类没有无限的计算能力,因此依靠程序来为我们保存共识是一个很好的方案,而且对于非常大规模的共识,程序可以保持完美的精度。而且通过程序来构建的共识算法有一个非常重要的优势就是弱主观性。

  目前适合公有链常用的共识机制主要有 POW,POS,DPOS 等,他们各有优缺点。针对共识机制的安 全风险有很多,比如贿赂攻击、N@S 攻击、长距离攻击、预计算攻击、女巫攻击、51% 算力攻击、算力衰减风险等。我们选取一两个例子进行分析。

  

  2.3.1 贿赂攻击

  

  此攻击主要影响 POS 共识机制,对 POW 来说成本较高。贿赂攻击流程如下:

  (1)攻击者在区块链上购买某种商品或服务;

  (2)商户开始等待网络确认这笔交易;

  (3)攻击者开始在网络中首次宣称,对目前最长的不包含这次交易的主链进行奖励;

  (4)当主链足够长时,攻击者开始放出更大的奖励,奖励那些在包含此次交易的链条中挖矿的矿工;

  (5)六次确认达成后,放弃奖励;

  (6)货物到手,同时放弃攻击者选中的链条。

  只要此次贿赂攻击的成本小于货物或者服务的开销,就是成功的。

  2.3.2 Noting at Stake 攻击

  

  在POS 共识下,如果存在分叉(无论是因为意外或攻击),节点最好的策略都是同时“挖” 每条链。节点不需要消耗计算资源,只需要使用自己的钱来投票。这意味着无论哪条链胜出,矿工都会得到奖励。这种情况就使得攻击者可以使用很低的成本发起“多数人攻击”来改写区块。

  2.3.3 长距离攻击

  

  如果矿工想在POW链里分叉,它得在主链最新区块前几个区块开始挖。矿工往回得越多, 就越难追上主链,这需要超过网络一半的算力才能做到。然而,在POS   里,由于挖矿所需的东西只是权益,即钱,矿工可以从成千上万个块之前开始分叉。矿工可以轻易生成成千上万的区块,而用户很难发现哪一条链才是“正确”的链。

2.4 

  智能合约

   

  运行在合约虚拟机上的智能合约,使得区块链具备了无限可扩展性,但是智能合约一旦发布就很难进行修改,所以其安全性可能会决定合约的生死,因此建议合约开发者在合约发布前要对合约的代码进行充分的审计和模糊测试。一般来说我们可以从函数可见性、合约限制绕过、调用栈耗尽、拒绝服务等几个方面开展审计。

  

  下面我们分析几个常见的漏洞:

  2.4.1 重入攻击(递归调用漏洞)

  

  当智能合约 A 调用智能合约 B 时,智能合约 B 在被调用函数中写入“使智能合约 A 调用智能合约 B”的代码,这样就造成了重入攻击。重入攻击本质是劫持了合约控制流程,破坏事务原子性,可以理解为一种逻辑上的条件竞争问题。

  一个典型的操作流程是:

  (1)智能合约 A 向智能合约 B 发起提现请求;

  (2)智能合约 B 向智能合约 A 转账,并触发智能合约 A 的回调函数;

  (3)智能合约A 的回调函数中被写入的操作是“智能合约 A 向智能合约B 发起提现请求”;

  (4)至此,回到步骤 1,由于破坏了程序的原子性,没有及时更新合约 B 中的余额数据, 依然可以继续执行下去,陷入递归循环,直到不满足循环条件;

  (5)提现结束。

  上代码:

  

  The DAO 事件就是由于重入攻击,导致损失了 360 万以太币,并且导致了以太坊硬分叉。虽然以太坊直接撕裂成了 ETH 和 ETC(以太坊经典),但最后还是没能解决问题,因为会存在重放攻击。新链上的交易广播到旧链上,交易依然能够成功,因而造成使用混乱。

  解决方案

  • 使用内置的 transfer(限制了 2300gas)

  • 确保所有改变状态的变量的逻辑发生在外部调用之前

  • 使用互斥锁,添加一个在代码执行过程中锁定合约状态的变量

  举例

  

  2.4.2 整型溢出攻击

  

  也被称为整数溢出和整数下溢,这不是一类新的漏洞,但它们在智能合约中尤其危险,如果发生溢出,许多良性代码路径成为盗窃或拒绝服务的载体。

  上一段存在下溢的代码:

  

  其中两个无符号整数的算术结果是一个无符号整数,导致整数下溢。

  DAO、BatchOverflow、ProxyOverflow、BEC 都出现过整型溢出。

  解决方案

  • 使用

  require(balance[msg.sender]>amount)

  • 使用 SafeMath 防止溢出

  2.4.3 越权访问攻击

  

  越权访问攻击多数由于未能明确函数可见性,或者未能做充足权限检查,导致攻击者能够访问或者修改到不该访问的函数变量。

  看如下代码:

  

  此代码 Parity 多签名下的越权访问。delegatecall 获取 EX_FUNC 代码,运行于本合约上, 导致自身 owner 被修改。

  2.4.4 交易顺序依赖攻击

  

  智能合约的执行会随着当前交易处理顺序的不同而产生不同的结果。因为待处理的交易会在内存池存储一段时间,在交易被真正打包进区块中之前是可以“预知”什么样的交易会发生的。攻击者可以依据待写交易包含的订单信息构造自己的交易订单,并且设法让自己的交易先于其他交易被写进区块中。

  但是,在区块链项目中,交易顺序并不是一成不变的,例如在以太坊中,交易顺序就会随着交易发布者的 gas(交易费)的高低来决定先确认哪笔交易。此时若攻击者更改奖励额度的交易给的交易费比较高,验证节点会先执行这笔交易,最终会导致答题人最后得到的奖励额度是调低的额度。而攻击者就以一个较低的成本买到了正确答案。

  以下代码演示了交易顺序依赖攻击的一个 POC:

  

2.5 

  区块链节点

  

  区块链节点是组成区块链的物理单元,是区块链网络健壮性的基础。由于区块链节点既有PC 也有云服务器,没有统一的安全防御等级,所以极易遭受攻击。对于攻击者来说,区块链节点本身就是一台传统的 PC 或服务器,那么传统的攻击 0day 攻击、弱配置攻击、DDOS 攻击都是有效的手段。特别是对于 POS 或者 DPOS 中的超级节点更是需要建立一套防范措施。

  

  此代码 Parity 多签名下的越权访问。delegatecall 获取 EX_FUNC 代码,运行于本合约上, 导致自身 owner 被修改。

  2.5.1 针对主机的攻击

  

  区块链节点本身可能是一个手机、PC、云服务器或者物联网设备,其本身的安全性依赖于 自身基线安全。传统的网络攻击对节点本身都是无差别的。构建节点的安全我们必须从根本上先解决主机本身的安全问题。

  

  2.5.2 DDOS攻击

  

  DDOS攻击是网络安全里的“灰犀牛”,是最具暴力美学的网络攻击行为。你知道它就在那里,但却躲不开也绕不过。攻击者只要掌握了足够的流量资源,在网络的世界里就可以决定生死。

  近年来捕获到的一些大流量的 DDOS 攻击其峰值都可达上百 G,任何单节点都难以对抗。成体系对抗的方法是先做流量清洗,再用大量的 CDN 节点引流,但是对抗的成本是远远超过被攻击者所能承受的。特别是现在很多 DDOS 都是 DRDOS 型,DRDOS 型大多数都是利用了一些具有流量放大特性的具有缺陷的网络协议来进行反射放大型的分布式拒绝服务。我们今年捕获到的几起 DRDOS 主要可以利用的有 NTP、QUIC、SSDP、IPMI,还有 MemCached。

  在区块链中如果攻击者攻击超级节点或者入口节点,那么会对整个 P2P 网络的稳定性带来很大的打击。

  

  如何对抗 DDOS 是一个世界性的难题。这是一场不对称的战争,因为真正的攻击者往往躲在未知的角落,不找到幕后黑手 DDOS 永无宁日。我们通过帮助客户解决了几次 DDOS 攻击, 积累了一些经验,但都不具备通用性。

  

  上图是我们某遭受 DRDOS 攻击客户的流量日志,确实也符合脉冲型逐级递减的反射模型。可以看到其峰值达到过500G/ 秒,客户放在高防护机房的主机只撑了2 秒就被打入了1.2T 的流量。几秒钟后主机前面的云盾防 DDOS 防火墙挂掉,之后主机挂掉,1 分钟不到整个机房挂掉。可见DRDOS 的威力。

  2.5.3 区块链节点加固

  

  节点加固主要从以下四个方面进行:

  (1)RPC 安全(RPC 服务尽可能不对外开放,端口随机)

  (2)配置安全(客户端正确配置)

  (3)网络安全(选择具有防 DDOS 功能的云,根据不同的防护量级,价格具有很大差异)

  (4)主机安全(补丁、关闭不必要的对外服务)

2.6 

  区块链参与者

  区块链项目的技术参与方(开发者、挖矿者),项目运营者(社区、企业、运维方),用户(数字货币、资产用户)等都是被攻击的对象。和传统安全一样,人的因素往往是安全体系木桶原理中的短板,无论是防御能力,还是安全意识都是存在可乘之机的。

  

  2.6.1 钓鱼攻击

  

  钓鱼攻击是针对被攻击者精心构造、设计出的针对客户端的一种攻击。下面一起分析三个钓鱼攻击案例:

  • 社交网络钓鱼

  2018 年 4 月,一波针对推特的钓鱼攻击开始了……

  

  V 神发了推文吐槽大家别上当送币的钓鱼。推文下面的评论来了个假 V 神说:朋友们,我会送出 5000 枚以太币,你只要在下面地址给我发送 0.4-2 枚以太币,我就给你 4-20 枚以太币...... 然后一群水军账号在下面评论,进行推波助澜,引导性欺骗。

  短短几天,该账户钓到了 40 枚以太币 ......

  此后几天就出现了针对币安的同样的推特钓鱼。

  • 前端渲染攻击

  攻击者通过CSS3 的一些特性盗取用户信息。攻击者通过诱导用户访问一个恶意页面,里面潜 入 iframe 加载用户 facebook 主页。然后用一个单像素图片,逐一放在 iframe 的每个像素上面, 再使用 mix-blend-mode 的 css 设置,根据渲染时间差异,算出原始像素的颜色,20 秒可以拿到用户名。同样经过精心构造的前端技术可以钓鱼 到用户的区块链交易所的敏感信息。

  

  • 私钥盗取

  Bitcoin Gold 用户被钓鱼事件:Bitcoin Gold 声称 Mytbgwallet.com 是安全的钱包,该网站要求用户上传私钥和 Recover Seed,用来为用户生成 Bitcoin Gold 钱包。结果该网站的 JS 代码中被攻击者潜入了恶意代码,先从用户端获取敏感信息,然后通过 cookie 传送,攻击者再还原出密钥和助记词,并控制用户账户盗取钱包。

  

  2.6.2 社会工程学攻击

  

  社会工程学攻击,是一种利用 " 社会工程学" 来实施的网络攻击行为,是一种“欺骗的艺术”。著有《欺骗的艺术》的凯文米特尼克是社会工程学的鼻祖,他开启了一个潘多拉的魔盒,该方法 主要通过与他人合法的交流,来使其心理受到影响,做出某些动作或者是透露一些机密信息的方 式。这通常被认为是一种欺诈他人以收集信息、行骗和入侵计算机系统的行为,能创造性地解决 很多技术所不能解决的攻击难题。

  2.6.3 钱包

  

  区块链钱包包括存储客户数字资产的地址或私钥的文件。冷钱包是离线的钱包;热钱包都是在线钱包使用比较多,比如电脑客户端钱包、APP 钱包、web 钱包等。对于用户来说, 钱包是最频繁使用、最重要的一个应用。我们对于涉及到钱包的信息要格外注意保护比如密钥、口令、助记词等。

  

  常见的几个钱包风险的点如下:

  • 钱包客户端 RPC API 的鉴权和访问控制

  

  区块链客户端本地都有 RPC API 接口,提供给用户和下层通讯,其中会涉及到转账等敏感操作,因此需要严格控制 API 的访问权限和鉴权工作,否则会造成不可预期的损失。

  经典案例:攻击者利用以太坊节点Geth/Parity RPC API 鉴权缺陷,恶意调用eth_ sendTransaction 盗取代币,从 2016 年开始持续时间长达两年,单被盗的且还未转出的以太币价值就高达现价 2 千万美金。

  - 黑客攻击流程:

  (1)全球扫描 8545 端口(HTTP JSON RPC API)、8546 端口(WebSocket JSON RPC API)等开放的以太坊节点,发送eth_getBlockByNumber、eth_accounts、eth_getBalance 遍历区块高度、钱包地址及余额;

  (2)不断重复调用eth_sendTransaction 尝试将余额转账到攻击者的钱包;

  (3)当正好碰上节点用户对自己的钱包执行unlockAccount 时,在duration 期间内无需再次输入密码为交易签名,此时攻击者的eth_sendTransaction 调用将被正确执行,余额就进入攻击者的钱包里了。

  • 钓鱼式攻击

  攻击者通过伪造客户端钱包、劫持客户端钱包(比如之前的 DNS 劫持)、替换客户端钱包等手段对客户实施钓鱼攻击。这种方式危害是最大的,受众也是最广的,针对钓鱼式攻击,我们可能要从客户端安全、传输安全、威胁情报以及提升用户安全意识等几个角度相结合才能得到很好的治理。

  • 密钥泄露

  钱包密钥的不当备份会导致密钥泄露。有人根据比特币的 wallet.dat 的文件名,写出了爬虫, 在 github、网盘、网站、论坛等处进行大规模爬取,造成了大量的 wallet.dat 泄露。

  • 在线钱包设计缺陷

  在线钱包如果存在设计上的各种缺陷,会给用户带来灾难性的损失。前段时间 IOTA 钱包被盗价值 400 万美元的币,原因就是 IOTA 钱包要求用户自己去生成密钥,许多用户使用了iotaseed.io 的在线密钥生成器生成密钥,但是这个钱包密钥生成器存在缺陷,导致最终生成的密钥是相同的:

  

  这段代码使用 "4782588875512803642" 这个固定种子加上一个递增计数器修改了主代码中的 Math.seedrandom 函数,这最终使得了 Math.random() 返回相同的可预测的一些列数,最终导致 IOTAwallet 种子生成了相同的一个密钥:

  XZHKIPJIFZFYJJMKBVBJLQUGLLE9VUREWK9QYTITMQYPHBWWPUDSATLLUADKSEEYWXKCDHWSMBTBURCQD

  这使得攻击者轻易的拿到了 IOTA 钱包的密钥……

  • 硬件钱包漏洞

  

  在流行的Ledger 硬件钱包中发现了两类漏洞:

  一类是“供应链漏洞”,产品供应商在发货前对钱包设备实施物理访问,可以通过植入自己   的种子而不是生成新的种子来欺骗设备。

  第二类是攻击者通过物理接触越狱设备,可以访问到 Ledger 保护的敏感数据。

  2.6.4 傀儡矿机

  

  攻击者利用一些漏洞获得被攻击者终端的权限,并植入挖矿代码,利用受害者的算力资源来牟利。全球最大 BT 网站海盗湾(The Pirate Bay)被爆暗藏加密货币 Monero(XMR门罗币的挖矿代码,影响了数以百万的用户。目前 Coinhive 是最流行的一个 JS 挖矿代码框架,被黑客广泛利用。下面就是某被注入了 Coinhive 代码的 web 页面,所有浏览该页面的用户都会在浏览器后台偷偷帮攻击者挖矿…… 目前 Coinhive 还提供了短地址转发服务,更增加了 JS 挖矿的隐蔽性。

  

  另外很多攻击者开发了一些浏览器扩展,里面植入了挖矿后门,Chrome 有 14 万安装量的扩展 SafeBrowse 在 3.2.25 版本中嵌入了 Conhive 的 JS 挖矿代码,会偷偷盗用用户 60% 的 CPU 算力。

  • 解决方案

  

  - 对于个人用户:

  通过浏览器扩展来拦截恶意挖矿的 JS 代码,比如 Chrome 的扩展 MinerBlock,Opera 内置的 NoCoin(加密数字货币挖掘保护),360 浏览器也推出了“挖矿防护”功能,或者使用FireFox 的 NoScript 套件等都可以从客户端拦截 JS 挖矿恶意代码。

  - 对于企业用户:

  https://gitlab.com/ZeroDot1/CoinBlockerLists/issues/1

  在该资源上下载相应 BlockerLists 的 ip 列表,部署到客户网络边界设备或者威胁情报数据库中,对可能存在的恶意矿机外联数据进行拦截。

2.7 

  区块链业务平台

      

  2.7.1 APT攻击

  

  由于区块链具有数据不可删除的特性,信息一旦被写入区块链后很难删除,所以区块链可以作为数据的一个永久性中转媒介。

  APT 攻击是高级持续的,是有明确攻击目的和有组织的攻击行为,是一种复合多种网络攻击手段的行为艺术。

  和普通的网络攻击相比主要有以下几个方面的特点:

  • 具有持续性

  一旦启动APT 攻击,可能会在攻击者未达目的的相当长的一段时间内都会持续的开展下去, 并且攻击方式会不断升级:从单点的钓鱼攻击到通过 0day 去拿核心服务器的权限,甚至会通过高成本的 DDOS 来配合攻击行为。

  • 具有隐蔽性

  从前期的数据收集、攻击的实施到收割成果都使用潜伏隐蔽的手段,并具有很强的反追踪意识。

  • 具有明确的攻击目的

  APT 攻击目的主要包括获取和破坏,而绝不会是为了技术验证。

  • 可以承受较高的成本

  无论是时间成本、人力成本还是为了突破目标收 0day 所需要的资金。

  经历过加密货币的几波大涨后,很多从事黑产的攻击者,都将矛头转向了区块链,他们集团作战:信息采集、高价拿洞、入侵潜伏、收割洗币……,形成了区块链行业特有的黑色产业链。这主要有三方面原因:

  • 黑产是一个高度讲究投入产出比的行业,加密货币的暴涨使得在该领域的黑产的回报率极高。

  • 数字货币尚处于灰色地带,很多国家未合法化,并不承认数字货币的价值,即使数字货币失窃,也不予立案。

  • 区块链行业成爆发式发展,就像一个暗河中的巨大金矿,具有足够的资金体量,全球光是数字货币交易所就有大大小小超过 9000 家,足够黑产持续性的开展下去。

  目前针对区块链交易所开展的 APT 攻击数不胜数,几乎是每天都在发生,造成的损失是巨大的。在对抗 APT 攻击方面,我们相对来说是处于一种不对称的对抗。我们只能从以下几方面进行预防和改进:

  • 建立一套强健的平台防护体系。无论是代码、运维还是人员管理都形成一套足够强健的体系。

  • 通过和专业的信息安全公司合作建立一套应急响应预案和针对 APT 攻击的预警、修复、追踪溯源的机制。

  • 通过区块链领域的威胁情报了解相应黑产攻击咨询的风向标,及时进行应对和自查。

  三. 区块链项目安全诉求与解决方案

3.1 

  区块链安全诉求分析

     

  3.1.1 参与者

  

  区块链的参与者主要包括加密货币和资产的用户。他们的安全诉求主要是围绕着自身的安全诉求,可能包括以下几方面:

  • 加密货币或数字资产的安全性

  • 钱包的安全性(口令、密钥、助记词、API key 的安全性)

  • 区块链使用环境的安全性(浏览器、客户端、APP、在线平台)

  • 用户个人信息和隐私(避免进行撞库攻击)

  3.1.2 技术参与方

  

  技术参与方包括项目开发者、矿工、矿池等。他们在整个区块链生态圈中处于不同的位置, 安全诉求不尽相同。

  • 开发者:

  项目架构安全

  代码安全(加密算法、共识算法、智能合约、客户端的安全)

  • 矿工和区块生产者:

  矿机的安全

  收益安全(算力平稳、产出稳定、消耗产出比合理) 

  节点的安全

  • 矿池:

  算力安全(算力平稳、算力检验算法安全) 

  管理安全(避免矿工扣块)

  矿池平台安全

  3.1.3 运营方

  

  项目运营方包括社区、资方、企业及运维方。

  • 社区:

  治理机制安全(公平、效率、平衡)

  资产安全

  • 资方、项目企业:

  项目规划、建设安全

  项目平台安全

  • 运维方:

  项目平台安全

  安全管理

3.2 

  区块链安全解决方案

   

  3.2.1 区块链合约安全开发

  

  安全编码规范、代码审计方法、代码测试和 review,三者关系如图:

  

  三者是一个不断闭环的进化关系:我们通过代码测试和 review 发现合约的漏洞,从中总结出一些漏洞的特征;将这些漏洞特征转化成相应的代码审计方法,提高代码审计的效率和风险覆盖率;根据代码审计的方法总结出其中对应的安全编程规范,指引智能合约开发者开发出更安全更高效的代码;更好的安全编程规范极大的降低了代码测试和 reivew 的工作量,形成一个良性的闭环。

  • 一些合约安全开发规范例子:

  

  (1)在调用外部函数之前,先完成内部函数状态的处理与更新。

  (外部函数调用需避免出现“竞争条件问题”:调用外部函数最大的危险就是调用行为可能   被劫持。解决方案:必须调用外部函数代码,最简单的方式就是保证在调用外部代码前已经完成了内部状态的处理和更新。)

  (2)调用了外部函数的函数,也被认为是不安全的函数。调用时遵循规范(1)。

  (3)标记不受信任的函数调用,如(2)中描述的函数,处理相关调用时要格外小心。

  (4)明确标明状态和函数变量的可见性。

  (5)在调用transfer的场景下,尽量使用require/assert 或者if/else revert/throw。(避免返回值异常判断出错)

  (6)合约处理 unit 计算一定要用 SafeMath,即使用了 SafeMath 依然要严格检测是否会发生上溢和下溢,避免发生遗漏。在合约中要严格控制 unit 型变量更改状态的权限。避免任何一个用户都有权限调用一个函数更改一个 unit 变量的状态。

  - 例子:

  BEC 智能合约整型溢出漏洞,使用了 SafeMath 的 add 和 sub,但是唯有一处没有使用 mul,导致溢出还是发生了。

  

  • 一些合约代码审计的例子:

  

  (1)整数溢出

  智能合约中危险的数值操作,可能导致合约失效、无限发币等风险。

  (2)越权访问

  智能合约中对访问控制处理不当,可能导致越权发币风险。

  (3)信息泄露

  硬编码地址等,可能导致重要信息的泄露。

  (4)逻辑错误

  代理转账函数缺失必要校验,可能导致基于重入漏洞的恶意转账等风险。

  (5)拒绝服务

  循环语句、递归函数、外部合约调用等处理不当,可能导致无限循环、递归栈耗尽等拒绝服务风险。

  (6)函数误用

  伪随机函数调用和接口函数实现问题,可能导致可预测随机数、接口函数返回异常等风险。

  • 建立一套代码测试流程

  

  3.2.2 区块链业务安全

  

  • 区块链项目上线前进行网络安全架构设计、节点安全标准规范设计。

  • 对项目中的代码、系统平台进行反复严格的测试和审计。

  • 建立业务风控系统,囊括业务的各个环节,实时的监控项目整体情况,对异常行为进行检测和预警。

  • 建立安全管理制度。

  • 对员工定期进行安全培训,提高安全管理和运维意识。

  • 建立用户安全使用导引,提高用户的安全意识。

  3.2.3 区块链用户安全

  

  • 资产安全:备份好自己的钱包,保护好自己的口令、密钥、助记词、API Key 等。

  • 环境安全:加强自己电脑的安全,安装杀毒软件并及时更新补丁。

  • 通讯安全:不使用不安全的 WIFI、VPN 或者代理服务器,保证通讯不被劫持。

  • 验证安全:对交易平台上的账户开启多重验证,密码验证 手机验证 Google 验证。

  • 设备安全:矿工加强自己所选用的矿机主机的安全性。复杂口令 安全配置。

  3.2.4 检测与响应

  

  区块链项目是边界模糊的一个网络模型,既有中心化的业务平台,也有去中心化的分布式网络,这就导致边界防护的网络安全架构是无法满足区块链项目的安全需求的。对区块链企业来说最有效的安全架构就是建立检测与响应的安全架构模型 :

  • 针对业务系统建立一套风控系统,检测异常用户行为、交易、网络行为,并实时进行报警和业务应急处置联动。

  • 根据自己的业务情况建立风险等级模型,根据不同的风险等级建立相应的业务应急处置预案,对区块链来说处置应急事件的时间窗口可能只有几个小时甚至是几分钟。

  • 在新业务上线前协同网络安全企业对代码、节点、架构进行审计。

  • 与网络安全企业建立定期风险评估与网络突发威胁响应机制,形成良好的外部协作治理氛围。

  • 对运维和开发人员定期进行培训,并建立一套安全管理制度。

  <  参考阅读  >

  1. 哈希长度扩展攻击以及 HashPump,

  https://blog.csdn.net/kajweb/article/details/77435885

  2. Dual_EC_DRBG backdoor: a proof of concept,

  https://blog.0xbadc0de.be/archives/155

  3. secp256k1,

  https://en.bitcoin.it/wiki/Secp256k1

  4. NP 问题,

  https://baike.baidu.com/item/NP问题/2860567

  5. Blockchain can be Blocked(比特币网络通讯底层漏洞详解),

  http://8btc.com/thread-157922-1-2. html

  6. 以太坊钱包 Myetherwallet 遭受 DNS 劫持 ,

  https://www.dns.com/news/788.html

  7. 贿赂攻击者模型浅谈 ,

  https://wallstreetcn.com/articles/3256339

  8. 区块链共识 ,

  http://news.blockchain.hk/consensus/

  9. 区块链安全分析报告(三),

  http://www.qukuaiwang.com.cn/zhuanlan/fenlei/135210.html

  10. CSS Is So Overpowered It Can Deanonymize Facebook Users, 

  https://www.bleepingcomputer.com/news/security/css-is-so-overpowered-it-can-deanonymize- facebook-users/

  11. 以太坊生态缺陷导致的一起亿级代币盗窃大案 ,

  https://mp.weixin.qq.com/s/ Kk2lsoQ1679Gda56Ec-zJg

  12. Poisonous Seeds,

  https://news.bitcoin.com/iota-attacked-for-subpar-wallet-security- following-4m-hack/

  13. A Crypto Miner for your Website,

  https://coinhive.com/

  14. 美链 BEC 合约漏洞技术分析 ,

  https://www.cnblogs.com/tinyxiong/p/8949683.html

  极矛之端   铸盾之御

  渗透测试 / 威胁响应 / APT防御 / 

  物联网安全 / 区块链安全

版权信息
作者:NEO
来源:端御科技

关于我们

联系我们

作者进驻

手机版

Copyright © 2013 比特巴 www.btb8.com
始建于2013年,提供比特币 区块链及数字货币新闻、技术教程、测评、项目周报、人物等资讯
本页面提供的是区块链新闻资讯,区块链(Blockchain)是比特币的一个重要概念,它本质上是一个去中介化的数据库。