By:yudan@慢雾安全团队
据慢雾区消息,2021 年 06 月 16 日,以太坊 DeFi 项目 Alchemix 的 alETH 合约疑似出现安全问题。17 日,Alchemix 发布了事故分析报告,慢雾安全团队迅速介入分析,并在官方分析报告的基础上梳理了本次事件的整个脉络和核心关键点,供大家参考。
太长不看系列
本次分析文章很长。这里先说结论,方便大家有个大概的理解。本次事故的主要原因在于 Alchemix 通过 transmuter 添加了 3次 vault,导致收益信息记录在了一个错误的元素上,而在调用 transmuter 的 harvest 函数时也没有传入正确的 index 值,导致通过错误的元素获取了错误的收益,将错误的 4300 ETH 的收益发送到 adapter 合约,帮助用户偿还了 alETH 的贷款,造成收益增多的问题,导致了悲剧。
核心分析——Round 1
根据官方发布的事故分析报告,本次事故的原因是官方的 alETH 的部署脚本意外地创建了额外的 vaults,导致 Alchemix 使用了 vaults 数组中错误的索引并计算出了错误的奖励,导致 transmuter 把所有的奖励用于偿还了用户的所有负债。我知道单单是这句简短的分析让人有点云里雾里,摸不着头脑,所以我们只能把目标放在官方给出的交易中,看看能不能找到真相。
中国移动今日在福州新区完成闽港区块链“中移闽链”和“中移香港链”的跨境跨链流通测试:6月19日消息,据C114通信网报道,中国移动今日在福州新区完成闽港区块链“中移闽链”和“中移香港链”的跨境跨链流通测试。本次测试采用中国移动研究院自主研发的“中移链”跨链服务和跨链NFT智能合约技术方案,构建链间标准跨链协议,通过“跨链服务+链适配器+智能合约”实现一套标准跨链原语,支持不同链之间进行通用数据和数字资产的跨链互操作,实现不同链之间的可信交互、双向流通,从而构成区块链价值信任网络,为闽港两地通用数据在不同区块链间的可信交互、自由流通提供坚实基础。“中移闽链”目前部署在福州长乐数据中心,后续将在平潭综合实验区落地部署,“中移香港链”则部署在香港的云资源池。下一步,“中移链”将与福建实达集团自主研发的区块链平台进行打通,实现闽、港和社会三方跨链协同服务。[2023/6/19 21:47:16]
根据官方给出的交易,通过 ethtx.info 分析工具进行分析,我们不难发现,这笔交易调用了 AlchemistEth 合约的 harvest 函数,并且传入了 _vaultId=0 这个参数,最后返回了
"4308144937764982868765" 和 "4308144937764982866415" 这两个值。
余伟文:推进数字人民币在港的跨境使用研究:金色财经报道,港交所将于本月19日推出港币-人民币双柜台模式,香港金管局总裁余伟文出席财新夏季峰会致辞时表示,港币-人民币双柜台模式即将推出,方便股票发行人和投资者以人民币在香港进行股票交易。此外,他指,正争取更多金融机构或其他企业在港进行人民币融资及发行点心债。去年在港发行的点心债总额达3300亿元人民币,较2021年翻1倍。下一步金管局会继续与内地监管部门研究,例如在港推出离岸国债期货,为投资者提供更多元化的风险管理工具,令香港离岸人民币金融市场更成熟,同时推进数字人民币在港的跨境使用研究。(香港经济日报)[2023/6/9 21:26:43]
为了更加了解 harvest 函数的作用,我们需要对整个函数进行分析:
不难发现,harvest 函数其实包含两个重要的操作,分别是收获奖励和将奖励分发给 transmuter 合约。其中 vault 是一个 library 库合约,其中的 harvest 逻辑实现如下:
通过代码分析不难发现,vault 库合约的 harvest 函数其实是检查了外部的 adapter 的总的资金量,然后根据 adapter 中的资金量减去用户的充值数量计算出收益的部分。
币安VIP借币平台新增SUI、FLOW、LDO等可质押资产:金色财经报道,据币安官方公告称,币安VIP借币平台新增可借资产:FXS、MKR、QNT、STG、MDT、OCEAN、HBAR、RIF、CELR,以及可质押资产:SUI、FLOW、LDO、OCEAN、CTSI、SNX、UNFI、STG、VET、INJ、JOE。币安VIP借币为个人或机构提供超额抵押借贷服务,利率、期限和服务,所有抵押资产都受到质押率的限制。[2023/5/21 15:17:11]
这里我们可以将这个 adapter 理解为一个策略池,用于管理用户的资金和收益。然后我们回到用户一开始的 AlchemistEth 合约中的 harvest 函数,发现返回的 "4308144937764982868765" 和
"4308144937764982866415" 这两个值其实对应的就是 vault 库合约的 harvest 函数计算出的需要提现的代币数量和从 adapter (策略池) 中取回的代币的数量。由于这个 adapter 对应的收益代币是 WETH,精度为 18 位,那么 "4308144937764982866415" 这个数值换算过来就是 "4308.144937764982866415" 个 WETH。
也就是说,本次 harvest 操作,收益了超过 4300 个 ETH 的收益,然后这个收益在下一步中通过 _distributeToTransmuter 函数给到了 transmuter 合约进行分发,我们看下分发过程中的逻辑是怎样的:
CZ:将首先把”无进展项目“转移到创新区,不会直接下架:金色财经报道,Binance创始人CZ在社交媒体上称,正如大家所建议的,我们将首先把”无进展项目“转移到创新区,而不会直接下架,如果他们仍然没有改善,我们可能会将其下架。
金色财经此前报道,Binance宣布将AMB、ARK、BTS、DREP、FTT、GFT、JASMY、LOOM、MLN、OAX、OMG、PERL、PNT、SNM、SRM、VGX、WRX及YFII移动至创新区。[2023/5/10 14:55:07]
_distributeToTransmuter 函数的逻辑只有简单的 3 行,我们主要关注的是最后的外部调用 —— lowerHashMinted 函数。该函数所对应的 xtoken 在这里指的是 alETH 本身。因为 alETH 本身是用户通过借贷借出来的,所以 lowerHashMinted 这里的操作其实是使用 harvest 的收益将 alETH 总的贷出数量减少了,从而减少了每个用户的贷款。总结来说就是用 harvest 4300 ETH 的收益偿还用户的 alETH 贷款。
打个小总结
这里先总结下这个流程,就是 AlchemistEth 合约通过 harvest 函数,得到了 4300 ETH 的收益,并将这个收益分发出去了,用于偿还用户的 alETH 贷款,导致了我们看到的情况 —— 已经贷出 alETH 的用户在不需要还款的情况下就可以拿回他们质押的 ETH。那究竟是为什么,会有这 4300 ETH 的收益呢?这多出来的 4300 ETH 的收益是怎么来的?针对这个问题,我们开始下一轮的分析。
9 月份比特币挖矿收入下降 16.2%:金色财经报道,根据The Block Research汇编的数据,9 月份比特币挖矿收入下降 16.2% 至约 5.505 亿美元,这是过去六个月中的第五次下降,也是自 2020 年 11 月以来的最低水平。在以太坊网络转向权益证明之后,比特币产生的收入大约是以太坊矿工和质押者总收入的 1.56 倍。
大多数比特币挖矿收入来自奖励(5.418亿美元),只有一小部分来自交易费用(866 万美元)。比特币交易费用占总收入的份额小幅上升至 1.6% 左右。网络哈希率在8月份增长了大约10.4%,在9月份增长了0.6%。[2022/10/4 18:39:09]
核心分析——Round 2
要了解为什么会多出来 4300 ETH,就必须了解 AlchemistEth 的资金存储过程。在 AlchemistEth 合约中,合约总的充值情况是使用 Vault library 库的 Data 结构体进行记录的,然后通过 flushActiveVault 函数更新对应的充值数量(totalDeposit)。
然后 depositAll 函数会将充值的代币金额打到对应的 adapter(策略池) 中,那么在下一次 harvest 的时候,通过 adapter(策略池) 获取的 totalValue,就会是用户的本金加上策略池的收益。为了计算收益过程中的本金部分,我们对官方给出的交易进行 debug,发现本金仅为 9000 ETH,从 adapter 获取的收益加上本金共有 13000 ETH,也就是说 9000 ETH 的本金产生了 4300 ETH 的收益。
但是,按照上面分析的逻辑,用户的本金是不会产生那么大的收益的,问题肯定是出在了 adapter 获取的 totalValue。也就是说 adapter 不止只有 AlchemistEth 充值代币,还存在其他的收益渠道。为了验证我们的想法,慢雾安全团队分析了 adapter 的所有代币收入,果然发现了一笔异常的转入行为,并且金额也能刚好对上多出的 4300 ETH 的收益。也就是说,问题就在这里了。
通过查看交易数据,发现这是一笔调用 harvest 操作的交易,调用的合约是 transmuter 合约:
也就是说,是这个 harvest 函数出问题了,harvest 函数的逻辑如下:
同样是调用了 vault 的 harvest 函数,熟悉的配方,熟悉的味道。我们再次进行 debug,发现一个惊人的事实 —— 在进行收益的时候,vault 的 totalDeposit 竟然为 0,导致 4300 ETH 的收益直接分发给了 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 操作的时候,要记得检查好业务逻辑中的每一个流程,防止意外的发生,在必要的时候可以联系专业的安全团队进行专业的安全审计,防止事故的发生。
NFT不是作品本?,NFT也不是版权本?;持有者拥有NFT,并不必然拥有实物作品、数字作品副本以及相应的知识产权?CC0对?个“赋权于?”的项???概之不?定是准确的表达;最终我们要回到创作者与持有者之间的契约关系.
1900/1/1 0:00:00Context旗下NFT铸造聚合器mint.fun通行证铸造即将结束:5月15日消息,OpenAI首席执行官Sam Altman领投的Web3钱包追踪应用Context推出的NFT铸造聚合器mint.fun通行证铸造将于北京时间5月1.
1900/1/1 0:00:00在华盛顿、华尔街和硅谷,搞清楚美国证券交易委员会 (SEC) 主席 Gary Gensler 对加密货币的立场已经成了一场猜谜游戏。加密行业游说者收看他在国会的作证。律师们分析他的演讲.
1900/1/1 0:00:00By : Kong@慢雾安全团队据慢雾区情报,2020 年 12 月 29 日,Cover 协议价格暴跌。慢雾安全团队第一时间跟进相关事件并进行分析,以下为分析简略过程.
1900/1/1 0:00:00声誉分数的未来与社区息息相关现实世界中,我们可以用驾照来证明自己的身份,但它无法显示足够的个人信息或是声誉。要在现实世界中了解一个人或是其过往经历,就可能需要问问共同的熟人,或者和他(她)聊聊喜欢的话题.
1900/1/1 0:00:00(原标题:HowNFTs are changing the entertainment industry)NFTs已经准备好了它们的好莱坞特写镜头.
1900/1/1 0:00:00