LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 行情分析 > Compound Tether集成审计

Compound Tether集成审计

2020-06-10 DeFi传教士 来源:区块链网络


在初始阶段后,Compound团队雇用我们完成对Tether的USDT代币集成到PriceOracleProxy智能合约的审计,以及审计一些已审计基础代码的小改动,例如gas燃料优化,更新以实现Solidity0.6.0风格继承。审计的提交版本是Compound私有仓库的65e870f7f45dca0a7a3a70209da9c5aec9d27c13。

安全假设

抵押代币,转移手续费和清算激励
稳定币在Compound中成为一个作为抵押代币的的天然选择。最广泛使用的一种代币,USDT,能在transfer或transferFrom(USDT合约代码的131行)的接收中提取手续费。虽然在发文时USDT并没这样做,但它仍也有能力做,除非USDT所有者可以证明销毁他们的所有权。
Compound的doTransferIn函数的早期重构已完成,可以正确地处理基于transfer或transferFrom潜在代币从接收中提取手续费的场景,因此,即使征收这样的费用,Compound内部账单依然准确。
重要的是,假如转移手续费被潜在代币征收,它有可能影响到Compound的清算机制。尤其是,当清算者考虑清算低于抵押借贷是否获利时,会将转移手续费作为一个考虑因素。如果转移手续费超过了Compound清算激励,然后清算不会盈利并且清算机制可能失败。
目前,Compound未打算让USDT用作抵押品。如果他们这样做,USDT最大转移手续费费是50个基点(0.5%),而Compound清算激励目前是8%。因此它还不会威胁到清算机制的激励兼容性。
然而,当添加一种新代币至Compound以及调整Compound的清算动机时必须考虑这种动态。在这个报告中,我们将假设清算激励将一直超过用作抵押品代币的征收手续费。

USDC和USDT价格稳定性
新代码修复了USDT和USDT的报价锚定1USD。也就是说,不同于有个活跃受信任的第三方价格预言机来检测USDT和USDC的真实价格并报告给Compound,智能合约一直假设这些资产的市价为1USD。
使用一个活跃受信任的第三方价格预言机会带来自身的风险,像我们之前审计中讨论到的。假设USDT和USDC稳定币仍然完全锚定1USD也会带来不同的风险。
例如,如果一种这样的稳定币超过了1USD(如果一家大型交易所冻结除稳定币外的所有资产的提款,从而导致对稳定币的高需求时可能发生),一些Compound借贷可能会低于抵押而没被Compound智能合约检测到,因而这些借贷的清算没有发生。类似的,如果如果稳定币(被用作抵押品)的市场价格低于1USD,一些借贷可能变成低于抵押状态而没被Compound合约检测到,因而这些借贷的清算也不可能发生。在一种稳定币的真实市价跌至低于它抵押因子的的极端场景,一些借贷可能全部潜水而没被Compound的智能合约检测到,可能会威胁到Compound的清偿能力。
在USDC和USDT的场景,要考虑这些稳定币的抵押因子设置(USDT为0,USDC为0.75),Compound团队认为固定价格假设相关的风险小于受信任第三方预言机相关的风险。这就是使用这些资产的固定价格替代使用活跃价格预言机背后的动机。
这带来了一个新的安全假设。尤其是,我们假设USDC和USDT的真实市价依旧足够接近1USD,上述的问题没有发生。然而,我们建议Compound团队积极监控这些资产的真实市价,准备在真实市价偏离1USD时暂停受影响的市场。

修改的高级概览

已审计的补丁包括对“Price Oracle”智能合约PriceOracleProxy、PriceOracle和SimplePriceOracle的细微修改。补丁准备好了合约对USDT的集成。修改了CToken合约的accrueInterest函数,移除了checkTransferIn函数。它也包含了CToken和CErc20Delegator合约的gas燃料优化,包含减少使用CToken的SLOADs数量,直接通过msg.data使用CErc20Delegato,这减少了不必要的重封装。最后,跟之前审计阶段审计检查的一样,补丁减少了整个代码中localVars结构的使用,移除了在接口中声明的Constants的任何实例,在一些合约中提升Solidity版本至0.5.16,转换许多CarefulMath实例用SafeMath替代。
对于这个版本中accreuInterest的修改,checkTransferIn的移除,以及大量对代码的小优化,我们没有发现任何安全问题。
为验证gas燃料优化的修改,在使用内存变量替代存储变量,以及doTransferIn函数不需要checkTransferIn后,我们确认CToken合约维持相同的行为。我们也验证了CErc20Delegator合约依然正确委托调用给实现。
所有修改的详细列表可以在这个提交消息中找到。

接下来按照重要程度我们列出我们的建议。

严重风险



高风险



中风险

[M01]未文档化的汇编块
CErc20Delegator合约包含了多个汇编块。
虽然这本身并不构成安全风险,而且经过彻底审查后,代码也不存在漏洞,但这些块是系统一个重要部分,应该更好地文档化。此外,这些低级语言很难被读者理解,可以考虑包含广泛的文档说明关于它的使用,清晰解释每一个汇编指令做什么。这让便于用户信任代码,便于审查人员验证,便于开发者基于它构建或更新。
特别考虑说明地是:
* 为何参数从calldata移除
* 没有return关键字,delegateAndReturn和delegateToViewAndReturn如何提供返回值。
* 在delegateTo和delegateToViewImplementation的返回中存在的0x20硬编码值是为了偏移一个字节数组,以及这个偏移的原因。
* 为何偏移没有用到delegateToViewAndReturn和delegateAndReturn函数的返回。
* 为何在delegateToViewAndReturn函数中返回被0x40取代,为何它不需要在delegateAndReturn函数里。
注意汇编的使用丢失几个Solidity重要的安全功能,就是哪些可能使代码不安全或哪些是代码出错。因此,可以考虑实现全面的测试来覆盖这些功能的所有潜在用例,以确保它们的行为符合预期。

低风险

[L01]SimplePriceOracle中的可能的价格操控
SimplePriceOracle合约的setUnderlyingPrice和setDirectPrice函数让调用者在合约存储中设置资产价格。然而,这些函数未实现任何访问控制机制,它们的可见性设为public,因而让任何用户可以执行它们。
任何使用此预言机来确定资产价格的智能合约都可能受到任何人的价格操纵攻击。
虽然Compound已解释这个合约仅部署在测试网络,可以考虑指定相关注释或文档,可以考虑强制程序化,也许可以保证chainid不为1.
对于一般公众场合和整个DeFi空间,我们强调,该合约不能部署到主网。

[L02]PricePosted事件中缺乏索引参数
定义在SimplePriceOracle智能合约的PricePosted事件中没有参数被索引。
可以考虑索引asset参数更易于对指定事件的搜索和过滤的任务。

[L03]SCD关闭后SAI价格未改变
在PriceOracleProxy智能合约中,setSaiPrice可以在单抵押DAI关闭时被调用一次,以设置Compound的SAI价格。然后这个价格不再改变。其目的是在SCD关闭后锚定等于交易率是因Maker购买SAI换取ETH。
预料到这点,Compound已经关闭供应或借贷SAI的功能。用户仅能提现SAI或用SAI偿还借贷。值得注意的是,持有SAI的用户仍然可以贷款。
虽然SAI的实际市场价格不太可能偏离锚定,但仍有可能偏离。假如这样,Compound将没有办法通过治理更新去修改SAI的内部价格。如果SAI真实市价增长,当用户使用SAI作为collatera时,它可能会造成混乱,因为用户将能够以低于预期的金额借款,而且清算的时间也比预期的要早。如果SAI真实市价跌了,持有SAI作为抵押品的用户可能能够借入比他们持有的SAI更多的价值,从而为该协议带来破产风险。
在SAI价格跌的不可能事件中,假设Compound拥有总计600,000SAI,使用SAI的抵押因子为0.75。Compound有风险损失450,000USD的价值。请注意,这将在SCD关闭后的ETH值中测量,所以这些数字可能会改变。但相比之下,Compound当前托管1.15亿USD的资产,与所有Compound市场的总体规模相比,这种风险很小。
万一SAI的市场价格偏离了锚定,可以考虑发起治理提案改变对SAI市价的活跃报价。另外,可以考虑使用borrowAllowed钩子去阻止用户任何更多的借贷直到他们cSAI的balanceOf为0。

注意&额外信息



总结

没有严重或高风险问题发现。建议降低涉及特定市场条件的边缘场景的风险,提高项目的整体质量和健壮性。我们建议监控USDT和USDC的真实市价,如果价格明显偏离1USD,则暂停Compound市场。总的来说,我们发现代码非常干净,组织良好,易于理解。

原文链接:https://blog.openzeppelin.com/compound-tether-integration-audit

最后提醒一下,市场有风险,本文只是个研究,不作为投资建议,请合理控制风险。

点赞就是对传教士最大的鼓励,谢谢支持。

—-

编译者/作者:DeFi传教士

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...