木星链 木星链
Ctrl+D收藏木星链

BUFF:慢雾深度解析 Bitfinex 天价手续费转账:BUG+显示错误「酿成大错」

作者:

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

撰文:Thinking@慢雾安全团队

事件背景

分析源自一笔转账金额10wUSDT,手续费却高达7,676枚ETH的天价手续费交易。https://etherscan

将int转成Hexhttps://github

判断是否可以被2整除,如果不行需要在字符开头添加一个0,这里主要是为了能够成功的将数据2个1组写入到buffer。https://github

if(a

returna;}

慢雾:Avalanche链上Zabu Finance被黑简析:据慢雾区情报,9月12日,Avalanche上Zabu Finance项目遭受闪电贷攻击,慢雾安全团队进行分析后以简讯的形式分享给大家参考:

1.攻击者首先创建两个攻击合约,随后通过攻击合约1在Pangolin将WAVAX兑换成SPORE代币,并将获得的SPORE代币抵押至ZABUFarm合约中,为后续获取ZABU代币奖励做准备。

2.攻击者通过攻击合约2从Pangolin闪电贷借出SPORE代币,随后开始不断的使用SPORE代币在ZABUFarm合约中进行`抵押/提现`操作。由于SPORE代币在转账过程中需要收取一定的手续费(SPORE合约收取),而ZABUFarm合约实际接收到的SPORE代币数量是小于攻击者传入的抵押数量的。分析中我们注意到ZABUFarm合约在用户抵押时会直接记录用户传入的抵押数量,而不是记录合约实际收到的代币数量,但ZABUFarm合约在用户提现时允许用户全部提取用户抵押时合约记录的抵押数量。这就导致了攻击者在抵押时ZABUFarm合约实际接收到的SPORE代币数量小于攻击者在提现时ZABUFarm合约转出给攻击者的代币数量。

3.攻击者正是利用了ZABUFarm合约与SPORE代币兼容性问题导致的记账缺陷,从而不断通过`抵押/提现`操作将ZABUFarm合约中的SPORE资金消耗至一个极低的数值。而ZABUFarm合约的抵押奖励正是通过累积的区块奖励除合约中抵押的SPORE代币总量参与计算的,因此当ZABUFarm合约中的SPORE代币总量降低到一个极低的数值时无疑会计算出一个极大的奖励数值。

4.攻击者通过先前已在ZABUFarm中有进行抵押的攻击合约1获取了大量的ZABU代币奖励,随后便对ZABU代币进行了抛售。

此次攻击是由于ZabuFinance的抵押模型与SPORE代币不兼容导致的,此类问题导致的攻击已经发生的多起,慢雾安全团队建议:项目抵押模型在对接通缩型代币时应记录用户在转账前后合约实际的代币变化,而不是依赖于用户传入的抵押代币数量。[2021/9/12 23:19:21]

以出错的示例数据:33974229950.550003进行分析,经过intToBuffer函数中的intToHex和padToEven处理后得到7e9059bbe.8ccd,这部分浏览器js和nodejs的结果都是一致的。

慢雾科技与 OK 资本达成战略合作:慢雾科技与 OK 资本达成战略合作,为 OK 资本投资的全球优质区块链创业项目提供智能合约安全审计服务,避免项目出现重大安全问题。此前,慢雾科技也曾对 OK 资本的战略合作伙伴 OKEx 数字资产交易平台上的数百个基于以太坊 ERC20 的项目进行过智能合约 batchOverflow 问题的排查,排除安全隐患。[2018/5/25]

不一致的地方是在newBuffer的操作:

newBuffer(padToEven(hex.slice(2)),'hex');

处理方式分析:浏览器js

通过webpack打包好js文件并对文件进行引用,然后在浏览器上进行调试分析。

首先输入的示例字符33974229950.550003会进入到intToBuffer的函数中进行处理。

同步分析intToBuffer的处理过程,这部分和」关键代码分析「部分的代码逻辑是一样的,处理转换部分得到的结果是7e9059bbe.8ccd。

接下来分析如何将转换后的字符填充进入的buffer中,通过这步可以得到buffer的内容是126,144,89,187,14,140,205对应的是7e,90,59,bb,e,8c,cd。

>0x7e->126>0x90->144>0x59->89>0xbb->187>0xe->14>0x8c->140>0xcd->205

这里发现e.这部分的小数点消失了,于是开始解小数点消失之迷,追踪到hexWrite这个函数,这个函数会将得到的数据2个一组进行切分。然后用了parseInt对切分后的数据进行解析。

然而parseInt('e.',16)->14===parseInt('e',16)->14消失的小数点被parseInt吃掉了,导致最终写入到buffer中的数据发生了错误,写入buffer的值是7e9059bbe8ccd。

处理方式分析:nodejs

由于浏览器上出问题的是7_**__**_e9059bbe.8ccd在写入buffer的时候小数点被parseInt吃掉了导致数据出错,但是经过分析,node的数据也是错误的,且产生错误的原因是和浏览器的不一样。

首先我们先看下如下的示例:

node三组不同的数据填充到buffer得到的结果居然是一样的,经过分析node的buffer有个小特性,就是2个一组切分后的数据,如果没法正常通过hex解析的,就会把那一组数据以及之后的数据都不处理了,直接返回前面可以被正常处理的那部分数据。可以理解为被截断了。这部分可以参考node底层的buffer中node_buffer.cc中的代码逻辑。

>newBuffer('7e9059bbe','hex')>newBuffer('7e9059bbe.8ccd','hex')>newBuffer('7e9059bb','hex')

执行结果的比较

node由于会将原始数据7e9059bbe.8ccd中的e.及之后的数据进行截断,所以最终错误的值是7e9059bb,相比正确的值07e9059bbe小。

node的执行结果:

浏览器由于会将原始数据7e9059bbe.8ccd中的.吃掉,所以最终错误的值是7e9059bbe8ccd,相比正确的值07e9059bbe大很多。

浏览器的执行结果:

问题的原因

ethjs-util的intToBuffer函数不支持浮点型的数据,且在这个函数中没有判断传入的变量类型,来确保变量类型是预期内的。由于ethereumjs的toBuffer引用了ethjs-util的intToBuffer进行处理,也没有对数据进行检查。导致了这次事件的发生,所幸最终善良的矿工归还了「天价手续费7626ETH」。

吸取的教训

从第三方的库的角度来看,在编码过程中应该要遵循可靠的安全的编码规范,在函数的开头要对传入的数据进行合法性的检查,确保数据和代码逻辑是按照预期内执行。

从库的使用者的角度来看,使用者应该要自行阅读第三方库的开发文档和对接文档,并且也要对代码中接入第三方库的逻辑进行测试,通过构造大量的数据进行测试,确保业务上能够正常按照期望执行,保证高标准的测试用例的覆盖率。

参考资料:https://github.com/ethereumjs/ethereumjs-monorepo/issues/1497https://blog.deversifi.com/23-7-million-dollar-ethereum-transaction-fee-post-mortem/https://www.chainnews.com/news/611706276133.htm

标签:BUFFUFFFERETHBUFFS币Fluffy TokenFERRARI币ETHBACK价格

抹茶交易所热门资讯
加密货币:土耳其总统:土耳其正与加密货币“交战”

据U.Today消息,土耳其总统RecepTayyipErdogan9月18日在梅尔辛市与来自81个省的学生会面时表示,土耳其正在与加密货币“交战”.

1900/1/1 0:00:00
区块链:科普 | 加密货币中的熵是什么?使用24字短语比12字短语更安全吗?

原标题:《24个比12个更安全吗?熵来决定》熵本身就是一个重要的热力学定律,是一个涉及……热力学的深刻主题。熵让我们感兴趣的是,熵对密码学和加密货币至关重要。没有熵,加密货币就不安全.

1900/1/1 0:00:00
ALT:Altair和RMRK达成合作,为Kusama Auctions推出限量版NFT

巴比特讯,9月20日,去中心化资管协议Centrifuge宣布其先行网Altair和RMRKKanarias达成合作,为KusamaAuctions推出限量版NFT.

1900/1/1 0:00:00
区块链:广东创新推出“区块链+税务”应用,区块链电子发票赋能多场景领域

原标题:《广东创新推出“区块链+税务”应用让办税更加便利》来源:中新网编辑:陈文韬 在广州越秀区较场东路,卢文锋通过手持终端实时查看临时泊位的车辆状态.

1900/1/1 0:00:00
NFT:大厂NFT作品疯炒到发行价10倍 有交易平台为“黄牛”开绿灯

证券日报记者邢萌见习记者张博“太难抢了,根本抢不到。”中秋节之前,“黄牛”余军对记者抱怨。余军所说的并不是车票,而是当日某互联网大厂限量发售的亚运会“数字火炬”数字收藏品.

1900/1/1 0:00:00
元宇宙:元宇宙视角下《失控玩家》:当NPC在不平等的虚拟世界觉醒

来源:澎湃新闻作者:吴晨我是带着元宇宙的想象去看《失控玩家》的。紧凑的情节和动感的特效之外,《失控玩家》至少开了三个脑洞.

1900/1/1 0:00:00