Eclairは、Lightningチャネルのファンディングやスプライシングで、相手方が手数料を引き上げたり、Bitcoinのバックエンドが不適切な取引を作成したりした場合に、ノードが過大なマイナー手数料を負担するのを防ぐ修正を2件統合しました。変更は10月2日と5日にプロジェクトのメインブランチへ取り込まれています。ただし、10月12日時点でリリースページに掲載されている最新バージョンは9月公開のv0.14.3で、修正が正式リリースに含まれたかは確認できません。
EclairはACINQが開発するLightningノードソフトウェアです。今回の修正は、双方向ファンディングによるチャネル開設と、チャネル資金を調整するスプライシングの手数料管理、そしてEclair-signerモードでの取引検証に関するものです。想定される損失は攻撃者への直接送金ではなく、ネットワーク上のマイナーに支払われる手数料として発生します。
PR #3388、相手方による手数料引き上げに上限
1件目の修正はPR #3388で、相手方が手数料を引き上げた代替取引を提示するRBF(Replace-by-Fee)に対応します。双方向ファンディングでチャネルを開設するときや、スプライシングでチャネル資金を調整するとき、相手方はより高い手数料率の代替取引を提案できます。修正前は、Eclairノードも取引に資金を拠出している場合、自らの拠出分に対して高い手数料を払い続ける可能性がありました。手数料に明確な上限や予算は設けられていませんでした。
この仕組みでは、悪意のある相手方が、自ら手数料を負担せずに、資金を出すEclairノードへ任意に高い手数料率を求めることが可能でした。ノードの損失は相手方への直接送金ではなく、マイナー手数料として発生します。
修正後は、Eclairが相手方に提示したファンディング手数料率の上限を超える要求を拒否します。ただし、相手方が流動性を購入し、Eclair側に代わって支払いを入力する場合や、Eclairノードが取引に資金を拠出しない場合は、この制限の対象外です。いずれも、今回の修正が防ごうとする費用をEclairノードが負担しないケースです。
PR #3390、署名器モードで実手数料を検証
2件目はPR #3390で、Eclair-signerモードに関する修正です。このモードではBitcoin Coreのバックエンドであるbitcoindがビットコインを選び、取引を構築します。秘密鍵はEclair側で管理し、署名に使います。しかし、署名鍵を手元に保管するだけでは、侵害されたバックエンドによる不正を防げません。バックエンドが手数料は予算内だと報告していても、実際にはお釣りの出力を削除するなどして、より高い手数料を支払う取引を作成する可能性があります。
ビットコイン取引では、入力額のうち出力に割り当てられなかった分がマイナー手数料になります。そのため、お釣りが削除されるとノードが資金を失うおそれがありますが、その資金が攻撃者の管理するアドレスへ送られるとは限りません。
修正では、手数料予算の設定時に、支出対象のコインの金額から実際の手数料を計算します。また、取引IDを使って関連取引を取得し、入力額を検証します。そのうえで、バックエンドが報告した手数料と実際の手数料が一致するかを確認し、バックエンドの申告値だけに頼らず、実際の手数料に予算を適用します。Eclairが再構築した拠出部分についても、検証済みの手数料と同額を支払うことを確認し、お釣りの出力位置が無効な取引は拒否します。
10月の修正、最新リリースには未掲載
2件の修正は、双方向ファンディングとスプライシングでの手数料上限、および署名器モードでの取引手数料の検証をそれぞれ対象としています。協調クローズ時の手数料に関する従来の脆弱性や、10月2日に明らかになったノード再起動後のサービス妨害の可能性とは別の問題です。
10月12日時点で、Eclairのリリースページでは9月公開のv0.14.3が最新バージョンとして掲載されています。メインブランチへの取り込みだけでは、修正が配布済みのリリースに含まれるとは限りません。Eclairを運用するノード管理者は、使用中のビルドに10月の変更が含まれているか確認する必要があります。