【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/index
、indexes/txindex
、indexes/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処理する。