
零时科技区块链安全情报平台监控到消息,北京时间 2022年5月16日 BNB Chain 和 Ethereum 链上 FEGtoken 遭到闪电贷攻击。损失资金价值超过130万美元,零时科技安全团队及时对此安全事件进行分析。

0x73b359d5da488EB2E97990619976F2f004e9fF7C
0x9a843bb125a3c03f496cb44653741f2cef82f445
https://etherscan.io/tx/0x1e769a59a5a9dabec0cb7f21a3e346f55ae1972bb18ae5eeacdaa0bc3424abd2(Ethereum)
https://bscscan.com/tx/0x77cf448ceaf8f66e06d1537ef83218725670d3a509583ea0d161533fda56c063(BNB Chain )
https://etherscan.io/address/0xf2bda964ec2D2fcB1610c886eD4831bf58f64948#code(Ethereum)
https://bscscan.com/address/0x818e2013dd7d9bf4547aaabf6b617c1262578bc7#code(BNB Chain )
通过分析攻击者在BNB Chain和 Ethereum 两条链上的多笔攻击交易,每笔攻击交易流程大致如下:
1.攻击者通过闪电贷或者已获利的资金作为攻击交易的初始资金。
2.将获取的一部分初始资金质押后,从FEG Wrapped BNB合约中获取 fWrapped 代币,例如BNB质押获取fBNB。
3.攻击者通过攻击合约继续创建10个新的合约地址,为后续调用做准备。

4.攻击者将获取的 fWrapped 代币通过 FEGexPRO.depositInternal 进行存款,此时攻击者在 FEGexPRO 合约有存款资金。
5.攻击者将自己创建的10个合约地址逐一作为path传入``
FEGexPRO.swapToSwap方法,通过FEGexPRO.depositInternal 和FEGexPRO.swapToSwap多次循环调用,最终10个合约均获得转移合约资金权限。
FEGexPRO.swapToSwap

FEGexPRO.depositInternal
6.攻击者调用转账方法获取授权给合约资金,成功获利(部分交易归还闪电贷)。
通过攻击交易流程可以发现,攻击者成功获利的主要操作是通过上述步骤五循环调用FEGexPRO.depositInternal和FEGexPRO.swapToSwap 两个方法获取合约的授权资金。这里跟进以上两个方法:
FEGexPRO.swapToSwap 方法

通过之前的交易流程可以明确,攻击者通过一步正常调用 depositInternal 方法存款后,调用swapToSwap方法传入的path参数为攻击者创建的合约地址。由于path正常情况下为兑换路径,swapToSwap方法逻辑中会给当前路径进行approve授权操作,方便后续兑换资金转移。但由于攻击者传入的path为自己创建的合约地址,所以这里swapToSwap方法逻辑中也会给攻击者传入的合约地址授权,但在后续path调用中,该资金并未转移,也就是用户余额减少了,但该合约地址中资金并未减少。(此时攻击者并未获利)
随后攻击者继续调用depositInternal 方法,继续跟进:
FEGexPRO.depositInternal 方法

该方法中,传入的可控值只有amt,也就是存款金额。由于第一次正常调用depositInternal方法已经进行了存款,并且攻击者调用swapToSwap方法也给自己的合约进行了授权操作,唯一与正常逻辑不符合的是,FEGexPRO合约地址的余额未及时减除,此步骤正好给了攻击者可乘之机。
当攻击者调用swapToSwap方法后,FEGexPRO合约余额未减除时,攻击者继续调用depositInternal方法进行存款,由于存款时会先获得之前的代币余额,之后进行转账,随后获取FEGexPRO合约地址余额,所以当攻击者此时转入很小的资金,并不会对合约资金有大的影响,但由于之前的FEGexPRO合约地址余额未通过swapToSwap方法减除,所以这里攻击者依然能够获取与第一次等量的存款。
之后攻击者通过swapToSwap与depositInternal循环调用,获取了FEGexPRO合约的所有资金。
BNB Chain 和 Ethereum 链上攻击者资金来源均来自 Tornado.Cash 混币平台,数量分别为1枚 ETH 和 1 枚 BNB。目前两条链上获利资金 144.8 枚ETH 和 3278.1 枚BNB 均未转移。

通过此次攻击事件来看,FEGexPRO.swapToSwap合约未对传入的path路径参数进行严格校验,导致攻击者可以通过多个攻击合约多次循环授权,取走合约中所有资金。对于该合约代码的校验缺失风险,完全可以通过代码安全审计避免风险发生。
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
以太坊价格分析表明横盘整理,偏向中性。价格从前一交易日的高点1,791美元回落后正在盘整。但是,有趣的是,多头在1,680美元附近持有重要支撑。多头在1,700美元的心理水平附近聚集动能,并准备在接下来的几个交易日推向1,800美元。以太坊价格显示出盘整迹象,因为它形成了多个连续的顶部形态。这种回撤可能是第二大加密货币下一轮上涨的基石。以太坊连续第二个交易日走低。过去10天,价格在1,590-1,760美元的短期区间内盘整。每日烛台高于1,800美元将维持ETH的进一步上涨。ETH价格走低日线图上,以太坊价格在上升趋势线附近获得一轮支撑。来自879.80美元低点的看涨趋势线为ETH买家提供了支
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什
例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果
我有一个将某些事件写入队列的Rails3应用。现在我想在服务器上创建一个服务,每x秒轮询一次队列,并按计划执行其他任务。除了创建ruby脚本并通过cron作业运行它之外,还有其他稳定的替代方案吗? 最佳答案 尽管启动基于Rails的持久任务是一种选择,但您可能希望查看更有序的系统,例如delayed_job或Starling管理您的工作量。我建议不要在cron中运行某些东西,因为启动整个Rails堆栈的开销可能很大。每隔几秒运行一次它是不切实际的,因为Rails上的启动时间通常为5-15秒,具体取决于您的硬件。不过,每天这样做几
我有一个帖子属于城市的关系,城市又属于一个州,例如:classPost现在我想找到所有帖子及其所属的城市和州。我编写了以下查询来获取带有城市的帖子,但不知道如何在同一查找器中获取带有城市的相应州:@post=Post.find:all,:include=>[:city]感谢任何帮助。谢谢。 最佳答案 Post.all(:include=>{:city=>:state}) 关于ruby-on-rails-使用Rails事件记录获取二级模型,我们在StackOverflow上找到一个类似的问
我觉得我错过了什么。我正在编写一个rubygem,它允许与事件记录进行交互,作为其主要功能的附加功能。在为其编写测试用例时,我需要能够指定虚拟事件记录模型来测试此功能。如果我可以获得一个事件记录模型的实例,它不需要与数据库的任何连接,可以有关系,所有这些东西,但不需要我在数据库中设置表,那就太棒了。我对测试还很陌生,在Rails测试之外我也很陌生,但似乎我应该能够相当轻松地完成类似的事情,但我什么也没找到。谁能告诉我我错过了什么?我看过工厂、制造商、固定装置,所有这些似乎都想达到目标。人们如何在您只需要AR对象进行测试的地方测试gem? 最佳答案
我想创建一个模块,为从事件记录库继承的类提供一些通用方法。以下是我们可以实现的两种方式。1)moduleCommentabledefself.extended(base)base.class_evaldoincludeInstanceMethodsextendClassMethodsendendmoduleClassMethodsdeftest_commentable_classmethodputs'testclassmethod'endendmoduleInstanceMethodsdeftest_commentable_instance_methodputs'testinstanc
目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标