BasketDAO - 参数验证漏洞

admin 2024年2月6日09:09:45评论20 views字数 3721阅读12分24秒阅读模式

8点击蓝字

BasketDAO - 参数验证漏洞

关注我们

声明

本文作者:peiqi

本文字数:3939字

阅读时长:约4分钟

附件/链接:点击查看原文下载

本文属于【狼组安全社区】原创奖励计划,未经许可禁止转载

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,狼组安全团队以及文章作者不为此承担任何责任。

狼组安全团队有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经狼组安全团队允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

BasketDAO - 参数验证漏洞

2024年1月17日,受害者由于 BasketDao 授权未取消,攻击者利用历史漏洞进行攻击,导致大约114万美元的损失

相关地址

攻击者地址: 0x63136677355840f26c0695dd6de5c9e4f514f8e8 

受害者地址: 0x07d7685bECB1a72a1Cf614b4067419334C9f1b4d 

漏洞合约地址: 0x4622aff8e521a444c9301da0efd05f6b482221b8 

攻击交易: 0x97201900198d0054a2f7a914f5625591feb6a18e7fc6bb4f0c964b967a6c15f6 

攻击合约地址: 0xae5919160a646f5d80d89f7aae35a2ca74738440

攻击过程

1.攻击者提前创建攻击合约BasketDAO - 参数验证漏洞2.进行攻击将获利约 114万 ETHBasketDAO - 参数验证漏洞3.将获利混币后离场BasketDAO - 参数验证漏洞

攻击分析

漏洞出现于合约 BMIZapper 中的 zapToBMI 函数中BasketDAO - 参数验证漏洞

   function zapToBMI(
address _from,
uint256 _amount,
address _fromUnderlying,
uint256 _fromUnderlyingAmount,
uint256 _minBMIRecv,
address[] memory _bmiConstituents,
uint256[] memory _bmiConstituentsWeightings,
address _aggregator,
bytes memory _aggregatorData,
bool refundDust
) public returns (uint256) {
uint256 sum = 0;
for (uint256 i = 0; i < _bmiConstituentsWeightings.length; i++) {
sum = sum.add(_bmiConstituentsWeightings[i]);
}

// Sum should be between 0.999 and 1.000
assert(sum <= 1e18);
assert(sum >= 999e15);

// Transfer to contract
IERC20(_from).safeTransferFrom(msg.sender, address(this), _amount);

// Primitive
if (_isBare(_from)) {
_primitiveToBMI(_from, _amount, _bmiConstituents, _bmiConstituentsWeightings, _aggregator, _aggregatorData);
}
// Yearn (primitive)
else if (_isYearn(_from)) {
IYearn(_from).withdraw();
_primitiveToBMI(
_fromUnderlying,
_fromUnderlyingAmount,
_bmiConstituents,
_bmiConstituentsWeightings,
_aggregator,
_aggregatorData
);
}
// Yearn (primitive)
else if (_isYearnCRV(_from)) {
IYearn(_from).withdraw();
address crvToken = IYearn(_from).token();
_crvToPrimitive(crvToken, IERC20(crvToken).balanceOf(address(this)));
_primitiveToBMI(
USDC,
IERC20(USDC).balanceOf(address(this)),
_bmiConstituents,
_bmiConstituentsWeightings,
address(0),
""
);
}
// Compound
else if (_isCompound(_from)) {
require(ICToken(_from).redeem(_amount) == 0, "!ctoken-redeem");
_primitiveToBMI(
_fromUnderlying,
_fromUnderlyingAmount,
_bmiConstituents,
_bmiConstituentsWeightings,
_aggregator,
_aggregatorData
);
}
// Aave
else if (_isAave(_from)) {
IERC20(_from).safeApprove(AAVE_LENDING_POOL_V2, 0);
IERC20(_from).safeApprove(AAVE_LENDING_POOL_V2, _amount);
ILendingPoolV2(AAVE_LENDING_POOL_V2).withdraw(_fromUnderlying, type(uint256).max, address(this));

_primitiveToBMI(
_fromUnderlying,
_fromUnderlyingAmount,
_bmiConstituents,
_bmiConstituentsWeightings,
_aggregator,
_aggregatorData
);
}
// Curve
else {
_crvToPrimitive(_from, _amount);
_primitiveToBMI(
USDC,
IERC20(USDC).balanceOf(address(this)),
_bmiConstituents,
_bmiConstituentsWeightings,
address(0),
""
);
}

// Checks
uint256 _bmiBal = IERC20(BMI).balanceOf(address(this));
require(_bmiBal >= _minBMIRecv, "!min-mint");
IERC20(BMI).safeTransfer(msg.sender, _bmiBal);

// Convert back dust to USDC and refund remaining USDC to usd
if (refundDust) {
for (uint256 i = 0; i < _bmiConstituents.length; i++) {
_fromBMIConstituentToUSDC(_bmiConstituents[i], IERC20(_bmiConstituents[i]).balanceOf(address(this)));
}
IERC20(USDC).safeTransfer(msg.sender, IERC20(USDC).balanceOf(address(this)));
}

return _bmiBal;
}

这个函数的目的是将指定的资产转换为 BMI代币,转换完成后,检查合约的BMI代币余额是否满足最小BMI接收量(_minBMIRecv),如果满足则将BMI代币转移给调用者。如果设置了refundDust参数为true,则将剩余的资产(如USDC)转换回USDC,并将USDC余额退还给调用者BasketDAO - 参数验证漏洞而在 _primitiveToBMI 方法中存在一个 call 调用,而 _aggregatorData 参数是外部可控的BasketDAO - 参数验证漏洞BasketDAO - 参数验证漏洞这里可以看到攻击者控制了calldata 进行攻击BasketDAO - 参数验证漏洞BasketDAO - 参数验证漏洞成功转走受害者资产BasketDAO - 参数验证漏洞但我们注意到有一点,这个漏洞并不是第一次被发现,早在2022年该项目就遭受到了攻击BasketDAO - 参数验证漏洞历史攻击交易 0x0a61a67f99501113c373284b6b6d52d128cf1b2926716774685e5a7ef82b12bc 可以看到攻击手法类似BasketDAO - 参数验证漏洞而受害者也是早期的参与者之一,与项目最近交互,合约授权都是在两年前BasketDAO - 参数验证漏洞奇怪的是,受害者在第一次漏洞爆发时没有被波及,却在很长一段时间后被死去的回忆攻击,我们看看受害者的钱包变动,发现当用户出售资产后短短时间内就被黑客直接转走BasketDAO - 参数验证漏洞结合攻击合约是提前部署的,说明攻击者实际上很早就盯上了钱包中的资产,我们回到被第一次攻击的区块中BasketDAO - 参数验证漏洞这里就可以找到当时不受到波及的原因了,虽然受害者钱包给予了漏洞合约USDC调用授权,但当时钱包中没有USDC代币,于是攻击者没有进行攻击。BasketDAO - 参数验证漏洞而漏洞合约授权因为当时没有被攻击,一直没有取消授权,被黑客想起来重新攻击了一次

欢迎研究区块链安全的师傅一起加入团队学习~

作者

BasketDAO - 参数验证漏洞

PeiQi

今天又是摸鱼的一天!

原文始发于微信公众号(WgpSec狼组安全团队):BasketDAO - 参数验证漏洞

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月6日09:09:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   BasketDAO - 参数验证漏洞http://cn-sec.com/archives/2474066.html

发表评论

匿名网友 填写信息