区块链安全问题解析

2023年08月02日更新 2 人订阅
专栏简介 Upbit交易所大额ETH被盗事件详细分析 Ronin Network侧链被盗6.25亿美金流向分析 | 零时科技 零时科技 | 被盗6.1亿美金,Poly Network 被攻击复盘分析 2019年区块链安全事件总结,全球损失超60亿美元 安全建议 | 资金盘项目ETDP转移5000ETH跑路事件详情分析 零时科技 | 智能合约安全系列文章之反编译篇 慢雾:29 枚 Moonbirds NFT 被盗事件溯源分析 美链BEC合约漏洞技术分析 FTN 合约漏洞分析 成都链安:3月发生较典型安全事件超『17』起,以太坊Defi前景与风险并存,诈骗活动有所增加 铸币疑云 —— Paid Network 被盗细节分析 零时科技 | 以太坊链上互助保险平台Nexus Mutual被攻击事件分析 PeckShield:硬核技术解析,bZx协议遭黑客漏洞攻击始末 智能合约语法层面漏洞详解 交易重放+管理漏洞—2000万枚OP被盗事件分析 近7000万美元被盗:Curve被攻击事件分析 技术分析 Lendf.me 被攻击,ERC777到底该不该用? 零时科技:DeFi 项目 Lendf.Me 遭黑客攻击复盘分析 Poker EOS被盗 2万多EOS事件启示 - 谈私钥安全 回顾史上最大智能合约漏洞事件 — The DAO事件 16万美元资产被盗竟是乌龙事件? | Yeld.finance“闪电贷攻击”事件 EOS DApp 随机数漏洞分析2 - EOSDice 随机数被操控 EOS DApp 随机数漏洞分析1 - EOSDice 随机数被预测 EOS DApp 漏洞分析 - inline action 交易回滚攻击 以太坊DAO攻击解决方案代码解析 区块链共识安全 - 51%攻击浅析 【安全】Fomo3D死亡3分钟的交易攻击分析 币安交易所比特币被窃漏洞分析 千万美元被盗 —— DeFi 平台 MonoX Finance 被黑分析 零时科技:勒索软件 Shade 宣布停止运营, 并发布75万个解密密钥 zkSNARK 合约「输入假名」漏洞致众多混币项目爆雷 零知识证明 - zkSNARK应用的Nullifier Hash攻击 区块链安全100问 |​ 第四篇:保护数字钱包安全,防止资产被盗 使用历史权重难度(HWD)预防POW 51%算力攻击 区块链入门-51%攻击原理

千万美元被盗 —— DeFi 平台 MonoX Finance 被黑分析

千万美元被盗 —— DeFi 平台 MonoX Finance 被黑分析

By:九九@慢雾安全团队

2021 年 11 ⽉ 30 ⽇,据慢雾区消息,DeFi 平台 MonoX Finance 遭遇攻击,本次攻击中约合 1820 万美元的 WETH 和 1050 万美元的 MATIC 被盗,其他被盗 Token 包括 WBTC、LINK、GHST、DUCK、MIM 和 IMX,损失共计约 3100 万美元。慢雾安全团队第⼀时间介⼊分析,并将简要分析结果分享如下。

攻击核心

本次攻击的核⼼在于利⽤ swap 合约中没有对池中传⼊和传出代币是否相同作检查,以此利⽤价格更新机制的缺陷,使得攻击者传⼊和传出代币相同时,价格被二次计算并覆盖,导致代币价格不断被推⾼,并以此代币换出池中的其他代币来获利。

相关信息

MonoX 是⼀种新的 DeFi 协议,使⽤单⼀代币设计⽤于流动性池。这是通过将存⼊的代币与 vCASH 稳定币组合成⼀个虚拟交易对来实现的。其中的单⼀代币流动性池的第⼀个应⽤是⾃动做市商系统 - Monoswap,它在 2021 年 10 ⽉时推出。

攻击者地址 1:

0xecbe385f78041895c311070f344b55bfaa953258

攻击者地址 2:

0x8f6a86f3ab015f4d03ddb13abb02710e6d7ab31b

攻击合约 1:

0xf079d7911c13369e7fd85607970036d2883afcfd

攻击合约 2:

0x119914de3ae03256fd58b66cd6b8c6a12c70cfb2

攻击交易 1:

https://etherscan.io/tx/0x9f14d093a2349de08f02fc0fb018dadb449351d0cdb7d0738ff69cc6fef5f299

攻击交易 2:

https://polygonscan.com/tx/0x5a03b9c03eedcb9ec6e70c6841eaa4976a732d050a6218969e39483bb3004d5d

攻击细节

1、首先攻击者调用 Monoswap.swapExactTokenForToken:

0.1 个 WETH 换出 79.986094311542621010 个 MONO。

2、接着攻击者利用漏洞移除池子中其他用户的流动性,并为添加攻击合约的流动性以此来获取最大的利益。

这里移除流动性处的漏洞在 Monoswap.sol 中的 471-510 行,移除池中流动性时通过 removeLiquidity 函数调用 _removeLiquidityHelper 函数,而这两个函数都未做调用者和传入的 to 参数的身份验证,所以可直接移除任意用户在池中的流动性。

4101cad1a9b6f4aa3c9108643bdafaae.png

  • 移除 0x7b9aa6 的流动性,把 1670.7572297649224 个 MONO 和 6.862171986812230290 个 vCASH 转出给 0x7b9aa6;
  • 移除 cowrie.eth 的流动性,把 152.9745213857155 个 MONO 和 0.628300423692773565 个 vCASH 转出给 cowrie.eth;
  • 移除 0xab5167 的流动性,把 99940.7413658327 个 MONO 和 410.478879590637971405 个 vCASH 转出给 0xab5167;

为攻击合约 1 在 MONO 代币流动池创建流动性。

dd57d482ddec8e8dd1b0dfb6ec5f780d.png

3、紧接着攻击者调⽤ 55 次 Monoswap.swapExactTokenForToken 以此来不断堆⾼ MONO 的价格。

20363cb6efbf4ae9a46710c1e529ad31.png

这里攻击的核心是在 Monoswap.sol 中的 swapExactTokenForToken 函数,攻击者传入 MONO 代币使得 tokenIn 和 tokenOut 是相同的代币。

b877a2bb3a1a529358dc3cff1ad8942f.png

跟到 swapIn 函数中:

1f62a439bd6c5446bd8342db6e1678bd.png

可以发现在 swapIn 函数中,调用了函数 getAmountOut 来计算价格。接着跟到 getAmountOut 函数中发现是利用了 _getNewPrice 函数来计算 tokenInPrice 和 tokenOutPrice。

f5eec12ef138ab596cbe5cbb6ad5efdd.png

5363b5cbceef1f428377e58ea24fa28b.png

跟到 _getNewprice 函数中,发现当计算 tokenInPrice 时候传入的 txType 参数为 TxType.SELL,此时:

f82b5f95ca332709ea739c61f857ec0b.pnge456d366efaed7b3015b3769e839b119.png

当计算 tokenOutPrice 时候传入的 txType 参数为 TxType.BUY,此时:

99581154c1de7e564afd91c916df0c4a.png

如果传入和传出为同一种代币时,价格计算式中的四个变量都相同,所以很容易得出 tokenOutPrice 会比 tokenInPrice 要大。

由于 tokenIn 和 tokenOut 是同一个 token,swapIn 函数在计算完价格后会再次调用 _updateTokenInfo 函数,使得 tokenOutPrice 的更新会覆盖 tokenInPrice 的更新,所以导致这个 token 的价格上涨。

373cbcb28097f7dcc5e89180ed7a22a6.png

85e5600677715659e9cca6adb237d923.png

4、最后攻击者调用 swapTokenForExactToken 函数用 MONO 来换出池子中的其他代币。

d4df8ef4d0c3cc59c66ac1f939a13747.png

swapTokenForExactToken 函数中调用了 swapOut 函数,而 swapOut 函数中计算价格是调用的 getAmountIn 函数。

e0385a9b46f9f852cddf3820f663b2dc.png

在该函数中由于 tokenInPoolPrice 是取的 MONO 代币在池中的价格,而此价格在之前已被推高,导致 tokenInPrice 变大,计算最后的 amountIn 变小,用更少的 MONO 换出了原来相同数量的 WETH、WBTC、MONO、USDC、USDT、 DUCK、MIM、IMX 等池子中的代币。

7a81087a0cbaf944fb4cdc81ba45410a.png

5、攻击者最终把攻击获利转入地址

0x8f6a86f3ab015f4d03ddb13abb02710e6d7ab31b。

以上为以太坊主链上的攻击分析,此外,攻击者除了在以太坊主链上进行攻击外,还在 Polygon 上进行了同样的攻击,攻击手法与以太坊主链上相同,此处不做过多重复的分析。

据慢雾 AML 统计,MonoX Finance 最终损失约 3400 万美元,包括约 2.1K 个 WETH、1.9M 个 WMATIC、36.1 个 WBTC、143.4K 个 MONO、8.2M 个 USDC、 9.1M 个 USDT、1.2K 个 LINK、3.1K 个 GHST、5.1M 个 DUCK、4.1K 个 MIM 以及 274.9 个 IMX。

总结

本次攻击是利用了 swap 合约里没有对池中传入和传出代币作检查,从而利用价格更新机制的问题,由于在 swap 合约中会对池中传入和传出的代币的价格调用同一个函数 _upTokenInfo 来进行更新,而当传入和传出的代币为同一种代币时,第二次调用 _upTokenInfo 函数时,通过价格计算后的更高的 tokenOutPrice 会覆盖掉价格更低的 tokenInPrice,以此来不断推高池中该代币的价格,最后可以换出池中其他的所有代币来获利离场。

本文首发于:https://mp.weixin.qq.com/s/s0tO1aqOKGlRcXjyZFU_3Q

点赞 0
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论