[BlockSec DeFi攻击分析系列之四] 表里不一:Sanshu Inu的Memestake合约遭袭事件分析_MEMES:keanu币最新消息

去中心化金融(DeFi)作为区块链生态当红项目形态,其安全尤为重要。从去年至今,发生了几十起安全事件。

BlockSec作为长期关注DeFi安全的研究团队(https://blocksecteam.com),独立发现了多起DeFi安全事件,研究成果发布在顶级安全会议中(包括USENIXSecurity,CCS和Blackhat)。在接下来的一段时间里,我们将系统性分析DeFi安全事件,剖析安全事件背后的根本原因

0xffffffff.前言

北京时间2021年07月21日03:40,我们的攻击检测系统检测到某个交易异常。通过对该交易进行扩展分析,我们发现这是一起利用通缩代币KEANU的机制对SanshuInu部署的Memestake合约的奖励计算机制的漏洞进行攻击的事件,攻击者最后获利ETH约56个。下面详细分析如下:

阅读建议:

如果您刚刚接触DeFi(Ethereum),可以从头看器,但是文章比较长,看不下去记得点个关注再走。

如果您对Akropolis等DeFi聚合器项目比较了解,可以直接从「0x2攻击分析」开始。

0x0.背景介绍

今年以来爆火的狗狗币、柴犬币引发了广泛的关注,同时带火了其他相关的meme币,更引发了大量的项目方开发自己的meme币及围绕meme币提供服务,其中SanshuInu就是其中一员。SanshuInu不仅发行meme币SANSHU,还创建了合约Memestake作为meme币的耕种池。用户只要往Memestake中质押meme币,就可以获得代币Mfund作为奖励。

美国体育出版商Sports Illustrated推出基于Polygon的NFT票务系统:金色财经报道,美国体育出版商Sports Illustrated推出基于Polygon的NFT票务系统。这一系统允许活动所有者、组织者和推广者通过“超级门票”功能获得更多的票务使用场景,比如精彩片段、收藏品和优惠活动等。

该公司发言人表示,区块链是票务的未来,可将已使用的条形码转化为引人入胜且可收藏的内容。(coindesk)[2023/5/3 14:39:16]

另一方面,大量的meme币都是通缩代币,即该种代币的发行量会逐渐减少。其中部分meme币的通缩实现形式是在用户每次进行交易转账的时候扣取一定比例的币用于销毁和再分配,这将导致接收方实际收到的token数量小于支出方实际支付的数量。本次涉及的通缩代币KEANU就是采用这种实现。

该攻击的大致原理就是通过控制Memestake进行KEANU的多次转入转出减少其持有的KEANU数量,从而利用其奖励计算函数的漏洞致使Memestake给攻击者发送大量Mfund。

0x1.代码分析

为了便于理解,我们首先简要地介绍一下和此次攻击相关的两个实体合约:KEANU代币的KeanuInu合约和Memestake合约。

KeanuInu合约

正如前面所说,KeanuInu在实现代币KEANU的转账时,会扣取一定比例的币用于销毁和再分配,其中用于销毁的比例设置为定值——2%。如图,在调用KeanuInu的transfer()及transferFrom()函数的时候,函数调用中显示的转账数量跟emit的事件log中记录的数量并不一致。

安全团队:跨链DEX聚合器Transit Swap因任意外部调用问题被黑,被盗资金规模超2300万美元:10月2日消息,据慢雾安全团队情报,2022年10月2号跨链DEX聚合器TransitSwap项目遭到攻击,导致用户资产被非预期的转出。慢雾安全团队分析评估此次被盗资金规模超过2300万美元,黑客地址为0x75F2...FD46和0xfa71...90fb。接着对此次攻击过程进行了分析:

1. 当用户在Transit Swap进行swap时,会先通过路由代理合约(0x8785bb...)根据不同的兑换类型选择不同的路由桥合约。随后路由桥合约(0x0B4727...)会通过权限管理合约(0xeD1afC...)的 claimTokens 函数将用户待兑换的代币转入路由桥合约中。因此在代币兑换前用户需要先对权限管理合约(0xeD1afC...)进行授权。

2. 而 claimTokens 函数是通过调用指定代币合约的 transferFrom 函数进行转账的。其接收的参数都由上层路由桥合约(0x0B4727...)传入,本身没有对这些参数进行任何限制只检查了调用者必须为路由代理合约或路由桥合约。

3. 路由桥合约(0x0B4727...)在接收到用户待兑换的代币后会调用兑换合约进行具体的兑换操作,但兑换合约的地址与具体的函数调用数据都由上层路由代理合约(0x8785bb...)传入,路由桥合约并未对解析后的兑换合约地址与调用数据进行检查。

4. 而代理合约(0x8785bb...)对路由桥合约(0x0B4727...)传入的参数也都来自于用户传入的参数。且代理合约(0x8785bb...)仅是确保了用户传入的 calldata 内各数据长度是否符合预期与所调用的路由桥合约是在白名单映射中的地址,未对 calldata 数据进行具体检查。

5. 因此攻击者利用路由代理合约、路由桥合约与权限管理合约均未对传入的数据进行检查的缺陷。通过路由代理合约传入构造后的数据调用路由桥合约的 callBytes 函数。callBytes 函数解析出攻击者指定的兑换合约与兑换数据,此时兑换合约被指定为权限管理合约地址,兑换数据被指定为调用 claimTokens 函数将指定用户的代币转入攻击者指定的地址中。实现了窃取所有对权限管理合约进行授权的用户的代币。

此次攻击的主要原因在于 Transit Swap 协议在进行代币兑换时并未对用户传入的数据进行严格检查,导致了任意外部调用的问题。攻击者利用此任意外部调用问题窃取了用户对Transit Swap授权的代币。

截止到目前,黑客已将 2,500 BNB 转移到 Tornado Cash,剩余资金分散保留在黑客地址中。经过黑客痕迹分析发现,黑客存在从 LATOKEN 等平台存提款的痕迹。慢雾 MistTrack 将持续跟进被盗资金的转移以及黑客痕迹的分析。[2022/10/2 18:37:27]

其由于其实际代码实现调用较为复杂,此处不再展示,感兴趣的朋友可以根据后面附录给出的合约地址在etherscan.io自行查看合约实现。另外,上面两张截图来源于我们自行开发的交易解析工具,目前开放公测中。欢迎各位点击?http://tx.blocksecteam.com:8080/?试用。我们的工具将函数调用与过程中产生事件log结合展示的方式,对于分析通缩代币等问题更有帮助。

MicroStrategy1月份买入660枚比特币,总计已购入12.5万枚:2月1日消息,MicroStrategy首席执行官MichaelSaylor发推称,MicroStrategy在1月份使用约2500万美元的现金再度购买了660枚比特币,平均价格为每枚比特币37865美元。截至1月31日,MicroStrategy已以37.8亿美元收购了125,051枚比特币,平均每个比特币的价格是30,200美元。[2022/2/1 9:26:27]

Memestake合约

下图是MemeStake的deposit函数。函数首先调用updatePool更新资金池状态,然后将用户的token转账给自己。当传入的_amount大于0时会在代码的1295行进行转账。

然而,由于KEANUtoken的通缩特性,虽然调用safeTransferFrom函数时传入的金额是_amount,但是实际上转入资金池的金额小于_amount。并且在代码分析中我们注意到,transfer的目的地是自己,也就是说对于MemeStake来说,所有用户的某个币种的存款都属于MemeStake。

在转账后的1296行,MemeStake会对用户的存款进行登记,但这里登记采用的仍然是_amount,因此用户真正的存款量比登记的user.amount更小。

最后在1299行,可以看出user.rewardDebt参数也是根据user.amount来计算的。

下图是MemeStake的withdraw函数。该函数首先会检查user.amount是否还有足够的余额,但由于user.amount本身比真实值大,因此这里的检查是不准确的。接下来,同样会调用updatePool函数更新资金池状态。

Travala与Cardano旗下风投Emurgo达成合作,将添加ADA支持:Cardano风险投资公司Emurgo与加密友好旅行预订平台Travala达成合作,Travala将添加ADA支持。作为其营销的一部分,所有使用ADA支付的用户将获得10%的现金返还,直至2020年7月31日。(CoinGape)[2020/7/1]

在1321行,withdraw函数会先扣除在user.amount中登记的余额,然后调用transfer函数把token转回用户。和deposit函数一样,这里的逻辑同样存在问题,由于每次转账都会造成通缩,因此转给用户的数量会小于实际的转账量。

最后来看MemeStake的updatePool函数。首先从1255行可以看出,每次调用会记录上一次更新的blockNumber,如果此次调用的区块和上次更新时相同,则会直接返回,也就是说?updatePool对每个区块只会更新一次资金池状态。

接下来在1259行,会获取MemeStake自身在token合约中的余额。最后在1275行,会利用这个余额作为分母,计算该资金池每一次deposit和withdraw的奖励。计算方式如下:

pool.accMfundPerShare=mFundReward/token.balanceOf(MemeStake)

回到withdraw,我们来看存取款奖励代币Mfund是怎样转账的。首先在上图withdraw函数的第1325行,计算用户是否有pending的Mfundtoken没有发放,计算公式为:

rewardMfund=user.amont*pool.accMfundPerShare/1e18-user.rewardDebt。

动态 | Decentraland将在Aragon上部署Decentraland DAO:关于Decentraland DAO与土地治理的投票已完成,按照投票结果,Decentraland DAO将在Aragon上建立。

本次投票有3项,分别是“一个 LAND相当于多少MANA”、“地主是否应该有投票权”、“Decentraland的DAO应该如何实施”。投票结果显示,用户一个 LAND相当于超过1000个MANA,地主应该拥有投票权,以及Decentraland DAO应该在Aragon上部署。

根据之前的设想,Decentraland DAO将负责以下工作:土地和房地产合同将归Aragon代理商合约所有;投票合约将尽可能简单,投票权根据用户持有的MANA的数量加权;由Agora DApp确定每个LAND代币的投票值等内容。[2019/12/24]

而rewardDebt是这样计算的:

user.rewardDebt=user.amount*pool.accMfundPerShare/1e18

因此,从代码中我们不难构造出一种可能的攻击:

首先,在一个交易内,通过反复调用deposit和withdraw函数,榨干MemeStake的资金池。这个操作利用了三个代码问题:

首先,user.amount的记账比真实值多,因此每次withdraw都可以成功。

第二,MemeStake中所有用户的资金都在一个池子中,因此每一笔转账实际上Burn掉的是池子中其他用户存入的KEANUtoken。

第三,由于updatePool在同一个块中不会进行状态更新,因此不会影响pool.accMfundPerShare参数,也不会产生Mfundtoken的reward。

接下来,在下一个区块时,直接调用withdraw函数。

通过对updatePool函数的分析可知,此时会产生池子状态的更新,且由于前一步操作榨干了MemeStake的资金池,token.balanceOf(MemeStake)极低,产生了巨大的pool.accMfundPerShare。

随后在withdraw函数的第1315行,计算出的Mfundreward量非常大,导致巨额的Mfund回报。

0x2.攻击分析

前面介绍了漏洞成因及漏洞的利用方式,我们接下来介绍攻击者实际是如何进行攻击的。

如图所示,攻击可以分为4步,其中关键攻击步骤为第2步,利用通缩代币的特性操纵Memestake的奖励计算。

第1步,首先攻击者创建了两个合约并进行初始化,其中?合约一?为表现正常的投资合约,攻击者通过合约一往Memestake存入约2,049B?KEANU?,为步骤3获利大量MFUND奖励做好铺垫。合约二?为操纵Memestake的奖励计算的合约,先进行了相关token的approve操作。

第2步,攻击者先从uniswapV2中flashloan大量的KEANU代币,然后通过合约二往Memestake中多次deposit和withdraw大量KEANU,导致Memestake被迫大量交易KEANU。由于KEANU是一种通缩代币,每次交易会烧掉2%的交易额,导致用户真正存入Memestake的量比登记的user.amount更小,取出时又是按照user.amount转给用户,导致Memestake池子中KEANU的代币持有量不断减少,最终为1e-07。如下图所示,涉及交易为?0x00ed,交易截图未完全,请自行点击链接查看。

第3步,攻击者首先通过合约二调用了Memestake.updatePool()函数,修改了KEANU所在池子的accMfundPerShare,由于该值依赖于池子所持有的KEANU的代币量,而这在第二步中被操纵了。这使得合约二在接下来withdraw的时候可以获得远超正常值的?Mfund这种token作为奖励。第3步发生于交易?0xa945?中,同时攻击者开始将部分获得的MFund换成WETH等代币。

第4步,攻击者将获得的MFund、KEANU等代币换成ETH,并通过?Tornado.Cash?转移走,至此攻击结束,攻击者从中获利ETH55.9484578158357个,约10万美元。

下图为攻击地址?0x0333?的交易截图,交易截图未完全,请点击地址链接查看详情。

攻击相关

有趣的是,攻击的第2、3步都与flashbots交易有关。

其中第2步涉及的交易?0x00ed?由于采用了UniswapV2flashloan,且交易前后相当于用约38ETH去购买了KEANU,由此产生了很大的套利空间。因此该笔交易受到另一名攻击者的三明治攻击,即本事件的攻击者也是另一个三明治事件的受害者。该三明治攻击者获利3.2769697165652474ETH,但是给了矿工2.405295771958891249ETH,净获利0.8716739446063562ETH。

而第3步攻击涉及的交易?0xa945?则由于在uniswap池子中大量售出MFund,创造了套利空间,所以被back-running而成为flashbots交易。该searcher获利0.13858054192600666ETH,其中交给矿工0.099085087477094764ETH,净获利0.03949545444891189ETH。

有关flashbots和三明治攻击的详细介绍可参阅我们的另一篇攻击介绍?由xSNXa被攻击事件引发的对FlashBot的思考?。由于UniswapV2中将flashloan的实现与普通的Swap结合在一起,具体的实现原理及为什么由此导致第2步存在套利空间可以参阅我们的paper?TowardsAFirstSteptoUnderstandFlashLoanandItsApplicationsinDeFiEcosystem(SBC2021).

0x3.总结及安全建议

攻击者利用通缩代币的特性控制了平台持有代币的数量,影响了奖励代币的计算发放,由此获利ETH55.9484578158357个。而这原因在于,SanshuInu平台在引入通缩代币时缺乏一定的安全考量,导致攻击者有空可趁。

由此,我们给有关项目方的安全建议有:

对项目引入的代币应当有足够的认识,或者通过建立白名单的机制对交互的token进行限制。近两年来,已经有多起安全事件与未加限制的token或者交互的token有问题有关,如最近的BSC链上的ImpossibleFinance事件,我们这个系列上一篇Akropolis攻击事件,2020-11-17的OriginDollar事件及2020-06-28的Balancer事件等。特别是与通缩代币的交互,如在该事件发生不久后,PeckShield也报告了一起发生在polygon链上同样利用通缩代币及奖励计算漏洞的安全事件——PolyYeld事件。

项目上线前,需要找有资质的安全公司进行安全审计。我们可以看到,由于defi的moneylego属性,很多defi项目之间可以随意组合,从而产生了互相影响,而这正是defi领域安全事件频发的原因。因此,项目方所需关注的安全问题不仅仅局限于自己项目,也同样需要考虑在与其他项目交互过程中存在的安全漏洞。

BlockSec团队以核心安全技术驱动,长期关注DeFi安全、数字货币反和基于隐私计算的数字资产存管,为DApp项目方提供合约安全和数字资产安全服务。团队发表20多篇顶级安全学术论文(CCS,USENIXSecurity,S&P),合伙人获得AMiner全球最具影响力的安全和隐私学者称号(2011-2020排名全球第六).研究成果获得中央电视台、新华社和海外媒体的报道。独立发现数十个DeFi安全漏洞和威胁,获得2019年美国美国国立卫生研究院隐私计算比赛(SGX赛道)全球第一名。团队以技术驱动,秉持开放共赢理念,与社区伙伴携手共建安全DeFi生态。

https://www.blocksecteam.com/

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金智博客

火币下载高倍杠杆退场进行时_BitMEX:BitMEX

本文系链捕手原创文章,作者为RichardLee。在缺乏监管的恶性竞争下,加密衍生品交易所们将杠杆倍数从20倍抬升至100倍、125倍,乃至150倍,尽管自身从中获利丰厚,但对于加密市场的健康度.

[0:0ms0-4:649ms