攻击者可以阻止节点看到特定未确认交易。

此问题被认为是 **中等** 严重性。

细节

在 PR 19988 中修复此问题之前,使用“g_already_asked_for”机制来安排 GETDATA 交易请求。 SendMessages() 函数将发送 GETDATA 用于最近由对等节点宣布的交易,并在 g_already_asked_for 中记录该请求的发送时间。但是,此 g_already_asked_for 是一个“有限映射”数据结构,具有有限大小,如果达到 50000 个条目,它将忘记最旧的条目。这使得以下攻击成为可能

  • 攻击者是第一个向受害者宣布合法交易 T 的人。
  • 受害者使用 GETDATA 从攻击者请求 T。
  • 攻击者在受害者将从其他对等节点请求 T 的时间(大约 60 秒)之前不会响应 GETDATA
  • 然后,攻击者会仔细地向受害者发送虚假公告,导致受害者的 g_already_asked_for 将 T 驱逐出去。
  • 攻击者再次向受害者宣布 T(由于 m_tx_process_time 中的排队方式,这不需要特别精确地计时)。
  • 受害者在 g_already_asked_for 中找不到 T,会将其视为新公告,并向攻击者发送新的 GETDATA
  • 攻击者再次不响应 GETDATA
  • 等等。

这样,攻击者可以阻止受害者从除攻击者之外的任何人那里请求交易。

归属

由 John Newbery 负责任地披露,声称由 Amiti Uttarwar 和他发现。

时间轴

  • 2020 年 4 月 3 日,John Newbery 在一封电子邮件中向 Suhas Daftuar 和其他人报告了该错误。
  • 2020 年 5 月 8 日,John Newbery 建议了一种修复错误的方法。
  • 2020 年 9 月 21 日,Pieter Wuille 作为一种全面解决此错误和其他错误的方法,打开了 PR #19988
  • 2020 年 10 月 14 日,Pieter 的 PR 被合并。
  • 2021 年 1 月 14 日,Bitcoin Core 版本 0.21.0 发布,其中包含修复程序。
  • 2022 年 4 月 25 日,最后一个易受攻击的 Bitcoin Core 版本 (0.20.x) 达到使用寿命结束。
  • 2024 年 7 月 3 日,公开披露。