首页 > 其他分享 >Hundred Finance 攻击事件分析

Hundred Finance 攻击事件分析

时间:2023-11-05 14:48:55浏览次数:32  
标签:WBTC Finance 攻击 wei hWBTC redeem 池子 攻击者 Hundred

Hundred Finance

背景知识

Hundred Finance 是 fork Compound 的一个借贷项目,在2023/04/15遭受了黑客攻击。攻击者在发起攻击交易之前执行了两笔准备交易占据了池子,因为发起攻击的前提是池子处于 empty 的状态(发行的 hToken 数量为 0)。

准备交易:

  1. https://optimistic.etherscan.io/tx/0xf479b1f397080ac01d042311ac5b060ceccef491867c1796d12ad16a8f12a47e
  2. https://optimistic.etherscan.io/tx/0x771a16e02a8273fddf9d9d63ae64ff49330d44d31575af3dff0018b04da39fcc

攻击交易:Phalcon || Tendery

交易分析

两次准备交易一共存入 63816 + 30000000 = 30063816 wei WBTC,获得 3190800 + 1499976495 = 1503167295 wei hWBTC

WBTC decimal = 8,hWBTC decimal = 8


执行攻击交易,首先从 AAVE V3 闪电贷出来 500 WBTC

image

通过 tendery 的模拟交易可以查询到,在攻击交易执行前,池子中存在 30064194 wei WBTC

image

首先 redeem 之前存入的所有 WBTC,将池子还原到 empty 的状态。

image

redeem 之后池子中存在 378 wei WBTC(其中1wei为留存资金,377wei为reserve资金),发行 0 hWBTC。empty状态仅代表 hWBTC 的 totalsupply 为 0。(如果先入为主地认为 WBTC的数量也为0,那么当你看到后面的时候会发现凭空多redeem出来了1 wei WBTC)

创建合约 0xd340 并往其中发送 50030063816 wei WBTC


合约 0xd340:

首先存入 4 WBTC,mint 200 hWBTC

image

redeem 19999999998 wei hWBTC,收到 4 WBTC。此时合约持有 2 wei hWBTC

image

向池子转入 50030063816 wei WBTC,然后借出 1021.915074492787011273 ETH

image

调用 redeemUnderlying 函数取出 50030063815 wei WBTC,消耗 1 wei hWBTC。此时合约持有 1 wei hWBTC,池子持有 1 wei WBTC

image


攻击合约调用 liquidateBorrow 函数对创建的 0xd340 合约的债务进行清算。支付 0.000000267919888739 ETH,获得 1 wei hWBTC。

image

redeem 1 wei hWBTC,获得 2 wei WBTC,此时池子重新回到 empty 状态。这样做的目的是为了可以再次掏空其他池子。

image

把 50030063817 wei WBTC 转移走

image

随后攻击者又再进行了6次相同的操作来掏空其他的池子完成获利,文章篇幅有限就不再展开说明。

漏洞代码分析

合约 0xd340 在进行 redeem 操作时利用了精度丢失的漏洞,获取超额的 WBTC 。漏洞的发生在于 redeemFresh 函数中。

image

进入到 trace 分析,发现在 truncate 函数中进行了精度丢失。

image

跟进代码查看 truncate 函数的具体实现方法,在对输入参数 exp1e18 的时候发生了精度丢失。

image

攻击细节分析

在分析攻击的过程中,对一些细节的部分存在着困惑,尝试着用生疏的技巧浅浅的分析一下。

为什么要先 mint 再 redeem,剩余 2 wei hWBTC

因为 mint 函数只能根据抵押物的数量来 mint hToken。也就是说在 initialExchange = 0.02 WBTC/hWBTC 的情况下,即使是传入 1 wei 的 WBTC,也会 mint 出 50 wei hWBTC。想要得到 2 wei hWBTC的剩余,没办法通过直接 mint 2 hWBTC 的方式(因为你无法提供 0.04 wei WBTC),所以只能先 mint 出大量的 hWBTC,然后再 redeem 使其剩余 2 wei。

所以按道理来说是不是先 mint 出 50 wei hWBTC,再 redeem 48 wei hWBTC 也可以?

image

为什么要剩余 2 wei hWBTC,而不是其他数量

剩余一定数量的 hWBTC 是为了后续构造精度丢失的攻击,使得合约从 hWBTC 的数量来计算抵押率是满足的,从而批准这笔 redeem,而实际上借出的 WBTC 数量是不满足抵押率要求的。而攻击者构造 2 wei 的这个数量就是为了通过精度丢失,是的超额借出的 WBTC 数量最大化。

假设在 2 wei 的情况下,borrow 了一半价值(1 wei)的资产:

赎回价值 1.99… wei hWbtc 的 WBTC,实际销毁 1 wei hWbtc。此时超额部分为 0.99… wei hWBTC,获得的 WBTC 占总资金的 1.99 / 2 。

在 20 wei 的情况下,borrow 了一半价值(10 wei)的资产:

赎回价值 10.99… wei hWbtc 的 WBTC,实际销毁 10 wei hWbtc。此时超额部分为 0.99… wei hWBTC,获得的 WBTC 占总资金的 10.99 / 20 。

通过上面两个例子我们可以得出,剩余的 hWBTC 数量越少,攻击者通过精度丢失所获得的超额 WBTC 比例就越大。

剩余的 hWBTC 数量可不可以为 1 wei 呢?

假设剩余 1 wei hWBTC,攻击者可以借出 100% 价值的资产,此时赎回价值 0.99… wei hWBTC 的 WBTC,利用精度丢失实际 burn 0 hWBTC。这样构造最大的好处是借出的资产可以达到 100%,而 2 wei 的方案借出资产只能借出 50%。

攻击者是如何构造获利场景的

攻击者只消耗 1 wei hWBTC ,然后 redeemUnderlying 出了 50030063815 wei WBTC

image

攻击者先 deposit 50030063816 wei WBTC,然后 redeem 50030063815 wei WBTC,希望通过 redeem (deposit amount - 1) 的方式构造精度丢失的场景:redeem 出价值 1.999… wei hWBTC 的 WBTC,最终会 burn 1 wei hWBTC,超额收益 0.999... hWBTC。

image

但是由于在攻击执行前池子里剩余有 1 wei WBTC,所以攻击者直接 redeem 50030063816 wei WBTC 也是可以达到 burn 1 wei hWBTC 的目的的。也就是说只有当 redeem 50030063817 wei WBTC 的时候才会 burn 2 wei hWBTC。

image

这个精度缺失攻击的前提是池子中 WBTC 的数量大于 hWBTC 的数量

假设 3 WBTC,2 hWBTC,可得 exchangeRateStoredInternal = 3 / 2 = 1.5

赎回 2 WBTC,计算需要 burn 的 hWBTC 数量:2 / 1.5 = 1.333… → 1 hWBTC

可以通过一个公式来计算出攻击者持有部分 hWBTC 的情况下通过精度丢失得到最大获利的情况吗?

  1. 假设池子持有 x WBTC,总共发行了 y hWBTC。攻击者持有 z hWBTC (z < y),赎回 kx WBTC (0 < k < 1)
  2. exchangeRateStoredInternal = x / y
  3. 由 1 和 2 可得,要 burn 的 hWBTC 数量 = kx / (x / y) = ky
  4. 攻击者为了获取尽可能大的超额收益,需要通过精度丢失漏洞构造 burn z + 0.999… hWBTC → burn z hWBTC
  5. 由 3 和 4 可得,ky = z + 0.999 → k = (z + 0.999) / y

举例说明:

  1. 假设池子持有 20000 WBTC,总共发行了 100 hWBTC,exchangeRateStoredInternal = 200。攻击者持有 50 hWBTC
  2. k = (z + 0.999) / y = (50 + 0.999) / 100 = 0.5099
  3. 赎回 kx = 0.5099 * 20000 = 10198 WBTC
  4. burn 的 hWBTC 数量为 kx / (x / y) = 10198 / 200 = 50.99 → 50

如何计算出清算所需要的 token 数量

通过 liquidateCalculateSeizeTokens 函数,计算得出提供 267919888739 wei ETH,能够清算获得 1 wei hWBTC

image

然后攻击者执行 liquidateBorrow 函数,提供 267919888739 wei ETH 进行清算,获得 1 wei hWBTC 。具体的计算过程以及涉及的参数如下图所示:

image

后记

都周末了还搁这写分析文章博主是没有自己的生活的吗?

标签:WBTC,Finance,攻击,wei,hWBTC,redeem,池子,攻击者,Hundred
From: https://www.cnblogs.com/ACaiGarden/p/17810494.html

相关文章

  • 什么是 DoS、DDoS、DRDoS 攻击?如何防范DDoS?
    什么是DoS、DDoS、DRDoS攻击?DOS:(DenialofService),翻译过来就是拒绝服务,一切能引起拒绝行为的攻击都被称为DOS攻击。最常见的DoS攻击就有计算机网络宽带攻击、连通性攻击。DDoS:(DistributedDenialofService),翻译过来是分布式拒绝服务。是指处于不同位置的多个......
  • 什么是 CSRF 攻击?如何避免?
    什么是CSRF攻击?CSRF,跨站请求伪造(英文全称是Cross-siterequestforgery),是一种挟持用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。CSRF是如何攻击的?1.用户登陆银行,没有退出,浏览器包含了用户在银行的身份认证信息。2.攻击者将伪造的转账请求,包含在在帖子3......
  • XSS攻击
    XSS:跨站脚本工具  1.可以获取用户的cookion信息等  2.盗取用户信息防御方式: 1.服务器对用户提交的内容进行过滤或编码  2.编码:对危险的标签进行HTML实体编码,(js脚本) ......
  • 服务器被攻击怎么办
    大家好,我是咕噜-凯撒,在现在这个网络时代,服务器攻击已成为互联网世界中的一种不可忽视的威胁。不管你是大型企业、小型创业公司还是个人网站,都可能成为他的目标。一旦服务器遭受攻击,可能会导致数据泄露、服务中断以及声誉损失等严重后果,即使你没有遇到过这种情况也可以看看我的这篇......
  • 有哪些安全攻击?
    有哪些安全攻击?网络安全攻击主要分为两种类型,被动攻击和主动攻击被动攻击被动攻击是指攻击者从网络上窃听他人的通信内容,通常把这类攻击称为截获,被动攻击主要有两种形式:消息内容泄露攻击和流量分析攻击。由于攻击者没有修改数据,使得这种攻击很难被检测到。主动攻击直接对现有的数据......
  • 常见网络攻击技术
    (1)SQL注入:Web应用未对用户提交的数据做过滤或者转义,导致后端数据库服务器执行了黑客提交的sql语句。黑客利用sql注入攻击可进行拖库、植入webshell,进而入侵服务器。(2)XSS跨站:Web应用未对用户提交的数据做过滤或者转义,导致黑客提交的javascript代码被浏览器执行。黑客利用......
  • .NET 反序列化 GetterSettingsPropertyValue 攻击链
    0x01 链路1 SettingsPropertyValueSettingsPropertyValue位于命名空间 System.Configuration,用于应用程序存储和检索设置的值,此类具有Name、IsDirty、Deserialized、PropertyValue、SerializedValue等多个公共成员,其中SerializedValue属性用于获取或者设置序列化的值,便于持久......
  • 智安网络|保护您的应用程序免受攻击:重要的安全强化措施
    在今天的数字化时代,应用程序安全成为了企业和个人必须重视的重要领域。应用程序普遍存在的安全漏洞成为黑客们进行攻击的一个突破口。为了保护敏感数据和个人隐私,我们必须了解并实施一系列的关键措施来加固应用程序的安全性。首先,一个关键的措施是进行全面的代码审查。应用程序中的......
  • DDoS攻击原理是什么?防御措施都有哪些呢?
    DDoS攻击也被称为分布式拒绝服务攻击,是一种十分常见的网络安全威胁,其原理是通过大量的请求攻击目标服务器或网络设备,使其无法正常处理合法的请求,从而导致服务不可用或者系统崩溃,以下是详细的内容:DDoS攻击的原理可以简单理解为:攻击者利用大量的计算机或者设备(通常是已经感......
  • [WEB安全] XSS攻击防御 Vue
    一、概念XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、Flash或者甚至是普通的HTML。攻击成功后,攻击者可......