完整的攻击流程如下 1、攻击者使用合约先调用 Opyn 合约的 createERC20CollateralOption 函数创建 oToken 2、攻击合约调用 exercise 函数,传入已创建 vault 的地址 3、通过 exercise 函数中 for 循环逻辑执行调用两次 _exercise 函数 4、exercise 函数调用 transferCollateral 函数将 USDC 转给函数调用者(由于 for 循环调用两次 _exercise 函数,transferCollateral 函数也将执行两次) 5、攻击合约调用 removeUnderlying 函数将此前传入的 ETH 转出 6、最终攻击者拿回了此前投入的 ETH 以及额外的 USDC 攻击合约地址 0xe7870231992Ab4b1A01814FA0A599115FE94203fOpyn 合约地址 0x951D51bAeFb72319d9FBE941E1615938d89ABfe2攻击交易(其一) 0xa858463f30a08c6f3410ed456e59277fbe62ff14225754d2bb0b4f6a75fdc8ad修复建议 此次攻击主要是利用了 _exercise 函数中对 vaultToExerciseFrom 是否创建 vault 的检查缺陷。此检查未校验 vaultToExerciseFrom 是否是调用者自己,而只是简单的检查是否创建了 vault,导致攻击者可以任意传入已创建 vault 的地址来通过检查。 建议如下: 1、在处理用户可控的参数时应做好权限判断,限制 vaultToExerciseFrom 需为调用者本人。 2、项目方可以在项目初期或未完成多次严谨安全审计之前添加合约暂停功能与可升级模型,避免在发生黑天鹅事件时无法有效的保证剩余资金安全。 (责任编辑:admin) |