撰文: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的结果都是一致的。
慢雾:Inverse Finance遭遇闪电贷攻击简析:据慢雾安全团队链上情报,Inverse Finance遭遇闪电贷攻击,损失53.2445WBTC和99,976.29USDT。慢雾安全团队以简讯的形式将攻击原理分享如下:
1.攻击者先从AAVE闪电贷借出27,000WBTC,然后存225WBTC到CurveUSDT-WETH-WBTC的池子获得5,375.5个crv3crypto和4,906.7yvCurve-3Crypto,随后攻击者把获得的2个凭证存入Inverse Finance获得245,337.73个存款凭证anYvCrv3Crypto。
2.接下来攻击者在CurveUSDT-WETH-WBTC的池子进行了一次swap,用26,775个WBTC兑换出了75,403,376.18USDT,由于anYvCrv3Crypto的存款凭证使用的价格计算合约除了采用Chainlink的喂价之外还会根据CurveUSDT-WETH-WBTC的池子的WBTC,WETH,USDT的实时余额变化进行计算所以在攻击者进行swap之后anYvCrv3Crypto的价格被拉高从而导致攻击者可以从合约中借出超额的10,133,949.1个DOLA。
3.借贷完DOLA之后攻击者在把第二步获取的75,403,376.18USDT再次swap成26,626.4个WBTC,攻击者在把10,133,949.1DOLAswap成9,881,355个3crv,之后攻击者通过移除3crv的流动性获得10,099,976.2个USDT。
4.最后攻击者把去除流动性的10,000,000个USDTswap成451.0个WBT,归还闪电贷获利离场。
针对该事件,慢雾给出以下防范建议:本次攻击的原因主要在于使用了不安全的预言机来计算LP价格,慢雾安全团队建议可以参考Alpha Finance关于获取公平LP价格的方法。[2022/6/16 4:32:58]
不一致的地方是在newBuffer的操作:
慢雾揭秘Pickle Finance被黑过程:2020 年 11 月 22 日,以太坊 DeFi 项目 Pickle Finance 遭受攻击,损失约 2000万DAI。慢雾安全团队跟进相关事件并进行分析,以下为分析简略过程:
1、项目的 Controller 合约中的 swapExactJarForJar 函数允许传入两个任意的 jar 合约地址进行代币的兑换,其中的 _fromJar, _toJar, _fromJarAmount, _toJarMinAmount 都是用户可以控制的变量,攻击者利用这个特性,将 _fromJar 和 _toJar 都填上自己的地址,_fromJarAmount 是攻击者设定的要抽取合约的 DAI 的数量,约 2000万 DAI。
2、使用 swapExactJarForJar 函数进行兑换过程中,合约会通过传入的 _fromJar 合约和 _toJar 合约的 token() 函数获取对应的 token 是什么,用于指定兑换的资产。 而由于 _fromJar 合约和 _toJar 合约都是攻击者传入的,导致使用 token() 函数获取的值也是可控的,这里从 _fromJar 合约和 _toJar 合约 获取到的 token 是 DAI。
3. 此时发生兑换,Controller 合约使用 transferFrom 函数从 _fromJar 合约转入一定量的的 ptoken,但是由于 fromJar 合约是攻击者控制的地址,所以这里转入的 ptoken 是攻击者的假币。同时,因为合约从 _fromJar 合约中获取的 token 是 DAI,然后合约会判断合约里的资金是否足够用于兑换,如果不够,会从策略池中赎回一定量的代币 然后转到 Controller 合约中。在本次的攻击中,合约中的 DAI 不足以用于兑换,此时合约会从策略池中提出不足的份额,凑够攻击者设定的 2000万 DAI 。
4. 兑换继续,Controller 合约在从策略池里提出 DAI 凑够攻击者设定的 2000万 DAI后,会调用 _fromJar 的 withdraw 函数,将攻击者在第三步转入的假 ptoken burn 掉,然后合约判断当前合约中 _toJar 合约指定的 token 的余额是多少,由于 _toJar 合约指定的 token 是 DAI,Controller 合约会判断合约中剩余 DAI 的数量,此时由于 第三步 Control[2020/11/22 21:39:57]
newBuffer(padToEven(hex.slice(2)),'hex');
动态 | 慢雾关于 BSV 区块异常的进一步说明:此前慢雾安全团队披露“昨晚 BSV 区块连续出现多次回滚(高度 578640-578645),异常区块的交易数超多,通过慢雾安全团队的持续监测与分析,虽然 BSV 主网之后恢复正常且这次回滚行为和之前慢雾安全团队披露的 ETC 51% 双花盗币攻击行为不一样,出于谨慎目的,建议对接了 BSV 的交易所暂停 BSV 充提或提高确认数。”之后,通过与 BSV 社区的沟通,BSV 社区指出这是一位开发者在主网进行的一次短时生成大量交易的压力测试,该测试导致了本次区块深度重组事件,这种事件不会导致双花攻击,不会造成交易损失。通过慢雾安全团队的进一步分析来看,慢雾安全团队倾向认同这种“区块重组”说法。[2019/4/19]
处理方式分析:浏览器js
通过webpack打包好js文件并对文件进行引用,然后在浏览器上进行调试分析。
动态 | 慢雾区:警惕假冒门罗币分叉的 Monero Rings:据慢雾区消息,需警惕假冒门罗币分叉的 Monero Rings(monero-rings.org),其钱包存在明显的恶意行为,通过空投诱导门罗币持有者在其钱包(myxrmwallet.com)输入助记词或相关私钥,并偷偷上传,以此完成盗币目的。整个攻击的准备工作至少实施了一个月,各方面都做了精心设计,容易被误认为是一个计划长期运营的门罗分叉币,但实际上却是个钓鱼陷阱。慢雾区提醒用户,私钥即身份,需谨慎对待自己的私钥。[2019/3/1]
首先输入的示例字符33974229950.550003会进入到intToBuffer的函数中进行处理。
声音 | 慢雾:ETC 51%双花攻击所得的所有ETC已归还完毕:据慢雾区消息,ETC 51%攻击后续:继Gate.io宣称攻击者归还了价值10万美金的ETC后,另一家被成功攻击的交易所Yobit近日也宣称收到了攻击者归还的122735 枚 ETC。根据慢雾威胁情报系统的深度关联分析发现:攻击者于UTC时间2019年1月10日11点多完成了攻击所获的所有ETC的归还工作,至此,持续近一周的 ETC 51% 阴云已散。[2019/1/16]
同步分析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
来源:未来智库 一、山雨欲来:当理想中的虚拟世界照进现实 1.1、什么是元宇宙? 元宇宙概念的提出:长时间仅存在于文学与影视作品中.
1900/1/1 0:00:00作者|?ChenglinPua?编审?|于百程?排版?|?王纪珑琰“随着元宇宙概念股Roblox于2021年3月10日在美国上市,元宇宙开始加速进入人们的视野。有人非常看好元宇宙,将它称为“下一代互联网”.
1900/1/1 0:00:00来源:孟永辉频道 作者:辉常观察 原标题:《元宇宙,腾讯们的解药》很长时间没有过对一个概念如此追捧的景象了。现在,这样的景象正在元宇宙的身上发生。除了资本市场对元宇宙推崇备至之外,我们看到的更多的是头部巨头们对元宇宙的深度布局.
1900/1/1 0:00:00什么是元宇宙?这一问题在近期已被诸多媒体反复设问,而他们的回答也大多相差无几:"Roblox给出的定义,包含八大要素:身份、朋友、沉浸感、低延迟、多元化、随时随地、文明和经济系统"这一定义频繁见诸于元宇宙相关的报道,被多家媒体引述.
1900/1/1 0:00:00来源:财联社|区块链日报 记者张洋洋 近日,网传近期监管部门加强了对中国互联网企业发行NFT以及建立NFT平台的监管力度,并约谈了部分互联网企业。目前包括腾讯、阿里巴巴等,都已完全删去NFT字样,改为“数字藏品”.
1900/1/1 0:00:009月30日,据thepaypers消息,总部位于瑞士的基于区块链的供应链技术公司Authena宣布完成了来自瑞士和英国的天使投资人的210万欧元种子轮融资.
1900/1/1 0:00:00