Aave经历惊魂一刻 这个漏洞差点酿成一场危机
注:今日,DeFi安全审计公司Trail of Bits披露了Aave借贷协议此前存在的一个严重漏洞,在发现到该问题后,Aave迅速修复了该漏洞,从而避免了一场危机。
原文来自Trail of Bits:
12月3日,知名DeFi借贷协议Aave部署了V2版本,尽管我们并没有被雇佣来查看其代码,但在次日,我们还是对其进行了简单审查。很快,我们就发现了一个影响Aave V1和V2版本合约的漏洞,并报告了该问题。在将我们的分析发送给Aave的一小时内,他们的团队修复了该漏洞,以减轻潜在影响。如果该漏洞被利用,这一问题将破坏Aave,并影响外部DeFi合约中的资金。
据悉,有5家不同的安全公司审查了Aave代码库,其中有一些使用了形式化验证。然而,这个漏洞并没有被这些公司注意到。这篇文章描述了这一问题,以及“该漏洞是如何逃过检测”等其它的一些经验教训。此外,我们也在开发一种新的Slither检测器,它可以识别这一漏洞,从而为以太坊社区提高安全性。
Aave使用了delegatecall代理模式,这一点我们在过去的文章中已经详细讨论过了。简单来看,每个组件被分成了两个合约:(1)包含实现的逻辑合约,(2)包含数据并使用delegatecall与逻辑合约进行交互的代理。在逻辑合约上执行代码时,用户与代理合约进行交互。这是delegatecall代理模式的简化表示:
在Aave中,LendingPool(LendingPool.sol)是使用delegatecall代理的可升级组件。
而我们发现的漏洞依赖于这些合约中的两个功能:
可以直接调用逻辑合约的函数,包括初始化函数;
借贷池具有其自己的delegatecall功能;
这种可升级模式的一个限制是,代理不能依赖逻辑合约的构造函数(Constructor)进行初始化。因此,状态变量和初始设置必须在公共初始化函数中执行。
在LendingPool中,初始化函数设置提供者地址(_addressesProvider):
initializer调节器防止多次调用initialize,它要求满足以下条件为true:
以下:
初始化允许在相同交易中多次调用调节器(因此有多个initialize函数);
isConstructor()是代理执行代码所需的;
revision > lastInitializedRevision 允许在合约升级时再次调用初始化函数;
虽然它通过代理,预期可正常工作,但是(3)也允许任何人直接在逻辑合约上调用initialize函数。一旦逻辑合约被部署:
revision将为0x2(LendingPool.sol#L56);
lastInitializedRevision将为0x0;
而漏洞是:任何人都可以在LendingPool逻辑合约中设置_addressesProvider。
LendingPool.liquidationCall直接委托调用(delegatecall)由_addressProvider返回的地址:
这允许任何人启动LendingPool逻辑合约,设置受控地址提供者,并执行任意代码,包括selfdestruct。
利用漏洞的场景:任何人都可以破坏借贷池逻辑合约。下面是一个简化的视觉表示:
就问题本身而言,已经是很严重了,因为任何人都可以破坏逻辑合约,并阻止代理执行借贷池代码。
然而,在代理合约中使用OpenZeppelin会加剧这一问题的严重性。我们在2018年撰写的一篇博客文章中强调,没有代码的合约委托调用(delegatecall)能在不执行任何代码的情况下返回成功。尽管我们最初发出警告,但OpenZeppelin并未在其代理合约中修复回退函数:
如果代理委托调用(delegatecall)了一个已破坏的借贷池逻辑合约,则代理将返回成功,而不会执行任何代码。
由于Aave可以更新代理以指向另一个逻辑合约,因此这种漏洞利用不会持久。但在可利用此漏洞的时间范围内,任何调用该借贷池的第三方合约,都将表现为某些代码已被执行,但实际却并未执行。这将打破很多外部合约的基本逻辑。
所有AToken(Aave代币):AToken.redeem调用pool.redeemUnderlying(AToken.sol#L255-L260)。由于调用什么也不做,用户将烧掉他们的AToken,而不会收到他们的底层资产;
WETHGateway(WETHGateway.sol#L103-L111):存款会存储在网关中,然后任何人都可以窃取存款资产;
任何基于Aave信用委托v2(MyV2)的代码库(MyV2CreditDelegation.sol);
如果我们发现的问题被利用,则Aave之外的很多合约都会受到各种方式的影响。确定一份完整的名单是困难的,我们没有试图这样做。这一事件凸显了DeFi可组合性的潜在风险,以下是我们找到的一些受影响的合约:
DefiSaver v1 (AaveSaverProxy.sol)
DefiSaver v2 (AaveSaverProxyV2.sol)
PieDao – pie oven (InterestingRecipe.sol#L66)
幸运的是,在我们报告这个漏洞之前,还没有人利用它。Aave对其两个版本的借贷池调用了initialize函数,从而保证了合约的安全:
LendingPool V1: 0x017788dded30fdd859d295b90d4e41a19393f423 修复时间: 2020年12月4日 07:34:26 PM +UTC
LendingPool V2: 0x987115c38fd9fd2aa2c6f1718451d167c13a3186 修复时间: 2020年12月4日 07:53:00 PM +UTC
长期而言,合约部署者应:
在所有逻辑合约中添加一个构造函数(constructor )以使initialize函数无效;
检查delegatecall代理fallback函数中是否存在合约;
仔细检查delegatecall陷阱,并使用slither-check-upgradeability;
Aave的代码库经过了形式化验证,区块链领域的一个趋势是,人们会认为安全特性是圣杯。用户可能会尝试根据这些特性的存在与否,对各种合约的安全性进行排序。我们认为这是危险的,它会导致错误的安全感。
Aave形式化验证报告列出了 LendingPool 视图函数(例如,它们没有副作用)以及池操作(例如,操作成功后返回true且不还原)的属性。例如,已验证的属性之一是:
然而,如果逻辑合约遭到破坏,则该属性可能会被破坏。那如何才能对此进行验证?虽然我们无法访问定理证明或所使用的设置,但很可能证明proof没有考虑可升级性,或者prover不支持复杂的合约交互。
这在代码验证中是很常见的。你可以通过对整体行为的假设来证明目标组件中的行为,但是在多合约设置中证明属性是具有挑战性和耗时的,因此必须进行权衡。
形式化验证技术很棒,但是用户必须意识到它们覆盖范围很小,并且可能会错过攻击媒介。另一方面,自动化工具和人工审查可帮助开发人员以较少的资源来提升代码库的安全性。了解每种解决方案的优点和局限性,对开发人员和用户而言都至关重要。当前的问题就是一个很好的例子,Slither可以在几秒钟内发现这个问题,受过训练的专家可能会很快指出它,而要用安全特性来检测,则需要付出很大的精力。
Aave做出了积极反应,并在发现问题后迅速修复了该漏洞。危机避免了,但最近遭受黑客攻击的其他受害者却没有那么幸运。在部署代码并将其暴露于对抗性环境之前,我们建议开发者:
查看这里的检查表和训练;
将Slither添加到你的持续集成管道中并调查其所有报告;
给安全公司适当的时间来审查你的系统;
请注意可升级性,至少请审查合约升级反模式,合约迁移的工作方式,以及使用OpenZeppelin的可升级性;
我们希望通过分享此信息以及与此问题相关的Slither检测器来防止类似的错误。
注:今日,DeFi安全审计公司Trail of Bits披露了Aave借贷协议此前存在的一个严重漏洞,在发现到该问题后,Aave迅速修复了该漏洞,从而避免了一场危机。
原文来自Trail of Bits:
revision > lastInitializedRevision 允许在合约升级时再次调用初始化函数;
聚币Jubi已于今日开放AAVE/USDT交易:据官方消息,聚币Jubi已完成Aave Protocol(LEND)智能合约置换为Aave Protocol(LEND),并已于2020年10月15日11:00(UTC+8)开放AAVE/USDT交易。 \nAAVE(Aave Protocol)是一种去中心化的非托管货币市场协议,用户可以在其中充当存款人或借款人,AAVE令牌是Aave协议的新管理令牌。AAVE总量1600万,其中1300万AAVE为100LEND兑换1AAVE,300万AAVE为增发部分用于安全池建设、激励借贷生态、协议投票治理与协议升级。[2020/10/15]
火币DeFi实验室新增Curve、Aave、Synthetix等10家区块链项目加盟:火币集团新组建的去中心化金融部门DeFi实验室宣布Curve、Aave、Synthetix、Balancer、Zapper、Zerion、Loopring、Bitpie、Mykey和CoinGecko共十家头部区块链团队已正式宣布加入其全球DeFi联盟,成为联盟第二批成员。至此,全球DeFi联盟已有15名正式成员。 \n此前报道,8月中旬,该实验室宣布发起成立全球DeFi联盟,由全球中心化和去中心化金融服务商及平台共同促成。全球DeFi联盟由火币DeFi实验室联合MakerDAO、Compound、NEST社区、dYdX共同发起,将共同推进DeFi的研发,建立通用协议和标准,促进全球跨境协作和生态系统的发展。[2020/9/15]
数据:SushiSwap总锁仓量跌破9亿美元,Aave锁仓量跻身第一:随着9月6日凌晨ETH价格暴跌,DeFi锁仓总价值也骤降, DeBank数据显示总锁仓量已跌破90亿美元关口,当前为88.9亿美元,其中Sushiswap锁仓量跌幅最大,目前已经跌破9亿美元(8.651亿美元),距其最高锁仓量已缩水超55%。现在锁仓量排名前五位的DeFi协议分别是:Aave(13亿美元)、Uniswap(13亿美元)、Maker(13亿美元)、Curve(11亿美元)、YFI(10亿美元)。[2020/9/6]
标签:
区块链热门资讯
12月17日17:13,金色财经数据显示,BTC短线上涨,突破23400美元关口,日内涨幅达到13.27%。继昨晚突破20000美元大关后,BTC行情持续创新高。 分析师指出,掀动本轮BTC牛市行情的原因为高净值人士和机构投资者的入场和宏观环境的变化,并预测,随着市场热度的进一步发酵,市场的投资主力可能会出现结构性变化,由机构投资者转向中小投资者。
2020/12/17 17:45:542020 年的最后一个月,一定会在加密货币的历史复盘中被一遍又一遍被提及,全球加密货币总龙头比特币先是刷新了自己的历史新高 19,800 美金,随后在 2020 年 12 月 16 日,在从诞生到现在 12 年的历史中,比特币首次站上 2 万美金,市值也首次突破 4000 亿美金大关,约合人民币 26,330 亿人民币,差不多是一个茅台的市值。
2020/12/17 17:35:02这篇文章是一个内容更充实的版本,是我之前在推特风暴上做的关于法定货币和通货膨胀对个人时间偏好的影响的扩展。 在奥地利经济学中,有一个叫时间偏好的概念,简而言之就是:“个人对现在与未来的估价比率。” 正如《比特币标准》作者 @saifedean所说的那样。这是消费或储蓄(稍后再消费)之间的一种内部权衡。
2020/12/17 17:02:53本文是作者在11月29日由中国国际商会和中国投资协会联合主办“大变局”数字经济线上研讨会上的主题发言。 以下是朱嘉明先生的发言: 大家好,我有一些想法,想借助这次机会,把这个想法跟大家一起讨论。
2020/12/17 15:47:44反是政府动用立法、司法力量,调动有关组织和商业机构对可能的活动予以识别,对有关款项予以处置,对相关机构和人士予以惩罚,从而达到阻止犯罪活动目的的一项系统工程。从全球来看,反是金融监管中非常重要的工作。 随着区块链技术的广泛应用,以比特币为主的数字货币,以及越来越多基于区块链技术的数字资产开始出现。
2020/12/17 15:36:51DAO如同一个神秘的天使?,在世界上空徘徊。这并非是一股势力,也不是一段神话。所有看到过天使的人都想用自己的观点,自己的理解来诠释它。这显然在世界上可以引起一场用各国文字,各国语言的大讨论。
2020/12/17 15:36:45