Staking和Staking还有差别?实现「睡后收入」如何避免翻车?

CertiK
CertiK 机构得得号

Feb 01, 2023 CertiK 专注于区块链安全,被称为区块链安全世界的「普华永道」。

摘要: 保护Staking项目免受攻击的最佳方法是对奖励计算进行审计,以确保所有奖励符合设计且是可持续的。

​当我们谈论区块链生态系统中的Staking时,可能指的是两个不同的概念。

它可能是一种用于参与权益证明共识算法的质押,或者是用户将其token锁定在DeFi项目中以获得帮助增加其TVL或保留某些token价值的奖励。本文将主要为大家讲解后者以及后者在2022年的表现,但在开启讨论之前,我们需要先了解一下这两者的区别。

在权益证明 (PoS) 区块链中进行质押

权益证明区块链依赖于用户(验证者)锁定(抵押)token,以参与共识算法,该算法负责生成区块并将其添加到链中。Staking就像验证者在游戏中的皮肤证明——在某些区块链中,例如以太坊,提交欺诈性区块的验证者甚至可以削减其股份作为惩罚。权益证明 (PoS) 是作为工作证明 (PoW) 的替代方案而创建的。权益证明的验证者主要是投资于网络的持续价值,因此往往以网络最大利益为出发点。这与PoW不同,PoW不要求矿工持有他们正在验证其交易的任何token。权益证明相比于工作证明的主要优势在于其大大降低了能源消耗。此外,PoS不需要像PoW那样使用高门槛的专用硬件设备。

DeFi Staking项目

一些去中心化金融 (DeFi) 项目允许用户使用stake coin或token来增加他们的TVL(总锁定价值),从而用更多的stake coin或token奖励这些用户。奖励的数量、种类和频率将取决于具体的DeFi项目。这一类型较为知名的项目有Yearn Finance、Curve Finance和Uniswap。下表总结了所讨论的两种Staking系统之间的差异:

2022年关于Staking及相关攻击的常见问题

通常,当计算用户奖励的智能合约未能使用基础token的正确价格或用户用于此类计算的token数量进行此类计算时,就会出现漏洞,允许攻击者获得比预期更多的奖励。这些漏洞通常通过让攻击者操纵Staking token的价格或操纵用户暂时拥有的数量来起作用。同时让易受攻击的智能合约计算用户奖励,从而影响奖励token的价值或数量以谋取利益。除此之外,合约中可能存在的其他典型漏洞,如可重入、合约变量未更新等,都可能让攻击者获得更多非法奖励。以下是一些典型的Staking漏洞:

1. 根据可操纵的Stake余额计算奖励

2022年11月21日,CertiK Skynet天网动态扫描系统发出预警:一笔闪电贷获取了巨大利润。经过专家团队调查,确定了SportsDao token奖励机制遭到恶意利用,奖励金额与合约LP余额成反比,任何人都可以通过withdrawTeam () 函数“重置”该余额。经计算,总利润约为1370万BSC-USD。奖励是根据合约的LP余额计算的:

并且任何人都可以通过调用withdrawTeam()函数将所有LP token转移到团队钱包来清空合约里的LP。

由于奖励率不仅由用户提供的流动性决定,而且与合约上(指定对的)LP token余额成反比,一旦合约被清空,攻击者只需要质押一些LP token(stakeLP() function)然后领取奖励(getReward() function):

攻击交易:https ://bscscan.com/tx/0xb3ac111d294ea9dedfd99349304a9606df0b572d05da8cedf47ba169d10791ed

2. 使用单一第三方矿池计算奖励价值

2022年8月13日,WarpStaking项目遭到攻击,攻击者利用了奖励价格的计算错误来实施此次攻击。尽管此次攻击最后的总损失仅为0.09BTC(约合2,293美元),但本文仍将其收录在内,是因为这个案例非常典型且易于理解。WarpStaking奖励那些抵押WRP token的用户。因此攻击者从 PancakeSwap上借出了2个BTCB,并使用BTCB-WRP流动资金池将它们换成WRP(提高了池子中WRP的价格)。随后调用harvest() 函数获得质押奖励(单位为BTCB)。由于该函数使用上述池计算BTCB中WRP的价格,因此攻击者获得了比他们原本应得的更多奖励。

上述代码中调用了rewardTokenPriceInToken ()函数计算奖励token的价格。鉴于它使用单个PancakeSwap池,价格很容易被攻击者操纵。这种情况中,CertiK建议使用多个可靠的链上价格预言机来源,例如 Chainlink或Band协议,或使用时间加权平均价格 (TWAP) 。通过Bscscan观察受影响的交易:https://bscscan.com/tx/0xa8dd1a8ecb5e7975f0e9830bbd3894cb81547338ce75b3cabcdf04dc1976a757。值得一提的是,在过去我们曾观察到其他事件错误地使用单个第三方池来计算在质押时应铸造的share(股)数量。他们不会像上文所述那样滥用第三方池来计算奖励价值,而是使用质押时获得的share数量。但这些攻击也会导致奖励计算出现问题。

3. 在提供闪电贷的同时计算奖励

Equalizer允许用户使用他们vault中的资金进行闪电贷。合约FlashloanProvider可以让用户从vault中闪电贷资产,同时在同一个区块中向其抵押新的token。这使得兑换率容易被操纵。攻击者通过攻击多个vault(约33 WETH、约831 USDC、约651 UNI、约77 LINK 和约164 WBNB)总共获得了价值约11.2万美元的token。在下图的代码中,函数getRatioForOneEToken () 使用当前合约的抵押token来计算token的比率,这样乍一看可能并不容易受到攻击。但是,该合约还提供了闪电贷功能,这使得该合约的token比例可以被任意操纵。

通过Etherscan观察其中一笔受影响的交易:https ://etherscan.io/tx/0x9b17f61d2c7fc4463ff94c5edfea6695d131584a6e07fed5b9ed298c16c17f41/advanced

4. 合约变量未更新

2022年10月26日,StakeUpFarm项目遭到攻击,攻击者利用了该项目staking时间参数未正确更新,从而获利12,328 BUSD。StakeUpFarm在解锁质押token时没有更新startTime状态变量。因此,可以多次质押并累积所有奖励(其中那些新质押的token可以按照第一次质押的token的时间来获取奖励)。

上图的代码调用了userRewardMINT()函数来计算用户的奖励,但是当用户解除质押时,claimTimeMINT[_user].startTime变量并没有更新,从而让用户获得更多的奖励。漏洞交易:https ://bscscan.com/tx/0x368a52b5b657ee7152d99ebbf595e09163d3847f47a9eb52b9c8618adbd21368

5.重入攻击

2022年3月13日,Paraluni项目遭到重入漏洞攻击。经过多笔恶意交易后,该项目约有170万美元被盗。

在上图的代码中,addLiquidityInternal() 过程完成之前,攻击者触发了 MasterChef.deposit() ,使得恶意token将LP token存入了合约。因为函数 addLiquidityInternal() 检查前后的合约余额,所以合约认为存款人提供了更多的LP代币。这样,攻击者就有了两条存款记录。该攻击比直接利用可重入性问题要复杂一些,因为它涉及创建两个假token,这些token将在调用transferFrom()函数时重入。漏洞交易示例:https://bscscan.com/tx/0x70f367b9420ac2654a5223cc311c7f9c361736a39fd4e7dff9ed1b85bab7ad54

6. 系统设计

a. 对敏感功能缺乏访问控制

2022年2月20日,DonationStaking因缺乏访问控制的问题遭到攻击,损失了15 ETH(约40000美元)。没有对setStakingContract()函数的访问控制,因此任何人都可以调用它来修改Staking合约和Staking token。

以下交易显示了攻击者如何调用setStakingContract() ,将精心制作的恶意“L token”作为DonationStaking合约的抵押合约:https ://etherscan.io/tx/0x09e026dcd64e2ebc5c59e77b3faf5543bcc3b774342ac7a980e388c3c33c84d9 。上述函数缺乏访问控制导致该行为具备可能性。b. 缺乏输入验证2022年8月2日,Reaper Farm的ReaperVaultV2合约被利用,损失超过160万美元。

攻击者利用了ReaperVaultV2合约中的一个漏洞,任何人都可以销毁其他用户的vault share并提取token。主要问题是vault share持有者可以是msg.sender以外的账户。

在上面的withdraw () 函数中,参数owner可以是任意地址,而不仅仅是调用者的地址。此外,地址所有者和msg.sender之间的关系是未检查的,这意味着用户可以使用不同的所有者值从vault中提取其他用户的资产。漏洞交易示例:https://ftmscan.com/tx/0xc929f3b9312ff26be0adb1c3ff832dbdafdcbcaad33d002744effd515e53c9d5c. 对输入参数的处理有误2022年4月23日,一名攻击者利用SmoltingInu token合约中的gambling功能flipcoin()函数赢得SmoltingIn token。攻击者将所得token抛售,导致其价格下跌99%。在SmoltingInu合约中,flipCoin()函数接受用户的存款,生成_randomNumber并确定用户是否获胜。所有步骤在一个块内完成。攻击者编写了一个合约来与flipCoin()函数交互,并在丢失时恢复交易。

漏洞交易示例:https://bscscan.com/tx/0x6bfb3abbdc546959d4cb64840672920389ffb1ff4f0ccb276629ee26df3d08d6

为什么Staking会吸引这么多黑客?

鉴于价格操纵攻击通常利用闪电贷攻击来进行,它们易于操作且成本较低。即便攻击失败,付出的成本也就是一点手续费罢了。但如果攻击成功,获取巨额利润可以让成本直接被忽略不计。部分合约本身存在逻辑漏洞,如合约部分变量未更新、合约方法中缺乏权限控制、合约经济模型不合理等。Web3.0领域已成为黑客的新目标,尤其是DeFi。不仅许多项目在没有审计的情况下直接上线,更有那些即便已完成审计的项目因新的媒介被攻击。此外,DeFi项目很少会实施完备的AML或KYC验证,因此通过另一个DeFi交易所进行攻击和洗钱相对容易且难以被察觉。基于这一分析,很明显在DeFi安全方面我们还有很多工作要做。尽管Web3.0领域已在安全、采用和监管批准方面取得了重大进展,但数字资产仍然算是一个新兴市场,其未来也在持续的构建当中。

如何保护涉及Staking的项目

保护Staking项目免受攻击的最佳方法是对奖励计算进行审计,以确保所有奖励符合设计且是可持续的。此外,建议使用可靠的去中心化预言机,如Chainlink(或通过聚合许多不同价格来源的预言机)。如果平台决定使用链上预言机,那么可以采取一些预防措施来提高安全性。例如通过使用时间加权平均价格(TWAP)来计算资产价格,这样攻击者就很难操纵价格。另一种防止闪电贷攻击Staking项目的方法是在与平台交互所需的步骤之间增加轻微的延迟。这一延迟防御了闪电贷攻击,因为他们必须在同一个区块中开始和结束。虽然这种措施可能会限制可组合性和用户体验,但仍是一种颇为有效的解决方案。最后,确保合约中不存在典型的漏洞,如重入、缺乏访问控制、合约变量未更新等。为此,建议始终遵循安全最佳实践,进行测试,完成来自于业内领先安全机构的代码审计,并随时了解最新的黑客攻击方式,防患于未然。

链得得仅提供相关信息展示,不构成任何投资建议
本文系作者 CertiK 授权链得得发表,并经链得得编辑,转载请注明出处、作者和本文链接

更多精彩内容,关注链得得微信号(ID:ChainDD),或者下载链得得App

分享到:

相关推荐

    评论(0

    Oh! no

    您是否确认要删除该条评论吗?

    分享到微信