摘要: “零手续费”攻击方式指的是在偷渡漏洞中,攻击者在被攻击节点构造gasPrice为0的交易,等待用户解锁账户签名广播。攻击者同时设置一个恶意节点,用于接收这笔交易。攻击者将符合条件的交易打包,就可以实现0手续费完成转账。
然而这样的文字,现在却也并不多,而且‘拾荒’的人们,也还能从中检出东西来。
——真·鲁迅
导语:自从区块链的概念广为流传开始,就可以在各个社群见到专注于空投的区块链狂热者的身影。他们牛市不忘初心,熊市依然坚持,在有着“币圈一天,人间十年”的区块链领域边缘始终十年如一日地收集着各种零散的币种。
近期,这种广受币圈欢迎,新人老韭最爱的薅羊毛手段直接被黑客“复制”了。
笔者注意到,业内出现了一种最新黑客攻击方式——“拾荒攻击”。顾名思义,首先从字面上进行解释,“拾荒”传递了一种收集零碎,不被需要但还有使用价值的物品概念;而“攻击”则直接说明是一种黑客行为。
一、拾荒攻击”是什么?
一个账号为【0x957cD4Ff9b3894FC78b5134A8DC72b032fFbC464】的黑客利用以太坊JSON-RPC接口,在公网中扫描开放的RPC端口后,构造高手续费的交易请求,一旦用户解锁账户,便会将用户余额转至攻击者的账户或攻击者创建的合约账户。
以上是“拾荒攻击”的具体案例。
在后偷渡时代,攻击的形式趋于多样化,利用的以太坊特性越来越多,攻击方式趋于完善。除了发现的三种攻击方式:离线攻击、重放攻击和爆破攻击,现在又出现针对以太坊JSON-RPC接口的“拾荒攻击”。知道创宇404区块链安全研究团队对“拾荒攻击”进行过以下释义:
攻击者或求助于矿工,或本身拥有一定算力以获得将交易打包进区块的权利,并通过构造0gasPrice最终获取到余额不足以支付转账手续费或勉强足够支付手续费节点上的所有以太币或代币。
通俗来说,在“拾荒攻击中”,黑客对攻击的目标账户也做了细分处理。他们选择 “垂直攻击”那些不够或刚好后支付gas费的以太坊钱包账户。
二、两个问题看用户对“拾荒攻击”的意识
笔者针对“拾荒攻击”进行的市场调查反馈,该调查主要围绕以下两个核心问题展开:
1、如果钱包里的以太坊不足以支付矿工费,你会担心里面的数字货币的被盗吗?
2、你有注意过加密钱包里的零钱安全吗?
调查中发现,在用户凭经验认知的钱包安全概念里,没有足够的以太坊是不能进行转币操作的。火币区块链大数据的8月初报告显示,平均手续费下降19%至0.0017ETH,处于两个月最低。
意味着正常情况下,用户的钱包账户至少存有0.0017ETH才能进行转帐手续。由于以太坊区块大小限制问题,选定的gas费用越高,转账次序越优先(转账速度越快)。因此当用户不足以支付gas费用的情况下,大多数人认为自己的账户就是安全的。
还有第二个问题对应的情况,也是和gas相关。有过交易经验的用户会发现,自己的每一次转账都是不能将钱包里的全部转移,总有那么点剩余。有时出于转币的成本(gas)过高的考虑,用户会选择对账户里的Token不做处理。这些存放着零星Token的钱包账户,也成为黑客“选定”的攻击目标。
三、“零手续费”薅羊毛怎么回事
经统计,从2017年6月起,陆续有748个账户总计24.2eth被零手续费转账,黑客针对以太坊JSON-RPC进行“拾荒攻击”一直在持续。该攻击依靠零手续支付将用户钱包残币收割干净。
黑客除了攻击存有以太坊的账户,也没有放过只存放有智能合约发行的小币种账户,可见要将“羊毛”薅到底的决心。通常在被盗账户没有以太坊的情况下,按理是不能支付gas进行转账的。但是黑客可以通过零手续费达到这个目的。
“零手续费”攻击方式:在偷渡漏洞中,攻击者在被攻击节点构造gasPrice 为 0 的交易,等待用户解锁账户签名广播。攻击者同时设置一个恶意节点,用于接收这笔交易。攻击者将符合条件的交易打包,就可以实现 0 手续费完成转账。
攻击者可以利用拥有的多个矿池算力,将攻击账户的多种Token以单笔小额转移到相应的账户中。这种方式能在不需要手续费的情况下同时攻击多个账户和多种合约。
另外,在0 gasPrice中,攻击者更多的是对合约发行的Token进行转账请求,将用户账户中的token转移至合约拥有者账户中。
四、说好的Gas负反馈的安全机制呢?
以往的认知中,以太坊中的Gas机制GasUsed*GasPrice可以计算用户占用节点计算资源需要消耗的手续费。GasUsed可以理解为资源用量,GasPrice可以理解为消耗资源的单价。
说到以太坊的Gas机制又不得不提到虚拟机(EVM)。EVM是以太坊在区块链上的运行环境——以太坊网络中的节点都会运行EVM,并在EVM上执行消耗资源的交易等程序。
其中,矿工可以在交易程序中收取一部分的费用作为报酬激励,一般采用POW(工作量证明)机制。而这个工作量是由EVM中执行的代码决定的,我们称之为gas。
接着说到代码。代码由各种基础指令构成,每条指令根据其消耗定义出了一个gas值,所有指令的gas之和就是交易需要消耗的gas。因而一整套完整的交易中,是需要支付一定量的gas给矿工才能完成的。
以上是Gas机制中几个重要的概念关联逻辑。
Gas机制在实际的运行中,也曾经作为经济手段保障网络安全。当网络面对分布式阻断攻击(DDos)时,若时间节点内发起的交易量过大,基于以太坊目前的性能不能迅速处理完全,就会造成系统拥堵,致使基础的gas增加负反馈减少交易的发生,一定程度上能保障网络的安全运行。
但是“拾荒攻击”的出现已经说明Gas机制已逐渐不能承担起保障网络安全运行的重任,因为以太坊自身的漏洞问题凸显,矿工面临的修补工程更加浩大。
五、未来可能实现的ETZ可否阻止“拾荒攻击”
去年年底就有以太坊“零手续费”的概念被提出,以太坊矿工们打算分叉出零手续费的EtherZero(ETZ以太零)。而“拾荒攻击”的能够发起是因为利用了“零手续费”方式,那么换个角度来看,若以太坊不再需要手续费,是否就能阻止“拾荒攻击”?
ETZ团队号称拥有来自不同国家的20多位专业Dapp开发者。他们舍弃了以太坊一贯的gas手续费系统,在实现零手续费的同时,还设计了非常实用和详细的防攻击机制。
ETZ模式中,矿工没有手续费作为激励,但据说可以依靠ETZ的币价上涨来覆盖其挖矿成本。按照ETZ的设想,即使不存在手续费,但矿工生产区块仍然会得到固定的ETZ奖励。
按照产品路线图,ETZ目前还处于原计划的2018年2季度:完成主节点Mster Node在Mainnet运行,实现实时交易和较高TPS。
根据最新的以太零项目周报(2018.8.13-8.19)显示,ETZ团队在技术层面完成了主节点的搭建、优化、升级、维护等一系列工作,完成了区块链浏览器增加主节点出块和收益统计的查询和部分主节点收益异常的问题排查。同时还对钱包最了修复和更新。
ETZ依旧采用了Gas机制,只是不会扣除用户产生的手续费。而“拾荒攻击”采用的零手续费交易,虽然不能激励矿工,但它在代码验证过程中依然是合法的。
零手续费交易,通常情况下只有发起者的txpool可以接收,其余节点无法通过同步此交易。如若需要,必须进行修改geth源码等操作。虽然这笔交易无法进入其他节点的txpool,但对于含此交易的区块,可以达成共识。
因此综上所述,ETZ的“零手续费”生态没有修正Gas机制自身的漏洞,“拾荒攻击”依旧能发起攻击,或者说是更加容易。
六、面对“拾荒攻击”我们能做些什么
由于“零手续费”交易是建立在其他攻击手段之上,因而防御手段应该定位在之前json-rpc接口利用。
对于有被偷渡漏洞攻击的痕迹或可能曾经被偷渡漏洞攻击过的节点,建议将节点上相关账户的资产转移到新的账户后废弃可能被攻击过的账户。
建议用户不要使用弱口令作为账户密码,如果已经使用了弱口令,可以根据1.2节末尾的内容解出私钥内容,再次通过 geth account import 命令导入私钥并设置强密码。
如节点不需要签名转账等操作,建议节点上不要存在私钥文件。如果需要使用转账操作,务必使用 personal_sendTransaction 接口,而非 personal_unlockAccount 接口。
面对黑客攻击,普通的用户完全没有还手的能力。而本应该站在用户一方的矿工,若是联手黑客不再诚实地工作,动起盗币的心思,刚起步的区块链网络更是不堪一击。区块链的良性生态发展除了需要剔除劣质和空气项目,还需要对已有的生态安全用心维护。
尤其是维护公链的矿工们职责更大,就像区块链依靠不可篡改的真实性溯源问题,若链上的信息从源头就是崩坏,生态必然扭曲。妖者,必亡。
(以上部分资料参考自 @知道创宇404区块链安全研究团队)
(作者云链唐人财经,内容来自链得得内容开放平台“得得号”;本文仅代表作者观点,不代表链得得官方立场)