木星链 木星链
Ctrl+D收藏木星链

ETH:走过最长的路竟是自己的套路:Alchemix事件分析

作者:

时间:1900/1/1 0:00:00

By:yudan@慢雾安全团队

据慢雾区消息,2021年06月16日,以太坊DeFi项目Alchemix的alETH合约疑似出现安全问题。17日,Alchemix发布了事故分析报告,慢雾安全团队迅速介入分析,并在官方分析报告的基础上梳理了本次事件的整个脉络和核心关键点,供大家参考。

太长不看系列

本次分析文章很长。这里先说结论,方便大家有个大概的理解。本次事故的主要原因在于Alchemix通过transmuter添加了3次vault,导致收益信息记录在了一个错误的元素上,而在调用transmuter的harvest函数时也没有传入正确的index值,导致通过错误的元素获取了错误的收益,将错误的4300ETH的收益发送到adapter合约,帮助用户偿还了alETH的贷款,造成收益增多的问题,导致了悲剧。

核心分析——Round1

根据官方发布的事故分析报告,本次事故的原因是官方的alETH的部署脚本意外地创建了额外的vaults,导致Alchemix使用了vaults数组中错误的索引并计算出了错误的奖励,导致transmuter把所有的奖励用于偿还了用户的所有负债。我知道单单是这句简短的分析让人有点云里雾里,摸不着头脑,所以我们只能把目标放在官方给出的交易中,看看能不能找到真相。

CABEI总裁:萨尔瓦多对比特币的风险敞口很小,并不重要:金色财经报道,中美洲经济合作银行(CABEI)总裁Dante Mossi表示,萨尔瓦多对加密货币(包括比特币)的敞口很小。据悉,预计萨尔瓦多将在下周偿还一笔债券,大部分资金将由该银行提供。Mossi称,我们已经看到了这种风险敞口,我们认为它非常小,并不重要。我们希望投资者也能了解萨尔瓦多的真实情况。”CABEI本月早些时候提供了4.5亿美元贷款。

Mossi还表示,预计国际货币基金组织(IMF)将执行其所谓的第四条任务,即为萨尔瓦多提供宏观经济评估和建议。CABEI正在与萨尔瓦多政府合作,收集有关债务可持续性的信息,预计将包括对加密货币的披露,以供IMF审查。(彭博社)[2023/1/21 11:25:12]

根据官方给出的交易,通过ethtx.info分析工具进行分析,我们不难发现,这笔交易调用了AlchemistEth合约的harvest函数,并且传入了_vaultId=0这个参数,最后返回了

"4308144937764982868765"和"4308144937764982866415"这两个值。

为了更加了解harvest函数的作用,我们需要对整个函数进行分析:

过去七天,去中心化交易所的交易量达320亿美元:11月14日消息,据Dune Analytics的数据,去中心化交易所 (DEX) 的交易量在过去 7 天内达到了惊人的 320 亿美元。其中,Uniswap占同期交易量的 209 亿美元,占比最高。随后是 Curve 71亿美元,DODO 12.4亿美元和Balancer 10.6亿美元。[2022/11/14 13:03:23]

不难发现,harvest函数其实包含两个重要的操作,分别是收获奖励和将奖励分发给transmuter合约。其中vault是一个library库合约,其中的harvest逻辑实现如下:

通过代码分析不难发现,vault库合约的harvest函数其实是检查了外部的adapter的总的资金量,然后根据adapter中的资金量减去用户的充值数量计算出收益的部分。

这里我们可以将这个adapter理解为一个策略池,用于管理用户的资金和收益。然后我们回到用户一开始的AlchemistEth合约中的harvest函数,发现返回的"4308144937764982868765"?和?

"4308144937764982866415"这两个值其实对应的就是vault库合约的harvest函数计算出的需要提现的代币数量和从adapter(策略池)中取回的代币的数量。由于这个adapter对应的收益代币是WETH,精度为18位,那么?"4308144937764982866415"?这个数值换算过来就是"4308.144937764982866415"?个WETH。

Web3电商平台Rye完成1400万美元融资,a16z Crypto领投:10月11日消息,Web3电商平台Rye完成1400万美元新一轮融资,a16z Crypto领投。

据悉,Rye由Twitch联合创始人Justin Kan创立,旨在打造“Web3领域里的Spotify”。Rye将寻求使用加密Token降低电子商务成本,通过向参与者提供加密货币“Rye”(可用于支付交易费用),Rye将提供一键式应用程序编程接口(API),供商家在Rye自己的市场上展示他们的部分或全部产品。(福布斯)[2022/10/11 10:31:20]

也就是说,本次harvest操作,收益了超过4300个ETH的收益,然后这个收益在下一步中通过_distributeToTransmuter函数给到了transmuter合约进行分发,我们看下分发过程中的逻辑是怎样的:

_distributeToTransmuter函数的逻辑只有简单的3行,我们主要关注的是最后的外部调用——lowerHashMinted函数。该函数所对应的xtoken在这里指的是alETH本身。因为alETH本身是用户通过借贷借出来的,所以lowerHashMinted这里的操作其实是使用harvest的收益将alETH总的贷出数量减少了,从而减少了每个用户的贷款。总结来说就是用harvest4300ETH的收益偿还用户的alETH贷款。

币安铸造约1.17亿枚BUSD:金色财经报道,Whale Alert监测数据显示,币安铸造了约1.17亿枚BUSD。[2022/9/24 7:18:05]

打个小总结

这里先总结下这个流程,就是AlchemistEth合约通过harvest函数,得到了4300ETH的收益,并将这个收益分发出去了,用于偿还用户的alETH贷款,导致了我们看到的情况——已经贷出alETH的用户在不需要还款的情况下就可以拿回他们质押的ETH。那究竟是为什么,会有这4300ETH的收益呢?这多出来的4300ETH的收益是怎么来的?针对这个问题,我们开始下一轮的分析。

核心分析——Round2

要了解为什么会多出来4300ETH,就必须了解AlchemistEth的资金存储过程。在AlchemistEth合约中,合约总的充值情况是使用Vaultlibrary库的Data结构体进行记录的,然后通过flushActiveVault函数更新对应的充值数量(totalDeposit)。

PeckShield:检测到一个Nomad漏洞利用者从33个地址获得了约480万美元的HBOT:金色财经报道,据PeckShield监测,检测到其中一个ENS名称为lendhub.eth的Nomad漏洞利用者(地址为:0xCA23E…f56C),从33个地址获得了约480万美元的HBOT,这些地址与lendhub.eth密切相关,它持续售出约275万美元HBOT。[2022/8/11 12:18:42]

然后depositAll函数会将充值的代币金额打到对应的adapter(策略池)中,那么在下一次harvest的时候,通过adapter(策略池)获取的totalValue,就会是用户的本金加上策略池的收益。为了计算收益过程中的本金部分,我们对官方给出的交易进行debug,发现本金仅为9000ETH,从adapter获取的收益加上本金共有13000ETH,也就是说9000ETH的本金产生了4300ETH的收益。

但是,按照上面分析的逻辑,用户的本金是不会产生那么大的收益的,问题肯定是出在了adapter获取的totalValue。也就是说adapter不止只有AlchemistEth充值代币,还存在其他的收益渠道。为了验证我们的想法,慢雾安全团队分析了adapter的所有代币收入,果然发现了一笔异常的转入行为,并且金额也能刚好对上多出的4300ETH的收益。也就是说,问题就在这里了。

通过查看交易数据,发现这是一笔调用harvest操作的交易,调用的合约是transmuter合约:

也就是说,是这个harvest函数出问题了,harvest函数的逻辑如下:

同样是调用了vault的harvest函数,熟悉的配方,熟悉的味道。我们再次进行debug,发现一个惊人的事实——在进行收益的时候,vault的totalDeposit竟然为0,导致4300ETH的收益直接分发给了adapter,导致了adapter获取的totalValue错误了,多了4300个ETH,原因就是在这里。

到了这里,我们已经很接近真相了,剩下要解决的就是为什么totalDeposit会为0?我们查询了transmuter合约中能改变totalDeposit的地方,发现只有_plantOrRecallExcessFunds函数可以改变这个值,而这个函数上层调用的又是distribute函数。而transmuter合约的distribute函数是AlchemistEth合约在收益的时候进行调用的。也就是说本身的流程应该是:

1.AlchemistEth合约调用harvest进行收益

2.AlchemistEth合约调用transmuter合约的distribute函数记录收益情况,并把收益部分给adapter

3.adapter收到了transmuter的收益,根据收益偿还用户的alETH的贷款

但是问题就出在了_plantOrRecallExcessFunds函数中。由于在记录充值信息的时候,用的是_vaults.last()来获取最新的vault,所以其实充值信息叠加在了最后一个元素上。但是项目方调用了三次setActiveVault函数,所以其实充值信息是叠加到了_vaults数组的3号元素,也就是index为2的vault元素上。但是在transmuter合约在harvest的时候传入的_vaultId却是0,0号元素是没有任何充值记录的,所以transmuter合约就误将所有的收益都给了adapter了。导致了悲剧的发生。

总结

到这里,整个事情已经变得很清晰了,Alchemix项目方由于某种原因,通过transmuter添加了3次vault,导致收益信息记录在了一个错误的元素上,而在调用transmuter的harvest函数时也没有传入正确的index值,导致通过错误的元素获取了错误的收益,错误收益被发送到adapter合约,造成收益增多,导致了悲剧。

慢雾安全团队在此提醒,DeFi是一个复杂的系统,在进行DeFi操作的时候,要记得检查好业务逻辑中的每一个流程,防止意外的发生,在必要的时候可以联系专业的安全团队进行专业的安全审计,防止事故的发生。

标签:ETHTERVESTVESETHPLOMONSTER币bZx Vesting TokenVESPASHIBA币

比特币价格热门资讯
BTC:金色观察 | 四川发布禁令后 中国BTC算力大幅下降

概要1.?全球五大BTC矿池中的蚂蚁矿池、币印和BTC.com矿池实时算力自6月以来下跌了10-22%。2.?此次大幅下跌似乎是因为四川省政府在星期五出台了挖矿禁令.

1900/1/1 0:00:00
以太坊:以太坊核心开发者会议更新004

在未来几周内,伦敦升级将在测试网启动。JSONRPC的变更已经文档化了,还有项目可用于添加1559支持的参考手册;“合并”的eth2部分已经有成熟的规范了.

1900/1/1 0:00:00
区块链:区块链驱动资产证券化的新时代

自新冠疫情席卷全球以来,利用现代科技,以数字化工具武装自身成为不少行业及企业在疫情期间的“生存之道”.

1900/1/1 0:00:00
TORJ:数据:美国区块链ETF去年平均投资回报率为74%

ETFdb数据库数据显示,在美国交易所上市的四只区块链ETF基金去年的平均投资回报率为74%。AmplifyTransformionalDataSharingETF的回报率最高,为136.09%.

1900/1/1 0:00:00
WAR:如何理解Swarm?懂了但又不完全懂 你不是一个人

Swarm1.0已经主网上线,这意味着以太坊上的DApp已经可以在Swarm中存储用户数据、用户状态或DApp代码本身.

1900/1/1 0:00:00
比特币:矿业强监管后:交易需求降至34个月以来最低点

根据剑桥大学新兴金融研究中心计算的电力消费指数,截至6月21日,比特币挖矿的全年预估能耗值约为91.04TW/h,已高于芬兰和比利时全国的预估能耗规模,与哈萨克斯坦全国的预估能耗规模相当.

1900/1/1 0:00:00