OUSD遭“经典重入攻击”损失770万美元,DeFi安全亟待解决
近日,PeckShield 监控到 defi 协议 Origin Protocol 稳定币 OUSD 遭到攻击,攻击者利用在衍生品平台 dYdX 的闪电贷进行了重入攻击(Re-entrancy attack),造成价值 770万 美元的 ETH 和 DAI 的损失。
重入攻击是以太坊智能合约上最经典的攻击手段之一,著名的 the DAO 被盗事件就是攻击者运用重入攻击导致以太坊硬分叉,损失价值 5000 万美元以太币。
自今年4月起,DeFi 项目频遭重入攻击。4月18日,黑客利用 Uniswap 和 ERC777 标准的兼容性问题缺陷实施重入攻击;4月19日,Lendf.Me 也遭到类似重入攻击;11月14日,黑客利用 Akropolis 项目的 SavingsModule 合约在处理用户存储资产时存在的某种缺陷连续实施了 17 次重入攻击,损失 203万 枚DAI。
北京时间 2020 年 11 月 17 日,PeckShield 监控到稳定币 OUSD 遭到重入攻击。OUSD 是 Origin Protocol 推出的一种与美元挂钩的 ERC-20 稳定币,用户可通过将基础稳定币(例如 USDT、USDC、DAI)存入 Origin 智能合约来铸造 OUSD 稳定币,之后该协议会将基础稳定币投资于多个 DeFi 协议并进行收益耕作,为 OUSD 持有者赚取回报。
重入攻击重现 凭空创造2050万枚OUSD
PeckShield 通过追踪和分析发现,首先,攻击者从 dYdX 闪电贷贷出 70,000 枚ETH;
随后,在 UniswapV2 中先将 17,500 枚ETH 转换为 785万 枚USDT,再将所贷剩余的 52,500 枚ETH 转换为 2099万 枚DAI;
接下来,攻击者分四次铸造 OUSD 稳定币:
第一次通过 mint() 函数铸造 OUSD 时,攻击者确实在 Origin 智能合约中存放了 750万 枚USDT,并获得 750万 枚OUSD;
第二次通过 mintMultiple() 多种稳定币函数铸造 OUSD 时,攻击者在 Origin 智能合约中存放了 2050万 枚DAI 和 0 枚假“稳定币”,并在此步骤中通过重入攻击来攻击合约。攻击者将 2050万 枚DAI 和 0 枚假“稳定币”存入 VaultCore 中,此时智能合约收到 2050万 枚DAI,在尝试接收 0 枚假“稳定币”时,攻击者利用恶意合约进行劫持,在智能合约正常启动铸造 2050万 枚OUSD 之前,调用 mint() 函数,,此次恶意增发由 VaultCore 合约调用 rebase() 函数实施。
值得注意的是,为顺利实施劫持,攻击者在上述 mint() 函数调用时,真金白银地存入了 2,000 枚USDT,同时获得第三次铸币 2,000 枚OUSD。随后,调用 oUSD.mint() 函数第四次铸造 2050 万枚OUSD。
rebase 指代币供应量弹性调整过程,即对代币供应量进行“重新设定”。在 DeFi 领域有一类代币拥有弹性供应量机制,即每个代币持有用户的钱包余额和代币总量会根据此代币价格的变化而等比例变动。此时,攻击者共获得 2800.2万 枚OUSD,包括抵押的 750万 枚USDT、2050万 枚DAI 和2000 枚USDT。由于调用 rebase() 函数,攻击者所获得的 OUSD 总计上涨至 33,269,000 枚。
最后,攻击者先用所获得的 33,269,000 枚OUSD 赎回 1950万 枚DAI、940万 枚USDT、390万 枚USDC;再在 Uniswap 中将 1045万 枚USDT 兑换为 22,898 枚ETH,将 390万 枚 USDC 兑换为 8,305 枚ETH,将 190万 枚DAI 兑换为 47,976 枚ETH,共计 79,179 枚ETH,并将其中 70,000 枚 ETH 归还到 dYdX 闪电贷中。
据 PeckShield 统计,攻击者在此次攻击中共计获利 11,809 枚ETH 和 2,249,821 枚DAI,合计 770万 美元。
对于次攻击事件,Origin Protocol 官方回应称,正在积极采取措施,以期收回资金。
随着 DeFi 生态的蓬勃发展,其中隐藏的安全问题也逐渐凸显,由于 DeFi 相关项目与用户资产紧密相连,其安全问题亟待解决。
对此,PeckShield 相关负责人表示:“此类重入攻击的发生主要是由于合约没有对用户存储的 Token 进行白名单校验。DeFi 是由多个智能合约和应用所组成的’积木组合’,其整体安全性环环相扣,平台方不仅要确保在产品上线前有过硬的代码审计和漏洞排查,还要在不同产品做业务组合时考虑因各自不同业务逻辑而潜在的系统性风控问题。”
Scan QR code with WeChat