Transit Swap被盗超2800万美元 合约过度授权该如何防范?
前不久,闪兑交易平台Transit Swap 官方发布公告表示遭遇了黑客攻击。根据10月12日的官方公告,本次黑客攻击造成了总价值2890万美元的资金损失。在Transit Swap的呼吁下,白帽已归还了价值2400万美元的资金,目前还有价值490万美元的资金未归还。
黑客攻击原因
Transit Swap的官方公告在事故发生后称,根据其自查结果,确认了该事件是由于代码中的bug导致,而随后发布的慢雾安全团队报告对该事件进行了详细的分析。
Transit Swap本质是一个跨链DEX聚合器,它将市面上的主流DEX数据汇聚到一起从而给用户提供服务。用户在兑换使用过程中需要经过一个路由桥合约并对其进行授权。获得用户授权后,路由桥合约才能够调用用户用来兑换的Token。
然而Transit Swap的代码设计中却有着致命的缺陷。根据慢雾的分析,Transit Swap的路由代理合约、路由桥合约和权限管理合约在进行Token兑换时没有对接收的参数、调用数据、兑换合约地址等相关传入数据进行严格检查,导致了本次黑客攻击事件的发生。
黑客在发现这一漏洞后,将自己构造好的数据传入并调用了路由桥合约。最终,攻击者的兑换合约地址被指定为权限管理合约地址,从而窃取了所有对权限管理合约进行授权的用户的Token。
过度授权的风险
在本次攻击事件中,白帽虽然归还了超80%的窃取资金,但未归还的剩余资金仍然给用户带来了较大的损失。从事件复盘中可以看出,攻击者的资金窃取对象是对Transit Swap授权的用户。
我们在日常的DApp使用中,经常会遇到DApp申请授权的情况。这是因为在用户进行合约交互前,必须先给DApp授权,DApp的合约才能够调用你对应的加密资产进行兑换或者借贷等操作。
而大部分开发者为了减少用户授权次数,一般会设置授权相当大数量的Token给相应的智能合约。以PancakeSwap为例,如下图所示,对USDC交易进行授权时,授权金额达到了惊人的10的71次方数额。这种方式的确能够减少后续授权的麻烦以及gas费的消耗,例如下次还需要用USDC进行兑换时,就无需再进行授权,也无需再支付一次授权的gas费。
但是,10的71次方这么大的数额在节省你时间和小部分费用的同时,也意味着合约拥有了无限转走你钱包中USDC资产的权限。一旦出现类似于Transit Swap这样的漏洞,相当于攻击该合约的黑客也能够随时调用你的所有USDC,毕竟谁也不可能真的拥有超过10的71次方个USDC。
我们该如何防范?
1、不要将资产集中在一个钱包
我们在与DApp交互时,可以尽可能地将资产分类。例如使用一个钱包存放长线持有的大额加密资产,另外的钱包存放少量资产用于与Dapp交互。这样即便合约出现问题,也能将损失降低到最小。
2、设置小数额的授权上限
虽然大额授权可以节省后续使用的时间和gas费,但一旦发生黑客攻击事件,无限授权的方式存在着更大的风险。为了避免因小失大,我们尽可能采取“使用多少就授权多少“的策略。例如我需要在本次交易中使用100USDC进行兑换,那么我就可以在权限编辑中将授权数量从10的71次方更改为100,这样这笔兑换就刚好耗尽这次授权的额度。即便以后该合约发生黑客攻击,他也无法因为此次授权从我的钱包中转走USDC。
3、定期清理授权
对于已经进行授权的合约,我们可以采取定期清理的方式来保障自己的钱包安全。我们以以太坊浏览器上提供的授权取消工具为例来演示如何取消钱包授权。
首先打开 https://etherscan.io/tokenapprovalchecker 授权取消网站,并选择连接Web3钱包。
连接后就可以查看该钱包的Token(ERC-20)及NFT(ERC-721及ERC-1155)的资产授权情况,然后在最后一栏点击撤销授权。
随后浏览器会弹出取消授权的具体信息,点击“撤销”后进入下一步。
接下来就是确认并支付gas费了,点开权限详情就会发现,其实取消授权的方式就是将对该合约的授权最大数额改为0,从而达到取消授权的目的。
除了以太坊以外,还有其他区块链浏览器也提供了授权取消工具,常有的授权取消网站有:
ETH链授权取消:https://etherscan.io/tokenapprovalchecker
BSC链授权取消:https://bscscan.com/tokenapprovalchecker
Polygon链授权取消:https://polygonscan.com/tokenapprovalchecker
AVAX链授权取消:https://snowtrace.io/tokenapprovalchecker
HECO链授权取消:https://www.hecoinfo.com/tokenapprovalchecker
Solana链授权取消:https://solscan.io/account/
在加密世界中,我们无法去检查每一个合约是否绝对安全,只能尽可能地自我防范,提高资产安全意识,降低对外界的授权数量,从而减少因外部安全事故而出现的资产损失,保障我们的资产安全。