Contact

【CTO Tech blog】 Bitcoin Coreのデータの難読化

  • CTO Tech blog

ウィルス対策ソフトウェアの誤検知により、BitcoinのブロックやUTXOセットのデータが自動的に隔離/削除され、bitcoindがクラッシュしデータの破損につながる事例がいくつか報告された結果、DBのデータを難読化する機能が搭載された。

  • UTXOセットのデータ(chainstate)の難読化(PR 6650
  • mempoolのデータ(mempool.dat)の難読化(PR 28207
  • ブロックデータ(blocks)の難読化(PR 28052

これにより、誰かが意図的にトランザクションに特定のデータを入れることで、ウィルス対策ソフトウェアの誤検知を誘発するような攻撃ができなくなる。

難読化処理

各データの難読化は、各ノードでランダムに生成された64 bitの鍵を使って、データベース内のすべての値をXOR演算することで行われる。

難読化用の鍵の場所は、それぞれ

難読化対象 場所
chainstate chainstateのLevel DB内にキー0e00obfuscation_keyの値として格納
mempool mempool.datファイルのversionの後に鍵データが格納されている*1
blocks blocksディレクトリ直下のxor.datファイル

ちなみに、各インデックスデータ(blocks/indexindexes/txindexindexes/blockfilterbasic/db)の難読化用の鍵は、0000000000000000となってる(つまり難読化されない)。実際にこれらのデータはハッシュデータが中心なので、基本的に変なデータが入ることはない。

Bitcoin Coreを起動すると、debug.logに以下のように難読化用の鍵の情報が表示される(mempoolの鍵は表示されてない)。

2024-10-18T06:36:27Z Using obfuscation key for blocksdir *.dat files (/media/ext-storage/bitcoin/blocks): '6760bec67a0d20bb'
2024-10-18T06:36:32Z Using obfuscation key for /media/ext-storage/bitcoin/chainstate: bac4bcec644796db

デコード処理

XOR処理して難読化してるだけなので、同じ鍵で再度XOR処理すれば元のデータになる。鍵長は64 bitなので、デコード対象のデータ長になるまで鍵の値を繰り返した値でXOR処理する。

話題のキーワード