通过以上裂痕,任何外部挪用者都可以通过挪用SodaBank.sol中的collectDebt()并传入其他用户的loadId来清空该用户在soda中的代币。
通过阐明可以看到在图三WETHCalculatorFixed.sol智能合约第979行,maximumLoan的计较公式被正确的计较为 loanInfo[_loanId].lockedAmount * maximumLTV / LTV_BASE。因此,图三中第982行require()判定的检测条件改观为:
因此,CertiK安详团队有以下安详发起:
事件阐明总结
soda项目中的WETHCalculator.sol智能合约中存在逻辑实现错误导致的安详裂痕,图一中WETHCalculator.sol智能合约第193行,maximumLoad的计较公式错误的利用了amount作为基本值。
https://github.com/soda-finance/soda-contracts/blob/master/contracts/calculators/WETHCalculator.sol#L189
https://github.com/soda-finance/soda-contracts/blob/master/contracts/calculators/WETHCalculatorFixed.sol#L275
北京时间9月21日,CertiK安详研究团队发明soda项目中存在智能合约安详裂痕,该裂痕答允任意外部挪用者通过挪用智能合约函数,无视受害用户债务中的代币数目,强行结算受害用户的债务,并将通过结算操纵所得的收益转入到本身的收款地点。
loanInfo[_loanId].amount + interest >= loanInfo[_loanId].amount * maximumLTV / LTV_BASE
裂痕技能阐明
所以乞贷从某种角度上来讲,是属于富人的游戏。通过借贷手段公道分派资产从而到达收益也是理财的精华。
https://medium.com/soda-finance/the-soda-revolution-9185fdb99fc1
参考链接:
soda项目中关于该等式的逻辑设计细节可以从下面的链接中举办相识:
因此,在196行满意require()判定的检测条件 loanTotal >= maximumLoan可以转换为:
该裂痕是由于逻辑设计与代码实现不符而造成。当前常用的单位测试等测试要领以及自动化的测试东西均无法有效的查找到该种与逻辑相关的裂痕。
判定一小我私家到底属于什么资产阶层,只需要看他的欠债率。简而言之,借的钱越多,代表你越有钱(还款本领强)。
由于maximumLTV / LTV_BASE的值是在0.15-0.95区域中变换,而且interest >= 0。因此图一196行的require()判定中的检测条件老是为真。
图三:
该等式的代码实现与soda项目中的逻辑设计相符,该等式的真假与用户的借贷债务数目和被锁本金数目相关。裂痕完成修复。
相信每小我私家都好奇过,银行到底拿我们存的钱去做什么了呢?
官方修复细节
soda项目官方此刻已经提交修复补丁来修复这个安详裂痕,但由于soda项目回收了TimeLock来将所有的操纵延迟48小时,修复补丁会在延迟事件之后生效,因此截至发稿时,该裂痕已完成修复。
soda官方为修复以上裂痕,设计了新的智能合约WETHCalculatorFixed.sol来替换WETHCalculator.sol。
安详是区块链项目标驻足之本,任何区块链项目在上线前需要请专业第三方安详审计团队对项目整体代码举办安详审计。
从这种角度上来讲,,银行属于最大的欠款方。那假如,溘然有人攻破了银行系统,强制银行“还款”,然后原来需要还到储备者账户里的钱款直接被进攻者收入囊中,储备者和银行都将成为最大的受害方。
https://github.com/soda-finance/soda-contracts/blob/master/contracts/components/SodaBank.sol#L104当前区块链检测东西对智能合约的检测均无法检测其逻辑上呈现的裂痕,其功效也没有可信的数学证明作为支撑。形式化验证是当前独一被证明可以发生可信数学证明的软件验证要领。回收基于形式化验证要领的区块链检测东西来验证项目中的安详裂痕,应成为每一个项目在上链前的必经步调。
图一:
loanInfo[_loanId].amount + interest >= loanInfo[_loanId].lockedAmount * maximumLTV / LTV_BASE
图二:
失去了该require()判定的掩护,任何外部挪用者可以通过挪用以下图二中SodaBank.sol中104行的collectDebt()函数来将任意loadId的贷款清空。在执行该函数的进程中,图一中的collectDebt()函数会在图2第121行被执行,并通过123行和125行代码将该用户锁在soda内里的WETH的个中一部门转移到该外部挪用者的地点msg.sender中:
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。