(此篇文章主要用于哈尔滨工程大学计算机学院2021年区块链技术课程的选做部分,作者:孙润泽,刘子健)
经过这学期区块链的学习,很荣幸在这里跟大家做分享工作,今天带来的是区块链的安全分析与介绍,我将用简单易懂的方式让大家了解它。区块链慢慢进入我们的视野,越来越多人参与区块链研究当中,但很多人没有安全知识,安全意识薄弱,很容易让攻击者有空可钻,今天我就带大家看看以太坊情人节事件。
以太坊(英语:Ethereum)是一个开源的有智能合约功能的公共区块链平台。通过其专用加密货币以太币(Ether,又称“以太币”)提供去中心化的虚拟机(称“以太虚拟机”Ethereum Virtual Machine)来处理点对点合约。
以太坊的概念首次在2013至2014年间由程序员Vitalik Buterin,受比特币启发后提出,大意为“下一代加密货币与去中心化应用平台”,与买卖股票的证券交易所类似。
以太坊数字货币平台主要遵守以下两个原则。
以太坊协议将尽可能简单,即便以某些数据存储和时间上的低效为代价。
没有“特性”是以太坊设计哲学中的一个根本性部分。取而代之的是,以太坊提供了一个内部的图灵完备的脚本语言以供用户来构建任何可以精确定义的智能合约或交易类型。
这是一起自动化盗币的攻击行为,攻击者利用以太坊节点 Geth/Parity RPC API 鉴权缺陷(RPC:一种计算机协议,以太坊RPC结点是以太坊与其他系统交互的窗口),恶意调用 eth_sendTransaction 盗取代币,单被盗的且还未转出的以太币价值就高达现价 2 千万美金,还有代币种类 164 种,总价值难以估计(很多代币还未上交易所正式发行)。
综合受害者情报、Reddit 资讯及蜜罐日志分析,回溯攻击行为可能为:
动作 | 概率 |
---|---|
全球扫描 8545 端口(HTTP JSON RPC API)、8546 端口(WebSocket JSON RPC API)等开放的以太坊节点,发送 eth_getBlockByNumber、eth_accounts、eth_getBalance 遍历区块高度、钱包地址及余额 | 24% |
不断重复调用 eth_sendTransaction 尝试将余额转账到攻击者的钱包 | 32% |
当正好碰上节点用户对自己的钱包执行 unlockAccount 时,在 duration 期间内无需再次输入密码为交易签名,此时攻击者的 eth_sendTransaction 调用将被正确执行,余额就进入攻击者的钱包里了 | 42% |
简单的说,以太网在高频交易中可以设置一段时间无需输入密码,时间长短由用户自己制定,如果黑客正好在这个时间发出余额转移指令,以太网账户就自动执行该操作,从而实现钱包转移。
国内顶尖的区块链安全团队慢雾安全团队在对攻击者钱包地址进行细致的分析,得到如下主要攻击时间线:
时间 | 具体动作 |
---|---|
2016/02/14 03:59:14 PM | 第一次 IN(进账),这天是情人节 |
2016/02/16 06:33:30 PM | 第二次 IN,时隔 2 天,猜测自动化攻击程序首次上线 |
2016/05/19 07:46:33 PM | 第一次 OUT(出账),此时共 IN 51 笔 |
2016/07/20 06:35:57 PM | 第二次 OUT,此时共 IN 57笔 |
2017/05/11 06:34:35 PM | PM Shapeshift(知名交易所) IN 7 笔,跨度 71 天 |
2017/06/10 02:39:53 AM | OUT 最后一笔,此时共 IN 约 207 笔 |
2017/06/21 07:46:49 AM | f2pool(知名矿池) IN 36 笔,跨度 4 小时 |
这种时间线的跟踪可以侧面辅助分析攻击者的行为痕迹。
我们从上面提到过的攻击时间线来看,攻击者其实很不一般,这种潜伏的攻击发生在以太坊历史上第一个知名黑客事件之前,其实当时是以太坊没被市场正式认可的时期便可以看出攻击者是非常早期的以太坊研究者,也很懂黑客技术,攻击者在实战过程中也在不断优化这套工程 。
距这次盗币事件被发现至今已有两年之久,但攻击者的脚步似乎并没有停下来的意思。2018 年 3 月 盗币事件被披露,截止到2018年7 月 1 日,攻击者行动并未停止。累计盗取了 47865 枚 ETH,价值高达现价 2 千多万美金,还有总量过百亿的各类 Token。
我们该如何防御这种攻击呢?
1、更改默认的 RPC API 端口
2、更改 RPC API 监听地址为内网
3、配置 iptables 限制对 RPC API 端口的访问
4、账户信息(keystore)不要存放在节点上 (因为账户不在节点上,所以就不会用到 unlockAccount 了)
5、私钥物理隔离(如冷钱包、手工抄写)或者高强度加密存储并保障密钥的安全
这起利用以太坊 RPC 鉴权缺陷实施的自动化盗币攻击,已经在全球范围内对使用者造成了非常严重的经济损失。
你以为这就结束了么?
该事件还有新的隐藏攻击方式!
以太坊节点的 RPC 接口开放,但是账户没有 ETH (此时黑客已经通过扫描发现目标);
黑客立即构造交易并签名(签名设置的金额为 X,nonce 设置为当前的 N+1,N+2,…,N+N),可以构造多个;
以太坊节点发现自己的问题,关闭 RPC 端口;
以太坊节点认为自己已经安全,开始往账户转入 ETH;
其实此时攻击者通过程序自动化实时监控发现你的转入,立即开始广播之前 RPC 开放的时候签名好的信息;
此时攻击完成。
这种攻击手法非常隐蔽且真实存在,我们只能见招拆招。
对此提醒大家:请勿将私钥导入节点,如不得不导入,请先将 RPC 改成监听内网或使用 iptables。
屏蔽外部访问:针对已导入私钥的节点,安全起见建议暂停使用,把相关资产安全转移后废除这个私钥文件,并在其他隔离机器里重新生成新的私钥,未来采用私钥签名交易+节点广播交易的方式来进行转账操作。
对 RPC API 相关模块功能进行进一步分析,还会发现一些潜在的安全风险,也是需要注意的
比如:如果 RPC API 启用了 personal 模块,就可以通过 personal_unlockAccount 方法爆破账户密码,假如爆破成功,就可以一次性实现解锁 + 转账。如果 RPC API 启用了 miner 模块,就可以通过 miner_setEtherbase 方法修改挖矿的钱包地址。
从防御分析角度,我们还发现,Geth 等的日志机制不完善,无法记录 RPC API 请求的来源 IP(配置 --debug、–verbosity 5 均无效),导致直接在被攻击的以太坊节点上取证溯源攻击者 IP 是一件很麻烦的事。
虽然以太坊本身的健壮性已经经受住考验,但是安全是一个整体。通过这个事件我们可以看出以太坊生态的一些安全缺陷,有的安全缺陷可能会被认为这是一种机制,需要使用者注意,但这个对使用者来说做安全的门槛太高。高门槛的安全一定是会更容易滋生大攻击事件。
通过这个事件的追踪调查及攻击手法的完整思考,我们越发意识到网络空间遵循黑暗森林法则。我们仔细思考一下这起持续时间之久且现在还在活跃的攻击的所有细节,如果我们是攻击者,我们一个脚本工程就可以轻松拿下全球数以万计,甚至百万千万的数字资产。
下面我说一下自己的感受吧 我分享区块链安全性问题的原因是在区块链中安全的重要性永远是第一位的 ,因为几千亿美金的代币都在区块链上,绝大部分区块链是开源的,谁都可以研究开源代码,稍有不慎无数的代币可能会没了。
著名的交易所都发生过被攻击的事件,并且每次的安全事故都很严重,很多人账户可能一夜之间归零。区块链的未来十年的安全运行毫无疑问是这个行业的定海神针,是如同神一般的存在,btc这么多年还在运行,大家有没有感到奇怪,为什么最早的还在运行,新的项目都是升级改版过的反而问题很多,因为任何行业都在提升,出问题是很正常的,不出问题才是例外,其实由于区块链的特性,对安全的要求极高,如何满足更高级别的安全,其实才是区块链开发应用前提 。