Superfluid - 翻车



870万美元被从Superfluid抽走。

该加密货币流支付协议在UTC时间2022年2月8日 06:17被黑。

使用该服务进行贡献者支付或投资者托管合约的其他项目遭受了负面的价格影响,因为黑客用这些原生代币砸盘。

受影响的协议包括Mai Finance(QI)、Stacker Ventures(STACK)、Stake DAO(SDT)和Museum of Crypto Art(MOCA)。

QI是受影响最严重的代币,在砸盘最初跌近80%,但后来恢复到黑客攻击前价格的62%。

Superfluid的@francescorenzia告诉rekt.news,这次攻击只集中在平台较大余额的钱包。在漏洞被修补之前,黑客留下大量没动的ETH、USDC和DAI,可能是因为攻击者"赚够了"。

这一切是如何发生的?

黑客地址:0x1574f7f4c9d3aca2ebce918e5d19d18ae853c090

攻击哈希:0xdee86cae2e1bab16496a49…

盗走的资产:

1940万QI(黑客攻击前的价值为2400万美元)分 ,共计2300WETH(约620万美元)。

24.4WETH - (~76000美元)

56.3万 USDC换得173 WETH

4.5万 SDT换得17 WETH(约5.4万美元)

2.4万 STACK换得6.2 WETH(约1.9万美元)

3.9万 sdam3CRV - 换成am3CRV,然后换成约4.4万 amDAI

1.5M MOCA - 150万中的100万以173 WETH(约50万美元)售出

1.1万 MATIC - 尚未出售

总计 - ~870万美元

攻击发生后约6小时,Superfluid在Mudit Gupta的帮助下修补这个漏洞。

该补丁可以在这里找到。

下面的文字摘自Superfluid自己的事后总结

漏洞解析

Superfluid.sol,被称为host合约,是允许在一笔交易中达成可组合的Superfluid合同 (ConstantFlowAgreement,InstantDistributionAgreement) 的合约,且组成的系统通常被称为超级应用程序。

然而,为了在不同的agreement调用之间有一个贯穿整个交易的可信和共享的状态,引入了一个叫做 "ctx" 的概念(一个由host合约管理的序列化状态)。

"ctx"包含一个agreement函数需要知道的所有上下文,尤其包括谁是初始调用的 "msg.sender"

而这正是不幸漏洞被利用的地方。

攻击者能够巧妙地伪造calldata,这样以来host合约中的序列化过程和接下来的agreement合约中的反序列化过程使得合同合约基于一个专门用来冒充其他账户的上下文对象运行。

这种机制被用来"代表"其他账户创建IDA索引,并以这种方式转走他们的代币。

攻击者合约:

下面的攻击者合约演示了如何利用该漏洞来冒充其他账户关闭他们的运行中的流支付。

在实际的攻击交易中,攻击者使用IDA合约,用同样的技术从其他账户中抽走资金。

函数调用链

deleteAnyFlowBad

调用Agreement的惯例是使用占位符ctx,这样后续solidity协议代码可以直接将它读取为参数"ctx"。

想了解更多关于这个概念的信息,请看关于占位符-Ctx

在这个地方攻击者设法注入一个假的"ctx",它可以设置一个任意的发送人。

Superfluid.callAgreement

在正常情况下,Superfluid.callAgreement会创建ctx,并加盖标记(在状态变量中存储其哈希值),这样就可以使用 Superfluid.isCtxValid 进行验证。

ConstantFlowAgreementV1.createFlow

然后,协议使用AgreementLibrary.authorizeTokenAccess来验证调用的host合约是否被授权对代币合约进行状态修改调用。

AgreementLibrary.authorizeTokenAccess

一旦调用的host合约验证通过,agreement合约也会转而信任传来的ctx,并将其解码(反序列化)为一个内存结构。

但这是假的Ctx!

问题是,正如在被利用的函数 deleteAnyFlowBad 中,人们可以注入一个假的ctx。

在被 Superfluid.replacePlaceholderCtx 合并成一个字节对象后(host合约不对协议的具体数据做任何假设),产生的dataWithCtx现在包含2个ctx变量,合法的和恶意注入的。

当agreement合约对这些数据进行解码时,abi解码器采用第一个(注入的)变量,而忽略了包含合法ctx的剩余数据。

为了解决这个问题,Superfluid在agreement合约中增加一步验证:

ISuperfluid.isCtxValid。它通过比较存储在host合约中的标记(哈希值)来验证解码后的ctx。

这个检查在处理由SuperApp回调提供的ctx数据时已经存在,但对于由受信任的Host合约传递的数据却没有检查。

Superfluid已经在链上联系攻击者,根据事后调查报告,100万美元的赏金仍然有效,以换取被盗的资金。

该团队还表示,大部分受影响的账户已经得到赔款,而较大的QI和MOCA损失将逐步得到补偿。

虽然这不是最大的漏洞 (在我们的排行榜上排名第42位),也没有用户资金受损,但它影响其他协议的方式值得注意。

不断增长的DAO基础设施领域,为在DeFi中非常普遍的匿名攻击者呈现更多的目标。

被盗的钱仍然放在攻击者的钱包里。

他们会接受赏金,还是让Superfluid(超流体)高度干燥?

如果您对我们的文章感兴趣,请加入Rekt中文电报群一起交流讨论。


分享本文

REKT作为匿名作者的公共平台,我们对REKT上托管的观点或内容不承担任何责任。

捐赠 (ETH / ERC20): 0x3C5c2F4bCeC51a36494682f91Dbc6cA7c63B514C

声明:

REKT对我们网站上发布的或与我们的服务相关的任何内容不承担任何责任,无论是由我们网站的匿名作者,还是由 REKT发布或引起的。虽然我们为匿名作者的行为和发文设置规则,我们不控制也不对匿名作者在我们的网站或服务上发布、传输或分享的内容负责,也不对您在我们的网站或服务上可能遇到的任何冒犯性、不适当、淫秽、非法或其他令人反感的内容负责。REKT不对我们网站或服务的任何用户的线上或线下行为负责。