“伪造权益”攻击,量子链Qtum等加密资产不幸中招

来源: 作者:Decentralized Systems Lab 2019/01/28

受到 “伪造权益” 漏洞影响的共有15个团队。其中,有5个团队承认了这一漏洞,有3个团队仍在调查当中,3个团队反驳了这一漏洞(表示已实施了减轻影响的措施),另外有4个团队没有做出回应。

本文由财经网链上财经翻译自Medium,不代表财经网链上财经立场。

近日,伊利诺伊大学厄巴纳-香槟分校Decentralized systems Lab 在Medium发布安全研究文章,称有26个POS共识机制的区块链受到 “伪造权益” 漏洞的影响:

1. 这个漏洞不能用来盗取数字资产,但可以使节点崩溃。

2. 2018年10月份发现并开始通知开发团队。

3. 数字资产克隆比特币代码,然后把PoW改成PoS,并使用了PoSv3算法的至少26个币种。

4. 攻击的方式是向一个节点发出大量的无效块,用光它的内存和硬盘。由于PoW容易检测无效块,所以比特币可以防御此类攻击,但PoS检测比较复杂,所以这些PoS币种没有检测。

5. 受到影响的共有15个团队。其中,有5个团队承认了这一漏洞,有3个团队仍在调查当中,3个团队反驳了这一漏洞(表示已实施了减轻影响的措施),另外有4个团队没有做出回应。

原文链接:https://medium.com/@dsl_uiuc/fake-stake-attacks-on-chain-based-proof-of-stake-cryptocurrencies-b8b05723f806

作者:Decentralized Systems Lab 编译:LornaQ

基于权益证明(PoS)的数字资产,尤其是基于链上PoSv3(权益证明第三版本)的数字资产与比特币相似,都是使用UTXO模式和最长链共识机制。区别在于将权益证明替代了工作量证明(PoW)。

PoS潜在的益处是减小环境影响,更好地抵御51%攻击。事实上,很多数字资产都借鉴过比特币的白皮书(至少从比特币代码衍生过来的),只是转换为权益证明罢了。然而,有些项目在借鉴过程中设计了一些不安全因素,导致新代码库中出现了母代码中未出现的漏洞。

我们将这些漏洞称为“伪造权益”攻击。这些漏洞起作用是由于启动PoSv3时,在提交资源(磁盘和RAM)之前没有对网络数据进行充分验证。这会导致没有持有太多权益(通证)的攻击者(在某些情况下甚至不需要通证)可通过伪造数据填充被攻击者的磁盘或RAM,来导致其节点崩溃。我们认为,所有基于UTXO和最长链PoS模型的数字资产都很容易受到这种 “伪造权益”的攻击。本末列出了经研究人员调查并认为会受影响的加密货币列表。

虽然漏洞本身看起来是很简单的,但要完全修复这一漏洞很棘手,迄今为止各项目方采用缓解方案,以链分裂风险作为代价(稍后将详细介绍)。

背景

基于PoS机制的链是如何工作的?

PoS挖矿:

与工作量证明(PoW)挖矿类似,PoS挖矿也包含将区块头的哈希值和难度目标进行比较。PoS的高层次目标是确保每个利益相关者挖出下一个区块的几率与他们持有的通证数量成正比。为了实现这一点,在基于PoS的区块链中,算力不仅取决于区块头,还取决于利益相关者投入区块中的特殊“Coinstake”交易中包含的通证数量。检查 PoS取决于:

1) coinstake交易,

2) coinstake交易中所使用的UTXO。

工作量证明(PoW)在保护区块验证资源方面扮演的角色:

众所周知,PoW在比特币共识中起着至关重要的作用。但是,PoW也起到略微不重要的作用:即保护访问节点有限资源,例如磁盘、带宽、内存和CPU。在分布式的加密货币网络中,点对点的节点之间不需要建立信任。因此,为了防止资源耗尽攻击,比特币节点在启动更多资源,例如将区块存储在RAM或磁盘上之前,首先会检查 PoW是否有接收到任何区块。然而,检查PoS比验证PoW要复杂得多,且对环境也敏感得多。因此,很多基于PoS的链在实现过程中,忽略了适当的验证步骤。

为了理解如何导致资源耗尽漏洞,我们首先需要理解在验证之前区块是如何被储存的。一个节点不仅需要实时追踪最长链,还需要追踪链的分叉数(其中任何一个都可能成为最长链,在这种情况下,节点需要“重新组合”才能切换到它)。例如,在一次拙劣升级中、一次双花攻击(等51%攻击)或在一次临时网络分区期间都可能发生上述情况。

验证不在主链上的区块尤为困难。要完全验证这些区块,你需要获取前一区块的一组未用通证(UTXO)。比特币将UTXO集保留在了最佳链的当前尖端,而不是在之前的的其他区块。有两种主要方法可以完全验证分叉上的区块:

“回滚”当前视图(UTXO集)到分叉开始前的点 或存储所有早期区块的UTXO集副本。

比特币的代码库不支持选项2,即使这样做,也会增加额外的存储成本(比特币节点性能依赖于大量删减不需要的数据)。选项1正是比特币代码库当前处理重新组合的方式。但是,这种方式花费昂贵,因此回滚和完全验证将延迟到最后一个可能的时刻,此时分叉中的工作量证明已经大于当前的主链。因此,当对等端第一次收到一个不是最长链的区块或区块头时,将跳过完全验证,并将该区块保存到本地存储。

在区块存储到磁盘之前,比特币代码库基于PoW执行一些初步验证(但忽略交易)。初步检查仅依赖于前一个区块头和当前区块头,因此节点可以非常快速地执行此操作。这个防御措施是有效的,因为通过生成有效的POW是非常昂贵的。例如,虽然我们可欺骗比特币节点在磁盘上存储一个无效的区块,但进行这样的资源耗尽攻击代价是非常昂贵的。

PoS中类似的初步检查,是验证coinstake交易,并检查通过当前一个区块的内核的哈希值时,它是否通过难度目标。计算coinstake 交易的哈希很容易,困难的是检查coinstake交易的输入UTXO是否有效和并未被使用,因为此步骤需要检查UTXO集,正如上述提到的,该集对于过去的区块是不可用的。由于完全验证coinstake 交易十分困难,大多数基于PoS 机制的链提供了启发式或近似检查。结果表明,这些近似值往往不充分,可被加以利用。

漏洞#1: “我不认为它不是权益”

当我们第一次做调查时,我们发现有5种加密货币:Qtum(量子链)、Particl、Navcoin、HTMLcoin以及Emercoin表现出这一漏洞:在将区块提交到RAM或磁盘之前,它们根本没有检查任何coinshare交易。这五种加密货币的共同点是,它们采用了比特币的“区块头优先”功能,其中,区块传播被分成两条单独的消息,即区块和区块头。节点只有在区块头通过PoW检查才会请求区块,而且它是最长(或更长)链。由于coinstake交易只存在于区块当中,而不存在于区块头中,因此节点无法单独验证区块头。与之相反,它直接将区块头存储到内存中的数据结构(mapBlockIndex)。因此,任何网络攻击者,即使他们未持有人和通证,也可以填充被攻击的节点的RAM

这种攻击的第二种变体,可针对相同的代码库执行,尽管它的工作方式略有不同,且目标是不同的资源(即被攻击对象为磁盘而非RAM)。值得注意的是,涉及磁盘的攻击对被攻击者伤害更大,如果RAM已满,节点崩溃,重新启动即可。但是,如果磁盘已满,则需要手动干预(例如,运行外部脚本以清除磁盘上的过时区块)。

当接收区块而不是接收区块头时,执行的初步检查是不同的。理想状态下,由于区块确实包含coinstake交易,因此节点软件应在将区块提交到磁盘之前检查这个coinstake交易。但是,如上所述,如果区块位于分叉上,那么节点无法访问coinstake交易所使用的UTXO。由此这些代码库并不能验证coinstake交易。

这些漏洞中的任何一个,都可以在不持有通证的情况下对加密货币进行攻击。

漏洞#2:伪造权益攻击

通过跟踪这些代码库的脚本,我们注意到,在将比特币的“区块头优先”功能合并到PoSv3代码库时,会引入漏洞#1。攻击不适用于早期版本的PoS加密货币,因为在磁盘上存储区块之前,还需要进行两次额外的初步检查:

检查正在使用的输出是否存在于主链当中; 检查PoS内核哈希是否满足难度目标;

完成检查1需要在交易数据库(TxDB)中进行查找,该数据库追踪当前主链中所有的交易。换句话说,初步验证优于不验证,但仍然劣于完全验证。

问题A:检查1可确保通证的存在,但不能确保它未被使用。

问题B:即使我们验证主链分叉上的区块,coinstake交易也会针对主链本身的TxDB进行验证。

基于问题A,我们也找到了这类检查的方法漏洞,我们将这种攻击称为“花费权益攻击”。为了绕过检查1,我们使用了一个输出,在节点看来该输出易被占用。为了绕过检查2,我们需要挖掘一个通过难度目标的有效区块,而这一步骤需要大量的权益。然而,我们可通过不完全验证,利用“权益放大”的技术生成任意数量的表观权益。

权益放大技术

为了通过少量的权益实施攻击,攻击者必须放大其表观权益。表观权益是指总的候选权益输出,甚至是已花费的权益输出。如果攻击者以数量为k的UTXO开始,那么攻击者可以创建多笔交易,将通证发送给攻击者,如下图所示。只有UTXO(n+1)才允许进行权益增值,但是由于检查2,我们可以从1到n+1的所有UTXO进行权益增值,从而使表观权益增加为n*k。由于攻击者可以持续通过这种做法来增加其表观权益,从而增加了找到PoS区块的几率。

火狐截图_2019-01-28T04-17-06.572Z

例如,即使在系统中只拥有0.01%的权益,攻击者只需要通过5000笔交易来挖具有50%的表观权益权力的区块。在攻击者收集了大量表观权益之后,他可使用新收集的表观权益输出继续挖PoS区块,最后,攻击者用无效区块填充被攻击者的对等节点磁盘。例如,攻击者可以从数字资产交易所购买一些PoS币,通过自我花费扩大表观权益,然后将这些通证卖给交易所,并在之后的任何时候执行攻击。攻击者唯一要付出的就是交易费用而已。

协调漏洞披露

我们在Particl 和Qtum(量子币)中验证了攻击#1的存在,随后,我们从coinmarketcap.com(2018年8月9日)按市值排序,收集了已知加密货币的列表,并挑选了PoS共识的加密货币。我们研究了那些从比特币代码库分叉出去的PoS币种,共计26种,其中发现5种PoS币受到该漏洞的影响,它们分别是Qtum(量子币), Navcoin, HTMLcoin, Emercoin和Particl,而我们的攻击方式对其余的PoS币似乎不起作用。为了确认漏洞,我们在五个受影响的代码库中分别实施了攻击。我们利用比特币软件中现有的测试套件,特别是regtest模式,该模式支持模拟时间戳且易于创建区块,以及基于python的测试节点(基于比特币测试框架),该节点可通过攻击者行为进行扩展。我们使用Docker容器将这些测试和受影响的哈希值,打包到一个再现性工具包中,而这个工具包,我们可以轻松地将其分享给五个受影响的开发团队,以此作为漏洞公开的一部分。

随后,我们分析了未受影响的加密货币不易受到漏洞#1的攻击影响的原因,意识到漏洞#2也同样严重(需要少量的权益),且更普遍。在计划一项协调披露时,我们认为向经济活动不活跃和开发团队不活跃的加密货币披露该漏洞可能会适得其反(例如,风险在于,如果漏洞被泄露,在其他人有时间部署缓解措施之前,它可能会影响其他人)。最终,我们决定将注意力集中到15个最有可能受到攻击的加密货币(前200名的加密货币)。

值得注意的是,这些代码库中的大多数没有使用regtest模式,因此我们不能轻易地演示攻击,也不能为每个代码库提供一个再现性工具包。因此,我们只提供了stratisX的C++代码库演示。基于代码库中的相似性,我们通知了所有我们认为会受到影响的15个团队。其中,有5个团队承认了这一漏洞,有3个团队仍在调查当中,3个团队反驳了这一漏洞(表示已实施了减轻影响的措施),另外有4个团队没有做出回应。对于没有响应的四个团队,我们通过他们的网站找到联系他们的渠道。

火狐截图_2019-01-28T04-18-03.830Z

缓解措施

我们看到有团队针对我们的漏洞披露实施了一系列缓解措施。一些加密货币实现了检测攻击并断开与攻击对等体连接的缓解措施。简单地说,节点监视其对等节点的异常行为(例如,在fork上发送多个区块头)。这种启发式方法的挑战在于,很难区分实际攻击和经历合法重组的诚实节点,因此该方案存在错误禁止诚实节点的风险。到目前为止,我们看到的缓解措施看起来是合理的,但这是一个值得进一步探究的领域。

其他一些加密货币在固定长度范围内添加了部分验证。如果对等方接收到一个从主链分叉超过该长度的区块,那么该区块就被丢弃了。例如,在BCH(比特币现金)的ABC代码库中也采用了这种方法,该代码库使用一个10区块的滚动检查点。这种方法的缺点是它引入了“链分裂”的可能性。当诚实的节点最终位于区块链的不同分叉上时,就会发生链分裂。例如,如果网络连接不良,导致节点彼此失去同步的时间足够长,从而创建冲突的检查点,则可能发生这种情况。即使节点重新获得连接,它们也无法实现链的同步。我们注意到,即使没有这种缓解措施,也存在链分裂的风险。回顾前面的关注点B,由于 coinstake交易是使用当前链中的交易输出进行验证的,因此,如果节点临时发现自己在一个分叉上,则可能无法切换到实际的主链。

链分裂风险也为作恶矿工引入了新的攻击手段。攻击者可以尝试秘密挖取一个长链,然后将其发布到节点的一个子集,以导致链分裂。IBD(初始块下载)中的节点,或长时间离线后刚重启的节点特别易受这种攻击。这种攻击可以与Eclipse攻击结合起来,将诚实的节点引入由攻击者控制的链中。

所有这些缓解措施可使攻击难以执行,但仍然无法替代完全验证。一些加密货币,如量子链,计划在未来版本中全面验证非主链区块。

应建议以下受影响加密货币的用户将其节点更新为最新的补丁软件,需要注意的是,未更新的节点,我们可利用此漏洞导致节点RAM或磁盘消耗增加,并最终导致其崩溃。

下表显示了我们认为受上述两大漏洞影响的加密货币。我们并没有验证所有的PoS币,也没有探究为什么有些数字资产团队没有受到影响。

写在文末

虽然“伪造权益”攻击在原理上看似简单,但值得注意的是:在工作量证明(PoW)中有意义的一些想法,不能安全地转换到权益证明(PoS)。考虑到Bitcoin Core作为PoSv3加密货币的“前辈”,它们的代码共享程度很高,我们认为这值得进一步审查。在调查这些漏洞时,我们发现了几个针对各种缓解措施和特别防御措施的在建工程代码库。对我们来说,这表明PoS开发者意识到在这一设计空间中的权衡和需求,还没有被完全理解。挑战在于,一方面,我们希望尽快拒绝无效的区块,另一方面,我们不希望陷入链分裂或在处理实际的主链时被延迟。处理这一问题的系统方法,仍然是未来需要探索的工作。

尽管我们看到最近的漏洞(例如比特币中的CVE 2018–17144)至少影响了两个加密货币的代码库,但据我们所知,这是第一次跨如此多(20+)独立加密货币的协调安全漏洞披露。考虑到不同加密货币之间思想的交叉传播和代码重用的数量,我们预计将来会有更多这样的漏洞。我们发现,这些代码库的安全过程几乎没有一致性。例如,大多数没有专门的安全联系人。

编辑:覃耀
分享到:

相关新闻