火星链 火星链
Ctrl+D收藏火星链

OPT:百万美金的火线排雷:深度解读DeFi资产授权漏洞

作者:

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

本文来自AmberGroup,作者吴家志。原文标题:《ExploitingPrimitiveFinanceApprovalFlaws》。

事件摘要:2月24日,一篇关于PrimitiveFinance?的漏洞分析报告在圈内引发关注,报告描述了三个白帽攻击以及漏洞原理。一个多月后的4月14日,以AmberGroup区块链安全专家吴家志博士为代表的团队,发现了一个钱包地址有超过100万美金的资产存在风险。在本地复现攻击后,其团队通过Immunefi联系了Primitive项目方,并成功协助潜在的受害者重置了WETH授权,解除危机。这篇文章将介绍该团队如何在模拟环境中利用此漏洞,以及如何通过区块链数据分析找到潜在的受害者钱包地址。

原理:智能合约中的裂隙

在目前EVM及ERC-20的架构中,当用户与智能合约交互时,智能合约本身缺少一个能从代码层面捕捉到ERC-20转账事件的回调机制。例如当Alice给Bob发100个XYZ代币时,Bob的XYZ余额会被更新在XYZ合约里。但是Bob如何知道他的XYZ变多了呢?他可以查Etherscan或者其钱包App自动从以太坊节点取得的最新余额。如果Alice将100XYZ发给一个智能合约Charlie,Charlie如何得知他的XYZ余额增加了呢?

事实上Charlie没办法在收到100XYZ的当下主动取得他最新的余额,原因是这个转账是在XYZ合约上发生的,不在Charlie合约。智能合约部署完成后就像操作系统一样,是一堆代码放在某个地方,需要被调用了才会发生作用。为了解决这个难题,在ERC-20标准有一个被广泛使用的机制—approve()/transferFrom()。

跨链NFT协议DNFT完成百万美元天使轮融资:据官方消息,跨链NFT协议DNFT宣布完成百万美元的天使轮融资,投资方包括LD Capital、Candaq Fintech Group、Waterdrip Capital、7 O’Clock Capital 、Zonff Partners 、Mantra DAO、Win Capital、CatcherVC、7 Star Capital、BlockFocus、、InnCube Crypto Capital、ChainUp Capital、Amplio Capital、Worshipper Capital、Nexus Capital、GD Capital、1PAR等数十家机构。

据悉,DNFT是基于波卡的去中心化跨链NFT基础设施,旨在将数据资产跨平台变现。DNFT已获得Web3.0、Heco、BSC、Filecoin等官方Grant支持。[2021/6/10 23:28:35]

举例来说,当Alice需要往Charlie存入100个XYZ代币时,Alice可以事先授权Charlie使用她的100XYZ额度,此时Charlie的deposit()函数就可以在一个交易里通过transferFrom()主动将Alice钱包里的100XYZ取出,并且更新Charlie合约的状态。为了减少摩擦,很多DApp甚至会让用户授权无限多的XYZ额度给项目方地址,这样可以让后续的transferFrom()调用直接成功,免除掉多次授权的点击以及手续费,这等同于将Charlie加白。这个方案留下了一个隐患,万一Charlie作恶或是被攻击了,Alice的资产就会有危险。

Sound Ventures斥资百万美元举行NFT竞赛活动:风险投资基金Sound Ventures将于4月30日举行NFT竞赛ThePitch活动,将提供超100万美元奖金,以支持NFT中最具创新性的想法,申请截至日期为4月12日。评审团包括SoundVentures联合创始人GuyOseary、亿万富翁Mark Cuban、NFT基金Metapurse创始人Meta kovan、饶舌歌手Snoop Dogg、著名音乐家和制作人3LAU、Scalar Capital联合创始人LindaXie、数字艺术品收藏家&WHALE创始人Whale Shark以及Sound Ventures联合创始人Ashton Kutcher。[2021/4/6 19:48:45]

这个发生于2020年6月18日的意外证实了一个被控制或存在问题的智能合约可以如何被利用并且造成资产损失,如下代码所示,safeTransferFrom()虽然名为safe的transferFrom却意外被宣告成公开函数,导致任何人都可以使用Bancor合约的身份转移任意用户任意数量的任意资产到任意的地址。

简单举例来说,如果Alice正好使用过Bancor并且授权Bancor无限额度使用她的DAI,则一旦她的钱包里DAI余额大于零时,黑客就可以立即把她的DAI转走。

巴勒斯坦居民被指控通过比特币数百万美元:据bitcoin.com消息,特拉维夫地方法院今天收到了针对对巴勒斯坦希伯伦市33岁的Halmi Git的起诉书,涉及管理一个共享和出售被窃信用卡的论坛。其论坛据称涉及全球约130万名用户,导致了大规模的欺诈行为。此外,他还出版了手册和指南,提供了各种计算机犯罪的方法,以及如何远程黑客攻击计算机和接管远程计算机或服务器的信息和工具的方法。Git要求必须通过比特币向他支付款项,被控利用被窃信用卡通过比特币清洗了数百万美元。此外,Git在不同的比特币钱包之间进行了多次转账以覆盖其踪迹,使用在线屏蔽服务将自己与各种账户隔离开来,并将其部分财产记录在亲戚的名字之下。[2018/5/22]

诊断:黑客是怎样绕开“安检”的?

根据上文的漏洞分析报告所述,这个外部函数有一个类似的漏洞,但无法像Bancor的漏洞一样被直接利用。事实上,攻击者需要伪造两个ERC20代币合约,一个Uniswap资金池,并且发起一笔Uniswap闪电贷绕过下图标注的?msg.sender==address(this)?检查。听起来复杂,但对于有经验的黑客来说,这并不是太困难。

Primitive为何需要实现?flashMintShortOptionsThenSwap()?这样一个接口呢?其实是有特定使用场景的,在?openFlashLong()函数可以看到,flashMintShortOptionsThenSwap()?会被封装在一个Uniswap的flash-swap调用参数里,在第1371行触发flash-swap之后,由回调函数?UniswapV2Call()?调起。此时由于?UniswapV2Call()?在Primitive合约里,便可以通过上述?msg.sender==address(this)?检查。

加密货币交易所赚数百万美元上币费:大多数加密货币交易所不会公开宣传它们的上市费用,尽管它们的上市成本高达数十万美元,在某些情况下也有数百万美元。交易所的规模越大,利用其流动性和现有用户规模所收取的上币费就越高。《商业内幕》(Business Insider)杂志报道了某项目的创始人,他声称自己被要求缴纳5万到100万美元不等的上币费。[2018/3/13]

值得注意的是,在?openFlashLong()函数里,第1360行写的是?msg.sender,表示在正常的情况下,Primitive只能使用调用者本身的资金,然而攻击者可以通过伪造的pair以及params用类似于1371行的方式直接调用Primitive合约的UniswapV2Call()并绕过?flashMintShortOptionsThenSwap()?的检查。由于params在这情况下可以完全被控制,1360行的msg.sender便可以被替换成任意曾经授权Primitive的钱包地址,然后通过?flashMintShortOptionsThenSwap()?里的?transferFrom()?调用盗取资产。

追踪:找出可能的受害者

如果一个黑客碰巧知道某位“大户”曾授权有问题的合约,他可以轻易利用这个漏洞盗取受害人大量的资金。然而,这件事情如果仅使用区块浏览器是很难做到的,尤其在合约已经部署了较长时间,并有大量用户量的情况下。其中需要分析的数据并非是靠人工搜索Etherscan能够实现的。

卡巴斯基:网络犯罪分子通过恶意挖矿软件在2017年获利数百万美元:根据卡巴斯基实验室的数据,2016年至2017年,利用受害者电脑硬件资源挖掘加密虚拟货币的攻击增加了近1.5倍。此外,在2017年的最后六个月中,网络犯罪分子通过以上2种方式已经赚取超过700万美元。[2018/3/6]

GoogleCloudPublicDatasets在此时可发挥作用。由于每一个成功的approve()调用都会在以太坊上发出一个Approval()事件,我们可以通过BigQuery服务找出所有事件并且通过一些方法过滤出我们感兴趣的部分,例如_spender是Primitive合约的所有事件。

下面是我们在GCP上实际用来找出潜在受害者使用的SQL语句,其中第五行可以看到我们限定搜索的以太坊数据库及记录事件的表,第七行过滤出Approval()事件,第八行过滤了特定的_spender。此外,第六行将区块高度范围设定在Pirmitive合约部署之后,这可以大幅降低BigQuery扫过的数据量,这类的SQL优化会直接反应在你的GCP账单里。

接下来,我们可以进一步优化SQL查询将已经通过approve(_spender,0)重置授权的账号从清单中刨除,得到最终的账号列表。有了最终的列表,我们利用一个脚本监控着这些账号,并且在这些危险账号收到大量资产时发出预警,因为这很可能会造成严重的损失。

在一个星期三的清晨,机器人发出了预警,有一个可能的受害人在北京时间4月13日清晨5点24分收到了将近500WETH的资产,价值超过一百万美金。相较于已公开的三次白帽攻击,这个受害人如果被成功攻击,所损失的金额将高于稍早的三个案例的总和。

我们在北京时间9:32紧急联系了Primitive项目的漏洞赏金计划运营方Immunefi并且向他们展示我们如何利用这个漏洞在模拟环境中盗取受害人的500WETH,并且提供包括下面的截屏等证据。

在Primitive团队的帮助下,潜在的受害人于10:03将WETH授权重置,解除危机。

两天后,Primitive团队也针对此发现给予漏洞奖励并发布公开致谢。该笔赏金发稿前已捐助给CryptoRelief。

复现:分布拆解漏洞的利用

漏洞利用的第一步,我们需要准备两个ERC20合约:Redeem及Option。

其中Redeem合约是一个标准的ERC20,我们只需要基于OpenZeppelin的实现将mint()接口暴露出来,方便我们控制代币数量,如下所示:

Option合约会相对复杂一点,从下面的代码片段可以看到,我们需要刻意构造一些全局变量,以及公开函数,这些都是在Primitive的业务逻辑会用到的。此外,我们还需要传入三个参数来初始化Option合约:

·???????redeemToken:稍早构造的Redeem合约地址

·???????underlyingToken:攻击目标账号所持有的资产合约地址

·???????beneficiary:受益人地址,也就是攻击成功后将受害人资产转移的目标地址

这里需要特别说明的是mintOptions()这个函数,从上面的代码可以看到,它会直接把所有的underlyingToken发给beneficiary地址。这是因为下面的内部函数mintOptionWithUnderlyingBalance()函数在被?flashMintShortOptionsThenSwap()时会将underlyingToken发给Option代币合约,并且通过mintOptions()调用铸造Option代币。因此,我们在伪造的Option合约里,可以直接把mintOptions()当作一个提币调用,将underlyingToken发给beneficiary,用于之后归还闪电贷的资金。

接下来,我们可以用刚刚创建的Redeem及Option代币创建一个Uniswap的流动性池子,这个池子的地址将用来接收从受害人钱包转出的资金。事实上,每个Uniswap池子里有等价的两种资产,例如WETH及Redeem,为了完成漏洞利用,我们必须为池子注入流通性。Redeem是我们自己创建的,可以铸造无限量的代币,但WETH呢?

在闪电贷的帮助下,我们基本上可以利用无限数量的资金来做如何事情,只要确保能在一个交易中归还资金即可。在这个案例中,我们使用AaveV2的闪电贷借了相当于受害人总资产99.7%的资金存入上述的流动性池。

根据Aave的设计,需要实现一个回调函数executeOperation()执行获得贷款资金后的操作,并且在最后通过approve()调用授权Aave合约取走闪电贷的资产以及手续费。

总结

在基于EVM的智能合约世界里,approve()/transferFrom()是长久以来存在的固有问题。对于DeFi用户而言,需要多留意你的钱包地址是否正允许着其他人使用你的资产,并且定期重置资产使用权。对于项目方而言,需要在上线之前花更多心思和时间从各种可能的角度测试,甚至攻击你的代码,因为你正在编程的,是每位用户的真金白银。

关于作者

吴家志受聘于全球领先的加密金融智能服务提供商AmberGroup,作为区块链安全专家。他毕业于美国北卡州立大学计算机专业,获得博士学位,师从安卓安全领域领军者蒋旭宪教授,在美国读书期间一直从事系统安全研究,主要方向为虚拟化安全、安卓系统安全。吴家志博士在全球安卓安全领域有很大的影响,发表过多篇科技论文,在安卓系统漏洞安全方面经验丰富。他于2017年开始转战至区块链安全领域,曾担任全球第一家去中心化匿名众测平台DVP负责人,号召全网白帽黑客一起寻找开源底层代码中的漏洞。

标签:IONOPTOPTIPTILucky LionCOPTERoptimus币最新消息optimus币发行量

中币交易所热门资讯
BSC:币安智能链上 DeFi 项目为何集中失窃?

本文来自蜂巢财经News,原文标题:《黑客攻同源漏洞「团灭」Fork协议》,作者:凯尔。2021年5月,加密资产市场颇为动荡,BTC从5万美元上方最低跌至29000美元,几近腰斩,大多数加密资产.

1900/1/1 0:00:00
ETI:对话Metis联合创始人:Metis 是什么?

本文来自?DeFi七点钟社区。Q1、请Kevin先介绍下自己的从业经历,以及目前主要负责Metis哪方面的工作?谢谢主持人。大家好,我是MetisDAO的联合创始人和产品负责人.

1900/1/1 0:00:00
PIT:xNFT Protocol完成天使轮和A轮融资,LD Capital、Fundamental Labs分别领投

链捕手消息,NFT自动化交易协议xNFTProtocol宣布已完成天使轮、A轮两轮融资。天使轮由LDCapital领投,王峰、MarsBlockchain、LinkVC、PrimitiveVen.

1900/1/1 0:00:00
区块链:超级君:比特币九年骚话

本文发布于公众号十八铺路,作者:广庚,比特币超级君。1.世相繁复,纵使有更多的质疑、利益自卫和诱惑抵抗,比特币的发展之路,也会遇到许多那样的人,他们接触比特币时,会如同奥雷良诺布恩地亚上校少年时.

1900/1/1 0:00:00
DEFI:重新认识闪电贷:信用风险解决方法与 DeFi 风险策源地

本文作者:HuobiVentures2018年年中Marble首次提出了闪电贷?这一概念,但在一年后闪电贷才开始慢慢发展起来,并于2020年进入区块链用户的视线中.

1900/1/1 0:00:00
KEEP:Keep + NuCypher:针对KEANU的代币设计建议

本文发布于Figment论坛,作者:ElizabethBarnes在过去的几周中,Keep和NuCypher社区开发了六种令牌设计,可与当前称为KEANU的新网络集成.

1900/1/1 0:00:00