SOD:CertiK:Soda项目智能合约安全漏洞分析_ODA

判断一个人到底属于什么资产阶级,只需要看他的负债率。简而言之,借的钱越多,代表你越有钱。

所以借钱从某种角度上来讲,是属于富人的游戏。通过借贷手段合理分配资产从而达到收益也是理财的精髓。

相信每个人都好奇过,银行到底拿我们存的钱去做什么了呢?

从这种角度上来讲,银行属于最大的欠款方。那如果,突然有人攻破了银行系统,强制银行“还款”,然后本来需要还到储蓄者账户里的钱款直接被攻击者收入囊中,储蓄者和银行都将成为最大的受害方。

北京时间9月21日,CertiK安全研究团队发现soda区块链项目中存在智能合约安全漏洞,该漏洞允许任意外部调用者通过调用智能合约函数,无视受害用户债务中的代币数目,强行结算受害用户的债务,并将通过结算操作所得的收益转入到自己的收款地址。

Balancer将为LSD协议StaFi的rETH-ETH池创建Gauge,BAL释放上限为10%:2月8日消息,流动性质押衍生品协议 StaFi 在 Balancer 社区提议为以太坊上的 rETH-ETH 池创建一个 Balancer Gauge,BAL 释放上限为 10%。StaFi 将使其 Balancer rETH-ETH 池成为以太坊主网上 rETH 的主要流动性来源。通过增强池的流动性,Balancer 将会从增加的交易费用中获益。目前该提案已获得 Balancer 社区投票通过。

StaFi 于 2020 年第三季度推出,重点是为以太坊和其他权益证明链(例如 Polygon、Solana 和 Polkadot)上的抵押资产带来流动性。与其他 LSD 协议类似,StaFi 发行流动性收据 Toekn (rETH),代表用户通过无许可的验证器集在信标链上质押的以太坊份额。自推出以来,该协议已在 11 种 Token 中积累了价值超过 3600 万美元的质押资产,并拥有 3439 个活跃验证者。[2023/2/8 11:54:54]

soda项目官方现在已经提交修复补丁来修复这个安全漏洞,但由于soda项目采用了TimeLock来将所有的操作延迟48小时,修复补丁会在延迟事件之后生效,因此截止发稿时,该漏洞已完成修复。

Balancer发起新提案,拟将额外收取的wstETH退还至流动性提供者:3 月 9 日,去中心化交易平台 Balancer 发起社区提案投票,计划将额外收取的 wstETH 退款至流动性提供者。此前由于协议费收取设计机制问题,Balancer 的协议费收集合约积累大量额外收取的 wstETH。Balancer 计划以空投形式将其分发给实际受影响的流动性提供者,Gas 费将由 BalancerDAO 的金库支付。此次投票将于 3 月 12 日 3:00 结束。[2022/3/9 13:47:01]

漏洞技术分析

图一

soda项目中的WETHCalculator.sol智能合约中存在逻辑实现错误导致的安全漏洞,图一中WETHCalculator.sol智能合约第193行,maximumLoad的计算公式错误的使用了amount作为基础值。

Cere Network获得3100万美元的融资 Polygon和Republic领投:金色财经报道,区块链管理系统开发商Cere Network表示,它在由投资平台Republic和Polygon领投的一轮融资中筹集了3100万美元,资金将用于新员工、开发者网络增长和应用程序开发。公司还将利用这笔资金加速将其去中心化数据云集成到Polygon的协议中,预计在与Polkadot整合的第三季度末完成。(Coindesk)[2021/9/9 23:13:11]

因此,在196行满足require()判断的检测条件loanTotal>=maximumLoan可以转换为:

loanInfo.amountinterest>=loanInfo.amount*maximumLTV/LTV_BASE

Balancer V2预计将在3月推出 将在Gas费、资金效率等方面优化:Balancer V2版本预计将在3月推出。Balancer 创始人Fernando发布文章介绍Balancer V2。文章中指出Balancer V2的核心原则是安全性、灵活性、资金效率和Gas效率。这些亮点包括:机池、提升Gas效率、可定制的AMM logic、通过资产管理者提升资产效率、降低Gas费用、弹性预言机、社区治理协议费用。[2021/2/3 18:46:07]

由于maximumLTV/LTV_BASE的值是在0.15-0.95区域中变动,并且interest>=0。因此图一196行的require()判断中的检测条件总是为真。

失去了该require()判断的保护,任何外部调用者可以通过调用以下图二中SodaBank.sol中104行的collectDebt()函数来将任意loadId的贷款清空。在执行该函数的过程中,图一中的collectDebt()函数会在图2第121行被执行,并通过123行和125行代码将该用户锁在soda里面的WETH的其中一部分转移到该外部调用者的地址msg.sender中:

图二(参考链接2)

通过以上漏洞,任何外部调用者都可以通过调用SodaBank.sol中的collectDebt()并传入其他用户的loadId来清空该用户在soda中的代币。

官方修复细节

soda官方为修复以上漏洞,设计了新的智能合约WETHCalculatorFixed.sol来替换WETHCalculator.sol。

通过分析可以看到在图三WETHCalculatorFixed.sol智能合约第979行,maximumLoan的计算公式被正确的计算为loanInfo.lockedAmount?*maximumLTV/LTV_BASE。因此,图三中第982行require()判断的检测条件变更为:

loanInfo.amountinterest>=loanInfo.lockedAmount*maximumLTV/LTV_BASE

图三

该等式的代码实现与soda项目中的逻辑设计相符,该等式的真假与用户的借贷债务数目和被锁本金数目相关。漏洞完成修复。

soda项目中关于该等式的逻辑设计细节可以从下面的链接中进行了解:

https://medium.com/soda-finance/the-soda-revolution-9185fdb99fc1

事件分析总结

该漏洞是由于逻辑设计与代码实现不符而造成。当前常用的单元测试等测试方法以及自动化的测试工具均无法有效的查找到该种与逻辑相关的漏洞。

因此,CertiK安全团队有以下安全建议:

安全是区块链项目的立足之本,任何区块链项目在上线前需要请专业第三方安全审计团队对项目整体代码进行安全审计。

当前区块链检测工具对智能合约的检测均无法检测其逻辑上出现的漏洞,其结果也没有可信的数学证明作为支撑。形式化验证是当前唯一被证明可以产生可信数学证明的软件验证方法。采用基于形式化验证方法的区块链检测工具来验证项目中的安全漏洞,应成为每一个项目在上链前的必经步骤。

参考链接:

图一:

https://github.com/soda-finance/soda-contracts/blob/master/contracts/calculators/WETHCalculator.sol#L189

图二:

https://github.com/soda-finance/soda-contracts/blob/master/contracts/components/SodaBank.sol#L104

图三:

https://github.com/soda-finance/soda-contracts/blob/master/contracts/calculators/WETHCalculatorFixed.sol#L275

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

区块博客

[0:0ms0-3:710ms