草庐IT

比特安详细解析Fantasm Finance事件:注重细节,才能历久弥新

比特安审计中心 2024-03-20 原文

近日,比特安监管平台检测到Fantasm Finance抵押池被恶意利用黑客使用以太坊隐私交易平台 Tornado.cash 混币 1,007 ETH(价值约270万美元)。

对此,比特安安全团队从合约地址及攻击操作等方面进行详细的解读并分析。

比特安审计中心(简称:比特安)成立于2018年,汇聚了一批由博士与硕士为主的高层次技术研发人才,在安全产品开发、安全攻防技术、安全体系建设、代码审计、系统逆向方面,拥有着非常丰富的经验。

以下就是比特安安全团队分析结果

 

交易哈希

https://ftmscan.com/tx/0x64da8b8043b14fe93f7ab55cc56ccca2d190a59836a3f45dbb4b0a832e329cac

https://ftmscan.com/tx/0xa84d216a1915e154d868e66080c00a665b12dab1dae2862289f5236b70ec2ad9

攻击步骤

①攻击者在地址0x944b58c9b3b49487005cead0ac5d71c857749e3e部署了一个未经验证的合约。

②在第一个tx中,攻击者将Fantom代币(FTM)换成FSM代币,并在合约0x880672ab1d46d987e5d663fc7476cd8df3c9f937中调用mint()函数。

③攻击者调用collect()函数,以此铸造了超出权限更多的XFTM代币。

④攻击者多次重复步骤②和③,造成Fantasm Finance巨额损失。

漏洞分析

在函数calcMint中,合约使用以下公式来计算铸币量:

_xftmOut = (_fantasmIn * _fantasmPrice * COLLATERAL_RATIO_MAX * (PRECISION - mintingFee)) / PRECISION / (COLLATERAL_RATIO_MAX - collateralRatio) / PRICE_PRECISION。

由于小数点错误,导致_xftmOut最终的值远远大于代码的设计初衷。

资金去向

攻击者可因此获取大约1000个ETH,所有的资金均被转移至Etherscan(地址为0x47091e015b294b935babda2d28ad44e3ab07ae8d)并被发送到tornado proxy。

  

天下大事,必做于细

仅仅因为一个小数点错误,就导致数百万美元的资产一朝蒸发这颠覆了人们的潜在认知,因为在加密世界里大家一提到漏洞,往往会下意识认为很复杂,事实证明并非总是如此所以“细节决定成败”这句话并非空穴来风。

毕竟“计算错误”这一类型的风险只需通过适当的同行评审、单元测试和安全审计,极易避免所以小编希望加密项目方及用户们应提高相关警惕并及时对合约代码进行完善和审计。

区块链安全,由我来守护

区块链并非黑客可以肆意横行的乐园,总是会有那么些人,因为热爱因为责任,前仆后继的投入到区块链安全建设之中。而现在,您的安全,由比特安审计中心来守护。

比特安致力于区块链安全生态建设,是全国领先的区块链安全服务平台,为区块链企业提供安全审计、资产追溯与AML反洗钱、隐私保护、威胁情报、安全防护、安全咨询等全方位的安全服务与支持。截止至今,我们检测中心已为40多个企业和70多个项目进行了安全评估,得到了企业,项目和政府领导的高度认可。

有关比特安详细解析Fantasm Finance事件:注重细节,才能历久弥新的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  4. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

    简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

  5. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  6. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  7. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  8. ruby - 我怎样才能只写一次 "Text"并同时检查 path_info 是否包含 'A' ? - 2

    -if!request.path_info.include?'A'%{:id=>'A'}"Text"-else"Text"“文本”写了两次。我怎样才能只写一次并同时检查path_info是否包含“A”? 最佳答案 有两种方法可以做到这一点。使用部分,或使用content_forblock:如果“文本”较长,或者是一个重要的子树,您可以将其提取到一个部分。这会使您的代码变干一点。在给出的示例中,这似乎有点矫枉过正。在这种情况下更好的方法是使用content_forblock,如下所示:-if!request.path_info.inc

  9. ruby - 如何使用 Nokogiri 解析纯 HTML 表格? - 2

    我想用Nokogiri解析HTML页面。页面的一部分有一个表,它没有使用任何特定的ID。是否可以提取如下内容:Today,3,455,34Today,1,1300,3664Today,10,100000,3444,Yesterday,3454,5656,3Yesterday,3545,1000,10Yesterday,3411,36223,15来自这个HTML:TodayYesterdayQntySizeLengthLengthSizeQnty345534345456563113003664354510001010100000344434113622315

  10. ruby-on-rails - 事件管理员和自定义方法 - 2

    这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什

随机推荐