Compound预言机V3升级Bug分析
Compound预言机V3升级Bug分析
继上次Compound升级处Bug导致错误分发几十万COMP之后又出问题了,直接导致Compound里的ETH被冻住了,不能借不能提,而且这次升级也经过了各方审计的流程,属实没想到..

更新内容

看看这次升级v3更新了些啥
notion image
主要是把Uniswap的预言机从V2换到V3,直接看看更新后导致问题的代码修改部分
notion image
notion image
 

问题分析

可以看到,在升级之前,cToken地址传到getUnderlyingPrice函数中,会先通过getTokenConfigByCToken函数获取这个ctoken的配置信息
notion image
函数会先通过cToken获取配置信息,获取不到再通过cTokenunderlying获取。
而升级之后,是直接通过cTokenunderlying,也就是cToken包装的实际ERC20 token来获取配置信息。
可以看一下关于cToken的介绍
notion image
可以看到,CompoundcToken分为两种:
  1. CEther:包装以太币本身,涉及资产转移功能的相关接口略有不同
  1. CErc20:包装ERC20资产,token地址存储在underlying里面
 
这两者在代码实现中也是有一些不同的,而导致这次升级产生问题的关键在于,CEther是没有underlying的,因为它不需要包装ERC20资产。
notion image
所以在升级之后,预言机直接去获取CEtherunderlying是获取不到的,连这个变量这个函数都没有,强行调用直接会revert,而在借或赎回时,又必须调用预言机的getUnderlyingPrice,因为没法调用成功,所以借不了也赎回不了,直接冻结在里面了。
notion image
 

紧急修复

notion image
临时的修复办法在119提案中发布,办法也很简单,直接把预言机换成原来的预言机,但是也要等几天(DAO治理有时间差),升级的事估计要从长计议了,至少还得审一遍看看有没有别的问题,
其实因为native cointoken的不统一需要区别处理发生的问题也不少了,之前有跨链桥也因此产生过类似的漏洞,需要格外注意。
 

相关链接

  1. V3 Oracle:https://etherscan.io/address/0xad47d5a59b6d1ca4dc3ebd53693fda7d7449f165#code
  1. V2 Oracle:https://etherscan.io/address/0x65c816077c29b557bee980ae3cc2dce80204a0c5#code
  1. Proposal 117:https://compound.finance/governance/proposals/117
  1. Proposal 119:https://compound.finance/governance/proposals/119