欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

门罗币(XMR)锁定转账攻击细节分析

来源:本站整理 作者:佚名 时间:2019-08-13 TAG: 我要投稿

近日据慢雾区情报显示,针对门罗币(XMR)转账锁定攻击在多个交易所出现,慢雾安全团队在收到情报第一时间进行分析跟进,本着负责任披露的原则我们第一时间在慢雾区进行了预警并为我们所服务的客户进行了及时的情报同步以及协助检测和修复。如有其他需要提供验证和检测服务欢迎联系慢雾安全团队。
 
攻击步骤
0x01:通过 monero-wallet-cli 输入密码登录钱包0x02:通过命令发送锁定交易0x03:转账完成,交易所未进行锁定交易(locked_transfer)检测,接收到被设置锁定区块高度才能解锁的币(可以理解为锁定了指定时间)。0x04:恶意用户立即提币走人,留下交易所一脸懵逼。
 
造成影响
首先该攻击不会导致交易所任何资金损失,但是会锁定了交易所 XMR 流动性。
极端情况举例:如果交易所收到的都是需要锁定一年甚至更多年的门罗币则会导致一年内用户来提币的时候无币可以提(只能去购买额外的币来给用户提取)。
 
关于 locked_transfer 命令
monero-wallet-cli 关于 locked_transfer 命令解释如下:
locked_transfer [index=[,,…]] [
] [] ( |  )  [
]
转账命令:
locked_transfer FromAddress ToAddress 0.0101 20000
FromAddress:发送地址(一般为攻击者钱包地址)
ToAddress:接收地址(一般为交易所钱包地址)
0.0101:为转账金额
20000:为锁定区块数
 
如何防护
一般交易所会通过 get_transfers RPC 接口来解析 XMR 交易检测充值是否到账,在进行解析的时候只需要对 unlock_time 字段进行判断是否大于 0 则可以进行有效检测。
注:unlock_time 为 int 类型,如果大于 0 则意味着该交易有锁定区块,为恶意交易可以不予确认到账。为了避免充值不予到账损害“用户”利益可以进行另外一种处理:判断锁定区块是否到达,如果未到达则不予入账。
 
所有受影响 RPC 接口
(1)get_transfer(2)get_bulk_payments(3)show_transfer(4)get_payments
同理:在其他地方使用了如上四个接口的地方也需要对 unlock_time 字段进行判断是否大于 0 ,大于 0 则不予充值到账。
该问题之前在 HackerOne 也有被白帽子提过漏洞赏金,其中门罗官方回复:

文章链接:
https://hackerone.com/reports/417515
附:以下内容为官方文档摘录
get_transfers
Returns a list oftransfers.Alias: None.Inputs:
 in - boolean;     (Optional) Include incoming transfers.
 out - boolean;     (Optional) Include outgoing transfers.
 pending - boolean;     (Optional) Include pending transfers.
 failed - boolean;     (Optional) Include failed transfers.
 pool - boolean;     (Optional) Include transfers from the daemon's transaction pool.
 filter_by_height - boolean;     (Optional) Filter transfers by block height.
 min_height - unsigned     int; (Optional) Minimum block height to scan for transfers, if filtering     by height is enabled.
 max_height - unsigned     int; (Opional) Maximum block height to scan for transfers, if filtering by     height is enabled (defaults to max block height).
 account_index - unsigned     int; (Optional) Index of the account to query for transfers. (defaults to     0)
 subaddr_indices - array of     unsigned int; (Optional) List of subaddress indices to query for     transfers. (Defaults to empty - all indices)
Outputs:
 in array of     transfers:
     address - string;      Public address of the transfer.
     amount - unsigned      int; Amount transferred.
     confirmations -      unsigned int; Number of block mined since the block containing this      transaction (or block height at which the transaction should be added to      a block if not yet confirmed).
     double_spend_seen -      boolean; True if the key image(s) for the transfer have been seen before.
     fee -      unsigned int; Transaction fee for this transfer.
     height -      unsigned int; Height of the first block that confirmed this transfer (0      if not mined yet).
     note - string;      Note about this transfer.
     payment_id - string;      Payment ID for this transfer.
     subaddr_index - JSON      object containing the major & minor subaddress index:
         major -       unsigned int; Account index for the subaddress.

[1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载