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

撰文:Thinking@慢雾安全团队

事件背景

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

将int转成Hexhttps://github

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

if(a

returna;}

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

慢雾:警惕针对 Blur NFT 市场的批量挂单签名“零元购”钓鱼风险:金色财经报道,近期,慢雾生态安全合作伙伴 Scam Sniffer 演示了一个针对 Blur NFT 市场批量挂单签名的“零元购”钓鱼攻击测试,通过一个如图这样的“Root 签名”即可以极低成本(特指“零元购”)钓走目标用户在 Blur 平台授权的所有 NFT,Blur 平台的这个“Root 签名”格式类似“盲签”,用户无法识别这种签名的影响。慢雾安全团队验证了该攻击的可行性及危害性。特此提醒 Blur 平台的所有用户警惕,当发现来非 Blur 官方域名(blur.io)的“Root 签名”,一定要拒绝,避免潜在的资产损失。[2023/3/7 12:46:39]

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

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

慢雾创始人通过其推特向跨链DID .bit成功申领slowmist.bit:9月14日消息,慢雾创始人通过其推特向跨链 DID .bit 申领了保留账户 slowmist.bit。据悉,.bit 通过引用第三方数据源保留的账户,在规定时间内成功发起申领就可以按注册费获得该账户。

此前报道,8月15日,跨链DID .bit宣布完成1300万美元A轮融资,CMB International领投,HashKey Capita、QingSong Fund、GSR Ventures、GGV Capital、SNZ 与 SevenX 参投。[2022/9/14 13:29:33]

处理方式分析:浏览器js

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

慢雾:Lendf.Me攻击者刚归还了126,014枚PAX:慢雾安全团队从链上数据监测到,Lendf.Me攻击者(0xa9bf70a420d364e923c74448d9d817d3f2a77822)刚向Lendf.Me平台admin账户(0xa6a6783828ab3e4a9db54302bc01c4ca73f17efb)转账126,014枚PAX,并附言\"Better future\"。随后Lendf.Me平台admin账户通过memo回复攻击者并带上联系邮箱。此外,Lendf.Me攻击者钱包地址收到一些受害用户通过memo求助。[2020/4/20]

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

声音 | 慢雾科技联合创始人余弦:隐私不是拿来保护的 是拿来控制的:据巴比特消息,慢雾科技联合创始人余弦今日在活动中表示:“我觉得隐私不是拿来保护的。我的观点是,隐私是拿来控制的。大家都知道我们国家的法律里面有一个关于隐私的权利,大家都有隐私权,当然不一定所有人都会深刻地了解这个东西,包括你在使用很多互联网应用的时候,你可能不一定会它的隐私条款。”[2019/5/16]

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

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

动态 | 慢雾区再发预警,请 DApp 开发者自查随机数:知名 DApp EOSDice 再次由于随机数问题被黑,攻击者是之前攻击 EOSDice 及 FFGame DApp 的黑客,攻击手法也是由于使用了可控的随机数种子,在之前(11-8号)慢雾已经预警过攻击手法,请各位 DApp 开发者仔细核对自己的随机数种子和算法是否可被预测,勿存在任何侥幸。[2018/11/10]

>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

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

金宝趣谈

[0:15ms0-8:361ms