2017年11月6日にリリースされたBitcoin Core バージョン 0.15.1で修正されたCVE-2017-18350の詳細の開示

技術的な内容

CVE-2017-18350はバッファーオーバーフローの脆弱性で、悪意あるSOCKSプロキシサーバーがsigned char型を持つシステム(一般的な32bitおよび64bitのx86 PCを含む)上のプログラムスタックを上書きすることを可能にします。

この脆弱性は60a87bce873 (SOCKS5 support)で導入され、2012年8月27日にBitcoin Core v0.7.0rc1で最初にリリースされました。修正は2017年11月6日にリリースされたv0.15.1のd90a00eabed (“Improve and document SOCKS code”)に隠されていました。

脆弱になるには、そもそもそのような悪意あるプロキシを利用するようノードを構成する必要があります。(インターネットなど)安全でないネットワークでプロキシを使用すると、そのような目的で接続が傍受される可能性があるため、潜在的に脆弱であることに注意してください。

ノードからの接続要求に応じて、悪意あるプロキシは要求されたものとは異なるターゲットドメイン名の肯定応答(ACK)で応答します。通常この肯定応答(ACK)は完全に無視されますが、長さが高bitを使用している(つまり長さ128-255を含む)場合、脆弱なバージョンでは負の数として解釈されます。ドメイン名を読み取るためにrecv()システムコールに負の数が渡されると、unsigned/正の数に変換されますが、はるかに広いサイズになり(通常は32 bit)、結果256 byteのダミースタックバッファを超えて事実上無限の読み取りが行われます。

この脆弱性を修正するため、ダミーバッファは明示的に符号なし(unsigned)のデータ型に変更され、負の数値との変換を回避しました。

帰属

脆弱性を発見し最初の修正を提供したpracticalswiftと、修正版の偽装バージョンとリスクコードの一般的なクリーンナップを行ったWladimir J. van der Laanの功績です。

タイムライン

  • 2012-04-01: PR #1141で脆弱性が導入される
  • 2012-05-08: 脆弱性がgitリポジトリのmasterにマージされる
  • 2012-08-27: v0.7.0rc1で脆弱性が公開される
  • 2012-09-17: 脆弱性がv0.7.0でリリースされる
  • 2017-09-21: practicalswiftがセキュリティチームに脆弱性を開示する
  • 2017-09-23: Wladimir PR #11397をオープンし内密に脆弱性を修正する
  • 2017-09-27: 修正がgitリポジトリのmasterにマージされる
  • 2017-10-18: 修正がgitリポジトリの0.15にマージされる
  • 2017-11-04: v0.15.1rc1で修正が公開される
  • 2017-11-09: 修正がv0.15.1でリリースされる
  • 2019-06-22: Vulnerability existence disclosed to bitcoin-dev ML.
  • 2019-11-08: 脆弱性の詳細がbitcoin-dev MLに公開される