攻撃者によりノードが特定の未承認トランザクションを参照できないようになる可能性がありました。

この問題の重大度はです。

詳細

この問題がPR 19988で修正される前は、トランザクションのGETDATA要求をスケジュールするのに「g_already_asked_for」メカニズムが使用されていました。 SendMessages()関数は、ピアによって最近アナウンスされたトランザクションについてGETDATAを送信し、 その要求がg_already_asked_forでいつ送信されたかを記憶していました。 しかし、このg_already_asked_forは、「limitedmap」データ構造でサイズが制限されているため、 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-04-03 John Newberyが、Suhas Daftuarらにメールでバグを報告
  • 2020-05-08 John Newberyが、バグを修正するアプローチを提案
  • 2020-09-21 Pieter Wuilleが、このバグやその他のバグを修正するための包括的なアプローチとしてPR #19988を公開
  • 2020-10-14 PieterのPRがマージされる
  • 2021-01-14 Bitcoin Core バージョン 0.21.0が修正と共にリリースされる
  • 2022-04-25 脆弱性のある最後のバージョンのBitcoin Core (0.20.x) がEOLになる
  • 2024-07-03 公開