无标题文档
wdCP系统 (介绍,功能特性,运行环境,安装说明,演示,常见问题,使用教程) wdCDN系统 (介绍,功能特性,运行环境,安装说明,演示,常见问题,使用手册)
wdOS系统 (介绍,功能特性,运行环境,安装说明,演示,常见问题,使用教程) wdDNS系统 (介绍,功能特性,运行环境,安装说明,演示,常见问题,使用手册)
注册 发贴 提问 回复-必看必看 wddns免费智能 DNS 开通 本地或虚拟机使 用wdcp 一键包在mysql编 译时"卡住"
【300G高防】双线 无视攻击 wdcp官方技术支持/服务 阿里云8折优惠券 无敌云 腾讯云优惠中,现注册更有260代金额券赠送
返回列表 发帖
提问三步曲: 提问先看教程/FAQ索引(wdcp,wdcp_v3,一键包)及搜索,会让你更快解决问题
1 提供详细,如系统版本,wdcp版本,软件版本等及错误的详细信息,贴上论坛或截图发论坛
2 做过哪些操作或改动设置等

温馨提示:信息不详,很可能会没人理你!论坛有教程说明的,也可能没人理!因为,你懂的

Cellfram攻击事件分析及POC

基础信息

攻击者地址:

0x2525c811ecf22fc5fcde03c67112d34e97da6079

攻击合约:

0x1e2a251b29e84e1d6d762c78a9db5113f5ce7c48

攻击tx:

0x943c2a5f89bc0c17f3fe1520ec6215ed8c6b897ce7f22f1b207fea3f79ae09a6

相关其它合约

  • OLD_CELL = 0xf3E1449DDB6b218dA2C9463D4594CEccC8934346;
  • LP_OLD = 0x06155034f71811fe0D6568eA8bdF6EC12d04Bed2;
  • NEW_CELL = 0xd98438889Ae7364c7E2A3540547Fad042FB24642;
  • LP_NEW = 0x1c15f4E3fd885a34660829aE692918b4b9C1803d;
漏洞代码分析

迁移合约的工作原理是:将用户老的LP代币转到迁移合约地址,然后迁移合约调用removeLiquidity移除流动性。然后根据新池子中CELL和WBNB的比例,计算出需要的NEW CELL的数量。然后在新池子中添加流动性,新的LP代币会直接发送给用户。如果添加流动性需要的WBNB代币小于移除流动性获得的WBNB,那么将多余的WBNB退还给用户。

攻击者可以通过闪电贷操纵池子中两种代币的比例,使得旧池子中WBNB增加,OLD CELL减少,新池子中WBNB减少,NEW CELL增加。这样会导致旧LP撤销流动性的时候会获得更多的WBNB,添加新池子的时候只需要少量WBNB。

function migrate(uint amountLP) external  {        (uint token0,uint token1) = migrateLP(amountLP);        (uint eth,uint cell, ) = IUniswapV2Router01(LP_NEW).getReserves();             uint resoult = cell/eth;                      token1 = resoult * token0;        IERC20(CELL).approve(ROUTER_V2,token1);        IERC20(WETH).approve(ROUTER_V2,token0);        (uint tokenA, , ) = IUniswapV2Router01(ROUTER_V2).addLiquidity(            WETH,            CELL,            token0,            token1,            0,            0,            msg.sender,            block.timestamp + 5000        );        uint balanceOldToken = IERC20(OLD_CELL).balanceOf(address(this));        IERC20(OLD_CELL).transfer(marketingAddress,balanceOldToken);        if (tokenA < token0) {            uint256 refund0 = token0 - tokenA;            IERC20(WETH).transfer(msg.sender,refund0);        }     }    function migrateLP(uint amountLP) internal returns(uint256 token0,uint256 token1) {        IERC20(LP_OLD).transferFrom(msg.sender,address(this),amountLP);        IERC20(LP_OLD).approve(ROUTER_V2,amountLP);        return IUniswapV2Router01(ROUTER_V2).removeLiquidity(            WETH,            OLD_CELL,            amountLP,            0,            0,            address(this),            block.timestamp + 5000        );    }攻击过程分析

1.攻击者从dodo借出WBNB。

2.从pancake V3中借出NEW CELL,并调用了攻击合约中的0xa1d48336方法。

3.通过调用0xa1d48336方法,在V2池子中将借来的NEW CELL全部换成了WBNB,然后将大量WBNB换成OLD CELL,这会导致新池子中WBNB减少,旧池子中OLD WBNB的比例升高。然后攻击者调用流动性迁移合约的migrate方法,移除旧池子流动性的时候,获得的WBNB会增多,然后添加新池子流动性的时候,只需要少量的WBNB。

4.然后将新池子中的lp代币移除流动性,获得WBNB和NEW CELL。

5.因为之前借了NEW CELL,因此将WBNB换成换成NEW CELL,OLD CELL已经没用了,将OLD CELL换成WBNB,并偿还V3 pool借来的NEW CELL。

6.分别在V3和V2池子中将NEW CELL卖出换成WBNB,最后归还dodo闪电贷出的WBNB。

返回列表