攻撃者によりノードが特定の未承認トランザクションを参照できないようになる可能性がありました。
この問題の重大度は中です。
詳細
この問題が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 公開