宇宙链 宇宙链
Ctrl+D收藏宇宙链
首页 > BTC > 正文

纯干货分享(一) | DEFI安全问题之基础篇

作者:

时间:1900/1/1 0:00:00

区块链技术的诞生,为传统金融、数据隐私、供应链、跨境汇款等应用领域带来革命性的突破。其中「去中心化金融」便是当前最为火热的应用之一。

DEFI作为一个金融概念,其基石就是一个个的代币,代币分为很多种类,一般都是以代币标准进行分类的,比如知名的ERC20代币标准,以及非同质化代币(NFT)标准ERC721等等。因此作为DEFI的基石,代币层面的安全问题就不可忽视了。

今天成都链安技术团队为大家科普DEFI安全问题代币层面存在的安全问题:第一大类是代币本身的问题,第二大类是代币与DEFI交互中可能会遇到的安全问题。

#A.代币层面的问题

1.整型溢出问题

为什么整型溢出这么重要呢?最主要的原因就是因为他们一旦出现就会造成较大的资金损失。在0.8.0之前,EVM并不存在溢出检查机制,需要特别关注数值运算时的整型溢出问题;而在0.8.0之后,solidity推出了自带的溢出检查机制,从根本上避免了整型溢出问题,但是同样也要注意,当使用unchecked关键字时,其涉及的数字运算也是不检查溢出的。

整型溢出一般分为上溢和下溢,上溢是指当运算结果大于uint数据类型规定的取值上限时,会导致溢出到取值下限开始重新计算(一般即为0)。

例如uint8的取值范围是0-255,当给一个数据类型为uint8的变量a赋值为260时,就会导致溢出成0+(260-256)=4,从而a的取值就会变成4。同理当变量赋值比0小时,会导致下溢问题,比如一个uint8类型的变量b,赋值的时候为b=0-5,那么这时候b的取值不会是-5(uint8类型是无符号整型,所以没有负数),因此b的取值就会变成256-5=251。

下图为某代币的multiTransfer函数,该函数在对处理输入参数tokens数组累加时,未使用SafeMath进行整型溢出检查,使得攻击者有机会构造整型溢出攻击,导致totalTokensToTransfer的值上溢变为一个较小值而通过余额检查,转出巨额资产。

数据:加密做市商Jump Trading相关地址今日转出1万枚ETH:10月25日消息,被Nansen标记为“Jump Trading: 0x071 Robinhood Custody”的地址在5小时前转出1万枚ETH(约1338万美元),目前地址余额202.86万枚ETH(约27.13亿美元),10天、27天前该地址也曾分别转出1万枚ETH。[2022/10/25 16:37:50]

Ammbr合约的multiTtansfer函数

修改建议

在0.8.0版本以前建议引入SafeMath安全运算库来对数据进行运算,在0.8.0及以上版本使用unchecked时,建议使用require等函数对结果溢出进行检查。

2.函数权限设置错误

函数权限设置错误通常都是由于合约开发者的疏忽所致,很多内部函数在运行时会直接更改合约储存数据,而不进行相关的检查,如果这部分函数的可见性被设置为public或者external,将产生重大的安全漏洞。今年十月份AVATerraFinance就出现过这个问题,它将铸币函数mint的可见性修饰词设置为了public,这导致任意攻击者都能够进行铸币操作。

AvaterraToken的合约代码

修改建议

对铸币、权限更改等敏感函数做严格的权限检查;并根据业务逻辑确定这类函数的可见性。

3.权限过大

管理者拥有过大的合约权限,会出现用户资产量不可控和资产价值不稳定的情况。如管理员拥有随意转走和销毁用户余额的权限,则可将用户的资产随时归零;如管理员拥有无限铸币的函数权限,则可大量发行此类代币,使得代币价格迅速贬值。

下图为管理员能够随意销毁用户代币的函数,这里在修饰器上使用的是onlyRole的修饰器,并且重写了burnFrom函数导致可以任意销毁指定账户的代币。

安全团队:Alpha Centauri Kid官方Discord服务器遭到钓鱼邮件攻击:9月12日消息,据CertiK数据监测,Alpha Centauri Kid官方Discord服务器收到钓鱼邮件攻击,请不要点击,铸造或批准任何交易。[2022/9/12 13:24:24]

高权的burnFrom函数

修改建议

对管理员的权限范围做严格的审查,关注转移用户代币、违规销毁用户代币的操作点。建议删除这些留有隐患的代码,保障用户的财产安全。

4.自我增发漏洞

这种漏洞是一种很特别的逻辑漏洞,当用户自己给自己转账时,由于转账函数中设置了多个局部变量,导致了变量之间的互相覆盖,从而引起的自我增发漏洞。

这个漏洞很典型的例子是Troncrashcoin代币,其转账函数逻辑如下:

1.新建变量oldFromVal和oldToVal存储旧balances2.新建变量newFromVal和newToVal来存储新的balances,即oldFromVal+_value和oldToVal+_value3.将newFromVal和newToVal赋值给balances和balances

这时候就出现了一个问题,一旦_to地址和_from地址相同,balances就会被balances的值覆盖,导致之前减少的_value不起作用,从而产生了自我增发_value却没有减少_value的漏洞。

Troncrashcoin的_transfer函数

修改建议

项目方在开发完毕后需要对项目进行完整的测试,对各个功能点是否正常执行、对所有可调用的函数及其输入的参数进行完整的输入测试,验证业务逻辑是否符合要求,避免给用户带来损失。比如测试极值,自我转账等一系列特殊情况是否满足逻辑。

报告:预计到2030年有超过5亿人购买加密货币:金色财经报道,根据Alex Krüge收集的统计数据,他发布了一份关于未来投资及其用户群的报告。他的报告称,到2030年,加密货币可能会吸引超过5亿新消费者。消费者很可能来自中高收入阶层。(watcher.guru)[2022/9/12 13:23:17]

5.未正确校验传入参数

在函数的执行中如果未验证传入参数的合理性,就可能导致函数不按照预想的结果执行,比如permit函数如果未做零地址校验,且对应的代币的销毁代币方式是将代币发送至零地址,那么攻击者可以转移零地址中被销毁的代币。还例如在一些智能合约中会存在freeze函数,用于冻结账户,但是在进行代币转账时,只验证了来源账户,未对转入地址进行验证导致转入的代币无法提出,还需注意的有transferFrom要额外验证from地址。黑名单验证也有类似问题。

未检查0地址的permit函数

未验证转入地址的transfer函数

还比如ethernaut靶场中,NaughtCoin这道题,由于这个ERC20的只对了transfer做了lockTokens限定,没有对transferfrom进行限定,导致攻击者可以直接通过标准的erc20接口调用approve和transferfrom进行代币提取。

Ethernaut靶场的NaughtCoin

修改建议

所有由用户调用的函数都要对传入的参数进行合理性检查。避免参数使用不合理导致的异常。在使用具有限制的函数时,要验证传入不合要求的参数是否会绕过限制执行、或者有其他类似的函数可以进行绕过。

6.开发者后门

部分管理员在开发阶段会请人代为开发,这种情况下开发者如果在Token里面留下了后门,后续带着后门上线的Token会对项目和用户都造成损失。比如下面是代币HJL在铸造函数留的后门,导致每次铸币都有1%的增发代币流入0xfa这个地址,导致该代币的实际流通量大于显示值。

广东发布数字经济发展指引性文件,区块链等数字经济新兴产业重点布局:7月8日,在2022中国数字经济创新发展大会开幕式上,《广东省数字经济发展指引1.0》正式发布。《指引》也对广东如何部署两大“核心”其进一步明确。在数字产业化方面,《指引》提出,广东将围绕消费电子产业、电子系统产业、软件和信息技术服务业、互联网和相关服务等数字经济核心产业,以及云计算、大数据、人工智能、区块链、网络安全等数字经济新兴产业重点布局。对此,广东也将围绕加快重点产业培育、推动行业融通发展、优化产业生态环境三个层面,出台系列举措支持相关产业发展。(21财经)[2022/7/8 2:00:58]

HJL代币的mint函数

修改建议

建议代币上线前,多进行几次审核,并且验证部署代币的哈希和最终审核版本的哈希是否一致。

#B.DEFI交互中的代币问题

1.通缩型代币的差额套利

今年DEFI出现了一批以safemoon为代表的通缩型代币,用户在使用此类币交易时,会销毁部分代币,导致实际到账数量和支出数量并不一致。因此,如果类似于抵押池一类的DEFI项目根据转账数量来记录资产,一旦与此类代币进行交互,很容易出现项目实际拥有资产与记录值不一致的情况,这很容易被攻击者所利用,比如SafeDollar攻击事件。

SafeDollar攻击事件就是攻击者利用PLX代币转账时实际到账数量小于发送数量以及SdoRewardPool合约抵押和计算奖励上存在的逻辑缺陷,借助闪电贷控制SdoRewardPool合约中抵押池的抵押代币数量,进而操纵奖励计算,获得利益。

SdoRewardPool合约的deposit

这里我们用公式大概描述一下,奖励计算系数A=新产生的奖励代币SAO的数量/抵押池中抵押代币PLX数量,攻击者首先利用闪电贷获取大额资金,然后利用SdoRewardPool合约中更新奖励参数存在的逻辑漏洞和抵押代币PLX转账数量与实际到账数量可能不一致的特殊机制,导致奖励计算系数A急剧增大。然后利用另一个提前进行了抵押的攻击合约领取大量抵押奖励,从而恶意获得了大量的SAO代币。

央视携手TMELAND打造首个数实融合虚拟音乐世界节目体验:5月4日晚,央视《奋斗的青春——2022年五四青年节特别节目》播出的同时,央视携手腾讯音乐虚拟社交平台TMELAND共同打造首个数实融合虚拟音乐世界节目体验,累计超百万青年化身“数字人”体验这个融合了虚拟音乐世界、游戏技术等前沿文化科技的虚拟会场。

据悉,此次成功推出的首个数实融合虚拟音乐世界节目体验,得益于TMELAND首创的端云协同3D技术,该技术确保了虚拟音乐世界在手机端和PC端浏览同样流畅,打造了相对于数字分身大小的13万平方米超大虚拟空间,可容纳10万用户同屏互动,这是在无需下载独立APP的情况下,目前国内技术能实现的最大虚拟会场。[2022/5/5 2:50:31]

修改建议

建议合约用转账前后的资金变化作为实际合约收到的转账数量,而不是用户传入的参数,尤其是流动性交易更需要注意。以免出现代币自带手续费或者自动销毁等情况导致实际金额与记录金额不一致的情况,让攻击者利用来造成大量损失。

2.代币接口规范问题

在DEFI与代币交互时,遵循的是统一的代币接口规范,如果代币实现时没有遵循标准的接口规范,则可能会在交互过程中导致代码的逻辑执行异常。比如著名的泰达币(USDT)在部分链上代码实现就不符合ERC20的标准,在波场(TRON)和以太坊(ETH)的USDT代码中,都有着返回值不规范的情况。以太坊的USDT主合约中,transfer函数虽然有返回值,但是函数声明时却没有声明,导致后续没有返回值。

以太坊USDT主合约的transfer代码同样在波场的USDT中,主合约中的transfer函数继承的父合约的transfer。但是父合约的transfer虽然有声明返回值,但是函数中却没有返回值,因此会导致主合约的transfer会永久返回false。

波场usdt主合约的transfer代码

波场usdt子合约的transfer代码

因此这两个链上的USDT合约都不符合ERC20的标准,如果DEFI未注意该问题,可能就会导致资金被锁死在合约之中。

修改建议

在进行代币转账时,需要检查调用的代币合约的转账函数是否满足ERC20标准。对没有返回值的转账函数使用SafeERC20来执行转账,但是波场USDT的transfer函数未遵循其自有的TRC20规范,会导致函数返回默认的false。使得SafeTransfer执行失败,需要专门写函数调用。

3.ERC721,ERC777,ERC1155

可能引发的重入风险

重入漏洞算是一个比较知名的基础漏洞了,代币中当然也有这样的重入风险,比较典型的例子就比如ERC1155里面safeTransferFrom函数中会调用_doSafeTransferAcceptanceCheck函数,然而_doSafeTransferAcceptanceCheck里面会检测如果目标地址是合约的话,会调用他的onERC1155Received方法,这里如果DEFI合约编写不恰当,调用safeTransferFrom位置在重要操作(例如修改余额)之前,则会引发重入漏洞。

ERC1155的safeTransferFrom函数

ERC1155的_doSafeTransferAcceptanceCheck函数

比如下面这个合约,withdraw函数的amount减少放在了safeTransferFrom之后,一旦有恶意合约构建一个onERC1155Received来进行重入,那么多次重入以后就能够提取合约中的所有代币。

危险的DEFI代码

攻击合约

修改建议

重入漏洞可以使用检查-生效-交互模式来进行避免,对转账函数可以使用openzeppelin官方的ReentrancyGuard进行修饰。注意是否存在重要操作(例如修改余额)在外部调用之前,可能会导致重入风险。

4.无限授权

用户在与DEFI进行代币交互时,部分DEFI项目可能会直接向用户要求无限授权,然而这其实是个很不安全的行为,一旦DEFI项目的前端或者项目内部出现了一些漏洞和问题,用户的代币安全将会无法获得保障,因此通常来说DEFI项目最好让用户有选择性的给予授权值,以免造成不必要的代币资产损失。

在流动性挖矿项目UniCats中就存在无限授权。用户可以存入Uniswap代币,然后通过流动性挖矿获得项目方发行的MEOW代币。但是如果要参与挖矿,前端要求用户必须提供无限授权。用户在项目上质押了UNI代币,也可以将奖励与质押取回,但是项目方利用合约中的后门任何时候都可以将代币转走。所以用户在参与DEFI时必须注意保护账户的授权。用户在授权UniCats时收到了钱包提示,但是由于授权一般是DEFI的常见操作,用户往往会因为忽略细节而向合约无限授权。

MetaMask的无限授权提醒用户收到挖矿奖励取回质押后,已经从项目中退出,这时候往往更容易松懈。因为授权还未取消,项目合约有后门来让项目方进行调用,管理员就可以通过授权来转走用户的UNI。之后项目方提款跑路,使广大用户蒙受巨大的损失。

另一个例子是DegenMoney项目。DegenMoney这个项目没有在智能合约中暗留后门,而是创建了一个前端来进行两次授权交易。DegenMoney的参与者面临着窃取用户资金的风险。第一次授权是针对质押合约,第二次授权恶意地址,会导致资金被攻击者通过第二次授权地址使用transferFrom提取。用户提走合约里的代币无济于事,必须取消授权才能避免盗币事件的发生。

为了防止类似的事件再次发生,有网站可以提供查询服务来方便用户。使得用户及时了解授权信息,避免盗币风险。

修改建议

授权是代币的常见操作,建议用户重视自身财产安全,不要盲目相信项目方。定期使用查询网站来判断是否有授权过度的风险,发现之后及时取消。下面为地址授权查询平台

币安链官方区块链授权查询:https://bscscan.com/tokenapprovalchecker以太坊链官方区块链授权查询:https://etherscan.io/tokenapprovalchecker链上工具:https://mycointool.com/Approval

来源:金色财经

标签:TRAANSRANFERnSights DeFi TraderTitanswapTranche FinanceFER价格

BTC热门资讯
多地法院判决比特币等虚拟货币相关交易合同无效

近日,北京朝阳法院和东城区法院相继披露了辖内审理的一桩比特币“挖矿”合同案,且判决结果高度一致,均判定合同无效,后果自担.

1900/1/1 0:00:00
一文揭秘2021年区块链黑客攻击频发的原因

区块链是一片鼓励创新的热土,在某种角度上因其安全风险也成为了滋生犯罪的温床。当年众筹超过1.5亿美金的TheDAO被黑客盗币后,进行了硬分叉操作,由此产生了如今的以太坊.

1900/1/1 0:00:00
梦碎元宇宙,虚拟世界买房初体验

撰文:分析师Grace 11月23日,歌手林俊杰在推特上公布自己在元宇宙平台上Decentraland上购买了三个虚拟地块.

1900/1/1 0:00:00
简析美国对虚拟货币的监管政策现状以及展望

来源:孙铭律师,智堡年会演讲 整理:有匪,分布式资本 美国现有的监管体系及各部门的职能总体上,就美国的监管框架而言,由于没有统一以及一站式的立法和监管部门,导致监管成本以及合规成本高昂.

1900/1/1 0:00:00
OceanMollu丨元宇宙时代里的区块链技术是否即将迎来赚钱的“黄金期”呢?

区块链的本质其实就是一个去中心化的分布式数据库,能实现数据信息的分布式记录与分布式存储,能保证在其上的数据不会被篡改,不可伪造,数据的传递可以追溯.

1900/1/1 0:00:00
拥抱MetaWorld元宇宙经济体开启勇敢者的游戏

???戴上VR,瞬间抵达,平等社交,民主社区,全新产业经济,零门槛金融体制,MetaWorld元宇宙经济体中乌托邦式的社会形态将对所有人产生巨大的、黑洞般的吸引力.

1900/1/1 0:00:00