北京时间2021年3月9日凌晨,以太坊(Ethereum)去中心化交易平台 DODO 的 多个 V2 众筹池遭到攻击,攻击者利用众筹池的合约漏洞,用自己创建的 token 套出了池内的 token,上演了一出狸猫换太子的把戏。只不过,从之后的分析来看,事情的发展显然偏离了攻击者的预期轨道......
接下来,就让大家跟我一起来看看攻击者到底做了什么,而当时又到底发生了什么。为了便于后文的讲述,就管这次的攻击者(Attacker)叫做小A吧。
“攻击成功了吗?成功了,但没完全成功。” 这可能就是小A当时的心理写照
No code, no bug
有代码的地方,就可能有漏洞。智能合约虽然被人们冠以“智能”二字,但归根到底也是一段段的代码,因而也总被别有用心的人揪住它的漏洞搞一波钱实现财富自由。我们这次故事中的智能合约,就是 DODO 的 V2 众筹池合约。而我们的主角小A,就是那个发现了该合约漏洞并试图趁机搞钱的人。
概念简析
提了这么多次 DODO V2 众筹池,那它到底是个啥玩意儿?简单来说呢,它就是个资金池,只不过本文中的资金所指代的并非我们日常接触到的法币,而是以太坊上的代币(ERC20 token)。这种资金池在初始化的时候会设定两种链上有价值的 ERC20 token 作为这个池子的 token pair(记住这个点,之后要考的 ),然后用户可以正常使用这些池子提供的服务。在这次小A针对 DODO V2 众筹池的攻击中,就是利用了该池子提供的闪电贷(flashloan)服务。
闪电贷相比于普通借贷,具有无需抵押即可借贷大量资金,加之还不上钱就状态回滚的特点。简单来说就是可以空手套白狼,要是最后借出的钱自己一通操作之后亏了还不上也不打紧,所有相关状态会回滚到借贷之前,而对于借贷者来说唯一的损失除了手续费之外,可能就只有时间了。使用闪电贷的逻辑也很简单,就是用户从资金池借钱-->对借来的钱进行操作-->还钱,而这些需要在一笔交易中完成。
Ok,简单了解完相关的概念之后,咱接着看小A的操作。
小A的骚操作
小A接下来做了两件事儿。
第一件事儿就是创建了两个 ERC20 token 的合约,说白了就是造了俩假币 ( 因为没价值 ),分别叫做 FDO 和 FUSDT. 创建完这俩假币之后呢小A就把它们存入到之后将被攻击的 DODO 池子里了。
小A做的第二件事儿就是使用了 DODO V2 众筹池的闪电贷服务。上文提到闪电贷使用逻辑中的一环就是对借来的钱进行操作,而本文的主角小A就是在这一环节上玩儿出了花样。
小A发现这个 DODO V2 众筹池是可以被重新人为初始化的,而且没什么限制。接着小A就在借出钱之后把这个池子重新初始化了,并且初始化时设定的 token pair 变成了小A自己造的俩假币 FDO/FUSDT (这就是之前提到的考点,现在考到了吧 )。并且小A在借钱之前已经通过上文他做的第一件事儿把足量的两种假币都预先存入到了这个池子里,这就导致池子在检查小A欠钱情况的时候,所检查的token不再是之前的真币,而是小A存入其中的假币,加之数额也足够。这样一来小A就用假币套出了真币。
XBTO收购加密货币托管和交易公司Stablehouse:8月12日消息,加密货币公司XBTO收购加密货币托管和交易公司Stablehouse,收购金额未披露。通过此次收购,XBTO将能够为客户提供更多的数字资产金融服务。
据悉,XBTO致力于为非美国投资者和机构提供数字资产平台和投资解决方案。[2023/8/12 16:22:05]
咱们可以对上述过程打个简单的比方,细节按下不表。就是有一家银行,这个银行就可以类比上文提到的资金池。同时该银行也有一个小本本拿来记账,只不过在小本本的首页有一条记录[本行只处理人民币,储备量100]。至于其他的币种,美元也好,越南盾也好。用户也可以往里面存,但银行不管你,它的小本本上虽然也会记账,但核对时它只看涉及到人民币的记录。
为了类比众筹池可以被重新初始化的问题,可以这么理解。就是这个小本本有个问题,问题出在首页的这句[本行只处理人民币]的规定是用铅笔写的,并且这个小本本就放在窗口,外人拿个橡皮擦+铅笔就能改。然后这个问题被小A发现了,他先往这个银行存了100越南盾,银行会记账[小A往本行存入100越南盾]。然后小A又去银行借出100人民币,银行又记账[小A从本行借出100人民币]。注意银行会检查所有用户对人民币的借存情况并和储备量比对,从而确认是否有用户借了人民币但没还。
刚借完钱,小A就鸡贼地掏出准备好的铅笔+橡皮将小本本首页的规定改为了[本行只处理越南盾,储备量100]。然后银行核对金额的时候,因为规定改为了只处理越南盾,而查验的时候发现越南盾的储备量和小A存入的越南盾数额是一样的,说明没人欠银行钱。然后小A拿着借出来的人民币潇洒离去,不再回头。
小A针对 DODO V2 众筹池的攻击思路就如上文所述,小A接下来要做的就是把想法付诸实际行动。本文从合约代码层面要分析的攻击也就是上述提到的攻击,然而咱的故事还没完。不想接着看故事的看官可以直接下滑到 0x2 的攻击分析部分,剩下的看官,就请容我接着给您讲故事。
攻击过程:山路十八弯
第一回. 螳螂捕蝉黄雀在后
咱书接上文。
项目方也就是DODO采用相同的逻辑创建了多个池子,而这些池子都有同样的漏洞。小A第一次瞄准的池子是 (WSZO/USDT) 池,WSZO 和 USDT 就是两种有价值的代币( ERC20 token)。他美滋滋的把自己的攻击逻辑写入一笔交易之后,就准备躺着收钱,可就在这时,出岔子了。
咱知道,以太坊上的交易存在交易费,这笔费用是用户支付给矿工的。所以矿工为了自身利益最大化,当他们从pengding池打包交易准备上链时会查看各条交易的交易费并排个序,交易费高的优先上链。而由于以太坊的去中心化机制,黑暗森林法则在这也同样适用。DeFi(去中心化金融) 项目的攻击者们潜伏在世界各地,一旦发现目标,就会一拥而上,至于最后谁能成功,除了技术等因素,就得看谁出的交易费高了。
福布斯:Game Space加速Web2游戏公司进入 Web3,帮助粉丝通过 NFT 在娱乐领域创收:9月26日消息,福布斯就粉丝如何通过 NFT 在娱乐领域创收进行了刊文报道。文中提到,迄今为止世界上一些最大的娱乐平台和特许经营权拥有者都在利用 NFT 和元宇宙。对于大多 Web2 企业来说,换到到Web3需要对自身基础设施进行大调整,而Game Space提供了一种更快速、更低成本采用 NFT 和元宇宙技术,进入Web3的解决方案。
福布斯称,许多公司都在不断尝试如何转型进入Web3,利用NFT可能会让他们在未来几年处于娱乐行业的前沿。但并非每个Web2企业都有专业能力或预算去做,Game Space提供的技术可帮助当前的Web2游戏公司不到一周的时间内切换到Web3,即刻拥有 NFT 功能、创建交易市场并部署多链功能,而无需从头开始构建。
?[2022/9/26 22:30:06]
回到主角小A,他发现了漏洞准备趁机搞一波钱,可小A的举动被另一个角色--抢跑机器人--发现了,咱称这个抢跑者为小B吧。小B就在交易费上做了文章,他把交易的油费(gas price) 提高了,从而增加了这笔交易的交易费。这就使得矿工在打包交易的时候优先打包了小B的交易。一般把小B的这种操作叫做抢跑交易 (front running)。等轮到打包小A交易的时候,WSZO/USDT 池子里的WSZO和USDT已经空空如也,只剩下一堆没啥价值的 (FDO/FUSDT)。
小A可能以为这一次的失败只是一次普通的抢跑交易,于是他又故技重施。只不过这次的目标换成了 (ETHA/USDT) 池,而且为了防止被抢跑,在这一次的交易中小A提高了交易的油费。可小A不知道的是,他已经被小B盯上了。
同样的套路,同样的手法,小A又一次被小B抢跑了交易。
第二回. 半路杀出个程咬金
到目前为止,小A两次攻击都是给小B做了嫁衣,甚至自己还亏了交易费!小A那个气啊,于是痛定思痛,把目标瞄向了下一个池子(wCRES/USDT)。并且这一次小A成功的绕过了小B的监控。事情发展到现在似乎小A就要成功了,可现实就是喜欢和小A开玩笑。
第三次攻击虽然绕过了小B,但小A把钱成功取出来之后并没有直接转移到自己的地址,而是创建了一个新合约来接收这笔钱。小A的想法是先把钱暂存在这个新合约内,之后再转移到自己的账户中。然而,小A的这个用来暂存赃款的合约又有个漏洞,就是任何人都能从这个合约中取出(withdraw)合约内的资金。
However, this contract had a loophole that allowed anyone to withdraw assets from it.
Blockchain.com已在意大利注册为虚拟资产服务提供商:金色财经消息,总部位于伦敦的加密公司Blockchain.com周四宣布已在意大利注册为虚拟资产服务提供商,它现在可以在意大利监管机构OAM的管辖下向意大利居民和机构投资者提供加密和数字钱包服务。根据预计在2024年之后生效的规则,加密公司将需要许可证和客户保障措施才能在欧盟发行和销售数字代币。其他主流加密交易所包括币安(Binance)、Coinbase Global、Crypto.com和德国投资平台Trade Republic都已在OAM获得注册。[2022/8/5 12:03:08]
而恰巧这个漏洞,被另一个角色 (小C) 发现了。于是,在小A发出一笔交易准备从这个合约中取回赃款的时候,又双叒被抢跑了,这不过这一次抢跑者变成了小C。
看到这,小A既是攻击者,又是抢跑交易的受害者。这波啊,小A算是偷鸡不成蚀把米。
第三回. 倔强的小A
前文提到,具有同样逻辑漏洞的池子有多个。小A又双叒叕准备发起他的第四次攻击了,这一次,目标换成了 (DODO/USDT) 池。这一次小A学聪明了,一方面他将暂存赃款的合约替换为了新合约,另一方面小A也将代币转移的过程合并在了一笔交易中,以免出现像第三次攻击中被小C抢跑的情况。而这一次,不撞南墙不回头的小A终于成功用假币 (FDO/FUSDT) 搞到了真钱 (DODO/USDT)。
第四回. 疯起来连自己都咬
四次攻击终获成功之后小A满足了吗?事实告诉我们答案是否定的。
不知道小A是怎么想的,可能是历经曲折终于成功让其兴奋过头。这第五次攻击,他的目标瞄向了 (wCRES/USDT) 池。是不是有点眼熟?没错!这个池子正是小A在第三次攻击中的目标池子。而经过第三次攻击的洗劫之后,这个池子已经从(wCRES/USDT)池变为了(FDO/FUSDT)池,即真币池成了假币池。因而在这一轮攻击中,小A用同样的攻击套路得到的结果无非就是拿着新假币去换旧假币......
而这俩假币还都是小A自己造的。可能,小A还是个怀旧的人吧......
咱们关于小A的故事,也走向了尾声。或许以太坊对于攻击者而言就是一片黑暗森林,猎手与猎物的身份在这个特殊的竞技场也并非一成不变。终要记得,当你在凝视深渊的时候,深渊也在凝视着你。
ok,接下来就是正儿八经的攻击分析环节了。
准备好了吗?坐稳扶好,发车了。
为便于理解,下文将以第三次攻击为例子来进行分析,涉及到的池子为(wCRES/USDT)池
代码分析
以下提到的函数都来源于资金池(wCRES/USDT)的合约代码,并且在本次攻击事件中均被涉及。
getVaultReserve 函数
新加坡加密基金管理公司Fintonia集团获得迪拜临时许可证:金色财经报道,新加坡加密货币基金管理公司Fintonia已经获得了在迪拜运营的许可证。这是在其被新加坡金融管理局监管的地位之外的。在新加坡,它目前提供以比特币抵押品为担保的贷款以及两个机构级比特币基金。
随着监管机构的裁决,该公司计划提高其在阿联酋的存在,并扩大其在迪拜的团队,同时为代币基金会、协议和比特币矿工等参与者提供财务和资产负债表管理服务。它希望在此基础上为位于中东的web3公司进行扩展。(the block)[2022/7/19 2:22:15]
首先来看getVaultReserve函数,这个函数的功能很简单,就是当用户调用它的时候会返回当前池子里token pair的储量。
flashloan 函数
上图就是本次攻击中资金池合约的flashloan函数。可以看到当用户调用这个函数时,会先根据用户传入的baseAmount 和 quoteAmount 这两个参数将相应数量的token 转入参数assetTo 所代表的地址。到此,就算是完成了闪电贷(flashloan)的借钱环节。顺着代码往下看,只要data不为空,就会触发外部逻辑。而这个外部逻辑,就是调用者自己实现的,本次攻击的实现,也正是在这个外部逻辑执行时做了手脚。
init 函数
上图就是本次攻击中最为关键的初始化函数init. 可以注意到该函数是外部调用的,而且最关键的是,这个函数有以下两个特点:
[没有权限要求]这就意味着任何人都可以从外部调用这个函数。
[可被重复调用]则意味着这个init函数除了在该池子建池时被必要的调用一次后,仍然可以在任何时候被调用来重新初始化这个池子。
调用者调用这个函数时,所传入的两个参数baseTokenAddress 和 quoteTokenAddress 会被用来给变量_BASE_TOKEN_ 和 _QUOTE_TOKEN_ 分别的重新赋值。而这两个变量的改变就意味着这个池子的 token pair 也会发生改变。而这,便是 wCRES/USDT 池变 FDO/FUSDT 的原因。
攻击过程
攻击交易的流程如下图所示
“春风十里不如你”数字藏品在希壤元宇宙发售:金色财经报道,7月8日,冯唐的首个数字藏品“春风十里不如你”在百度希壤商城、小度寻宇正式发售,限量2000份。据悉,依托百度超级链,每份“春风十里不如你”数字藏品都具有唯一的链上序列号,即独立的、不可篡改的、可实时查验的ID,代表着其独一无二的收藏价值。据发售信息显示,“春风十里不如你”将与冯唐首件元宇宙艺术作品“元立方”合二为一。[2022/7/10 2:02:38]
交易流分析可以使用我们团队的交易分析工具:https://tx.blocksecteam.com/
Step 0
攻击者首先创建了两个 ERC20 代币的合约 (FDO 和 FUSDT),可以简单理解为造了俩假币(没价值)。并向自己的地址(0x368a6)分别转入了大量的这两种 token,为之后的攻击做铺垫。
Step 1
攻击者调用资金池合约的 getVaultReserve 函数,获取到 wCRES 和 USDT 当前在池子里的储量,为下一步攻击做准备。
Step 2
攻击者根据 Step 1 得到的储量,分别调用两个假币合约的 transferFrom 函数给资金池合约(DLP) 转入略多于该储量的假币 (FDO 和 FUSDT),从而保证能通过flashloan函数的余额检查。
Step 3
攻击者接着调用资金池合约(DLP)的 flashloan 函数,借出了略少于资金池储量的真币(wCRES 和 USDT)。
Step 4
flashloan 函数在将 wCRES 和 USDT 转入到攻击者预先设置好的合约地址之后,会自动调用攻击者的外部逻辑。而攻击者就是在外部逻辑的实现中调用了 wCRES/USDT 这个池子的初始化函数 init ,将该池子的 token pair 替换为了 FDO/FUSDT。
Step 5
如下图,flashloan 函数在执行完外部逻辑之后,会对当前池子的代币(token) 余额进行检查。但需要注意的是,由于池子的 token pair 被替换为了 FDO/FUSDT,所以baseBalance 和 quoteBalance 的所代表的余额也是 FDO 和 FUSDT 的余额。
同时,由于攻击者在 Step 2 的时候已经往池子中存入了足量的 FDO 和 FUSDT,所以此时baseBalance 和 quoteBalance 的值足够大,绕过了两个if判断,直接进入了最后的同步函数_sync。至此, 攻击者成功通过了 flashloan 的余额检查,实现了以假乱真。
本次攻击之所以发生,最主要的问题出在 DODO V2 众筹池的 init 函数上。查看该函数的调用情况可以发现,正常的逻辑应该是该函数只能在刚建池的时候被调用一次,之后就应该设置访问权限,同时也不能被重复调用。攻击者就是利用了init函数可以被重复调用来重新初始化池子的这一漏洞,结合闪电贷将池子中的真币用假币套取了出来,从而完成了攻击。
因此,我们给相关项目方的建议有:
对项目合约的关键功能做好权限审核工作,以免核心函数由于权限要求过低被滥用引发不可预料的后果从而造成损失。
提高项目代码审计意识,项目上线前需咨询相关的区块链安全公司进行充分的安全审计,最大程度的保证项目安全。
参考
慢雾:狸猫换太子 —— DODO 被黑分析
DODO Pool Incident Postmortem: With a Little Help from Our Friends
https://medium.com/dodoex/dodo-pool-incident-postmortem-with-a-little-help-from-our-friends-327e66872d42
Important update regarding recent events on DODO
https://dodoexhelp.zendesk.com/hc/en-us/articles/900004851126-Important-update-regarding-recent-events-on-DODO
DODO - REKT
https://www.rekt.news/au-dodo-rekt/
附录
文中涉及的外部地址和合约地址
攻击者A
https://etherscan.io/address/0x368a6558255bccac517da5106647d8182c571b23
抢跑者B
https://etherscan.io/address/0x3554187576ec863af63eea81d25fbf6d3f3f13fc
抢跑者C
https://etherscan.io/address/0x8a14ce0fecbefdcc612f340be3324655718ce1c1
资金池DLP (WSZO/USDT)
https://etherscan.io/address/0xfb609b68d694617e0100c7182f21e536760d438d#code
资金池DLP (ETHA/USDT)
https://etherscan.io/address/0xfd87ab87f384458a8f6f4b3c3eb222a223869f73#code
资金池DLP (wCRES/USDT)
https://etherscan.io/address/0x051ebd717311350f1684f89335bed4abd083a2b6#code
资金池DLP (DODO/USDT)
https://etherscan.io/address/0x509ef8c68e7d246aab686b6d9929998282a941fb#code
文中涉及的交易
第一次攻击
A 的攻击交易 (fail)
https://etherscan.io/tx/0x4bc4ace313f2f5a411a5a560255ba0bba4f4913edb55ed882feaee84a3b1292e
B 对 A 的 抢跑交易
https://etherscan.io/tx/0xff9b3b2cb09d149762fcffc56ef71362bec1ef6a7d68727155c2d68f395ac1e8
第二次攻击
https://etherscan.io/tx/0x0430d5a2dcfb0f9530fe1699e0e86a9526825da5e2072a15c4be734710f56cdb
https://etherscan.io/tx/0x0b062361e16a2ea0942cc1b4462b6584208c8c864609ff73aaa640aaa2d92428
第三次攻击
A 的攻击交易
https://etherscan.io/tx/0x395675b56370a9f5fe8b32badfa80043f5291443bd6c8273900476880fb5221e
C的抢跑交易 (抢跑了A对代币USDT的转移)
https://etherscan.io/tx/0x75d4765dd704d82f0bf539da88aff2568da38697f153b14d285abc8749da683f
A 被 C 抢跑的代币 (USDT) 转移交易
https://etherscan.io/tx/0x14084fba94df75cf8ebfbb62188aa06a29ec0e38181f73eab7b79eba750e4840
C的抢跑交易 (抢跑了A对代币wCRES的转移)
https://etherscan.io/tx/0xa8d030494607e16b06dd0c7e97da2b78ebc5a072a8176b19ca57f17044c1a211)
A 被 C 抢跑的代币 (wCRES) 转移交易
https://etherscan.io/tx/0x021a2bd6ea7b502290be4c67be33be33c5b5582676d1c00ab59f1ed53a1b576b
第四次攻击
https://etherscan.io/tx/0xc79dbe0aa48e0ba9f72bd74240cf50b653196ff00979bf367f11f8fa3d9b45ec
第五次攻击
https://etherscan.io/tx/0xe59fdc5b83deaf29f9f45fd53f6aa54f893fe8504f070bce9995eb535bed4996
标签:USDUSDTSDTRESUSDFLtrustwallet如何添加usdtusdt币交易违法吗香港ares币最新行情
免责声明本篇文章的内容仅供学习,不能作为实战使用。看完本文章后,你的任何尝试都与博主本人无关,盈亏自负,也请为自己的交易负责.
1900/1/1 0:00:00PollenTaraxa的目标是成为日常商业活动的区块链应用通道,但这只是Taraxa的初步价值点。在本文中,我们将讨论能够增加运营数据价值的Taraxa跨链桥—Pollen.
1900/1/1 0:00:00《Crypto zoon加密动物园》Crypto Zoon是币安链上的一款NFT游戏,游戏操作简单,而且打金方法很清晰,比较容易上手,但是需要翻墙操作,内置汉化版,英文不好的可自行调节.
1900/1/1 0:00:00Hi,小伙伴们~众所周知,Axie Infinity在六月下旬的爆发让大家的目光都汇聚在了NFT链游领域.
1900/1/1 0:00:00随着工业时代向信息时代迈进,人们需要一个新的、时代固有的产权制度。去中心化自治组织(DAO )不是投资主题。它是一种专为全新数字经济体设计的加密原生组织结构.
1900/1/1 0:00:00如今,Web3.0这个词经常会出现在互联网社会中,不过很多人对于这个概念只是一知半解。如果我们要用一个简洁明了的句子来描述它,“让数据权利回归个人”再合适不过.
1900/1/1 0:00:00