【CTO Tech Blog】LND 0.17.5以下に影響する不要なフェイルバックの脆弱性
- CTO Tech blog

先日、Matt MorehouseによってLND 0.17.5以下に影響する脆弱性の内容が開示された↓
※ なお、この脆弱性を悪用する場合、別途ターゲットとなるノードを適切なタイミングで再起動させる必要がある。そのようなことが可能な別の攻撃ベクトルがないと成立しない。
不要なフェイルバック
まず前提として、LNで支払いをルーティングする際、以下のようなプロセスが実行される:
update_add_htlc
メッセージで、上流(支払人)から下流(受取人)に向けてHTLCのオファーがトリガーされ、経路上の各ノードは、commitment_signed
/revoke_and_ack
をやりとりしてコミットメントトランザクションを更新する。オファーが受取人まで届くと、update_fulfill_htlc
メッセージで受取人から上流へプリイメージを使ってHTLCの解決が行われる。その際もオファーの時と同様commitment_signed
/revoke_and_ack
をやりとりしてコミットメントトランザクションを更新する。
今回問題となったのは、
- 下流ノードがプリイメージを使ったHTLCの請求を⑦で開始し、
- 上流ノードが⑧、⑨を送り
- 下流ノードは⑩のrevokeを拒否して、⑨で受け取った更新後のコミットメントトランザクションをブロードキャストし、それが承認される。
という挙動をした場合のLNDの動作。
上流ノードからすると下流ノードの有効なトランザクションが2つ存在する場合(②と⑨)。
元々、LNDはオンチェーンのコミットメントトランザクションと、相手側の他の有効なコミットメントを比較して、オンチェーン側に欠落しているHTLCがあればそれを上流にフェイルバックするようになっている。ただ、上記の場合は、⑥でプリイメージが分かっているので、上流ノードはさらにその上流ノードに対してプリイメージを使ってHTLCを解決すればいい。
しかしLNDの実装に問題があり、LNDで再起動が発生すると、上流のHTLCがまだ解決されていない場合、今度はHTLCのフェイルバックが上流に送信されるようになっていた模様。
つまり、下流はオンチェーンでHTLCが下流側の残高にチャージされ、上流のHTLCはフェイルバックによってHTLCがキャンセルされるという現象が発生する。つまりHTLCの金額が盗難される。
このような本来不要なフェイルバックが行われるというのが今回開示された脆弱性の内容。ただ、攻撃者のノードが被害者をサンドイッチしている状況かつ、被害者のノードを再起動させる必要がある。特に後者ができるような攻撃手法が必要になるので、攻撃自体は難しいだろう。
修正
LND v0.18.0で、プリイメージが既知のHTLCのフェイルバックを防止する修正がされてる↓
BOLTの問題?
CLNやEclair、LDKでは、過去にそれぞれ独自に問題を発見して、修正が行われた模様。そういう過去の事例がありながら、BOLTにこのようなケースをカバーするための仕様の定義がされていないのが問題では?という問題提起が最後にされてる。
ブログ本文へのリンク
Chaintopeでブロックチェーンの未来を共に創りませんか?
Chaintopeは、独自のブロックチェーン「Tapyrus」と、開発プラットフォーム「Tapyrus Platform」を活用し、デジタル社会の信頼基盤を構築しています。
私たちは、ブロックチェーン技術の可能性を最大限に引き出し、社会に新しい価値を提供することを目指しています。
募集職種:
ブロックチェーンエンジニア
アプリケーションエンジニア
インフラ・保守エンジニア
プロジェクトマネージャー
フィールドセールス
Chaintopeで働く魅力:
最先端のブロックチェーン技術に触れる機会
リモートワークやフレックスタイム制による柔軟な働き方
専門性の高いチームとの協働
ブロックチェーン技術に情熱を持つあなたのスキルを、私たちのチームで活かしませんか?
詳細は、採用情報をご覧ください。
https://www.chaintope.com/recruit/