攻击者可以阻止节点看到特定未确认交易。
此问题被认为是 **中等** 严重性。
细节
在 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 日,公开披露。