Develop with pleasure!

福岡でCloudとかBlockchainとか。

lndが公開した2つの脆弱性CVE-2020-26895とCVE-2020-26896

先日lndに脆弱性が含まれているということで修正版のアナウンスがされていたけど、その内容が公開された↓

CVE-2020-26895

影響あるバージョン

影響を受けるのはv0.10.0-betaより前のバージョンのlnd。

脆弱性の内容

オフチェーン支払いにより状態を更新する際に、lndノードに対してhigh-ECDSA署名の受け入れが可能であるという内容。Bitcoin Coreのポリシーには、ECDSA署名値(r, s)の内、sの値が曲線の位数の半分以下の値でないといけないというルール(LOW_Sルール)があり、ECDSA署名固有のmalleabilityを解消するためのもの。high-ECDSA署名自体は有効なECDSA署名でコンセンサスルールでは受け入れられるが、Bitcoin Coreのリレーポリシーではhigh-ECDSAを受け入れていないのでトランザクションをリレーする際にはリジェクトされる。

これを悪用すると、例えばタイムロックが設定されているコントラクトを含んでいると、実際にそのトランザクションをブロードキャストしようても、接続先のノードからポリシー違反でリジェクトされ、資金の損失に繋がる可能性がある。

lndの以前のバージョンでは、LOW_Sへの変換がされていなかったため、生成された署名値sがhigh-sになっていてもそのまま受け入れていたという問題。

攻撃内容

チャネルの一方的クローズ中に、攻撃者が↑を悪用して、被害者のHTLC-successトランザクションがリレーされず、攻撃者によるHTLC-timeoutトランザクションがブロードキャストされると、HTLCにロックされている資金が攻撃者によって回収されるという攻撃が考えられる。

尚、強調クローズの場合作成されるトランザクションの署名はポリシー検証もされてるので、この問題は発生しない。

修正

ECDSA署名のLOW_Sルールがv0.10.0-betaで適用されている。ただLNの仕様を定義しているlightning-rfcで、ノードがオフチェーンで受け入れる署名の検証方法の指定が欠けているので、仕様の更新も計画されてる模様。

CVE-2020-26896

影響あるバージョン

影響を受けるのはv0.11.0-betaより前のバージョンのlnd。

脆弱性の内容

衝突するペイメントハッシュを使って転送されたHTLCインボイスのプリイメージが強制的に明かされるという脆弱性で、攻撃者に悪用されると、特定の状況下において、HTLC支払いが行われたと信じて資金を失う可能性がある。

HTLCの受信をオフチェーンではなくオンチェーンで解決する場合、転送ノードでは、HTLCを請求するためにwitnessを介して有効なプリイメージを提供することが期待される。

このプリイメージを知る方法は主に以下の2つ↓

  • 自分がインボイスを発行してプリイメージを生成する側である。
  • HTLCにより正常に支払いが転送された結果としてプリイメージを受信する。

lndではこれらを、インボイスデータベースとプリイメージデータベースの異なる2つのDBで管理している。

ノードがオフチェーンでHTLCを受信すると、ノードは自身が中間ホップか最終ホップかを判断する必要があり、

  • 最終ホップであればインボイスデータベースに対してプリイメージを照会
  • 中間ホップであればプリイメージデータベースに対してプリイメージを照会

する。

問題となったlndの挙動は、プリイメージデータベースにプリイメージが含まれていない場合、誤ってインボイスデータベースに対してもプリイメージを照会しにいくようになっていたというもの。この結果、ノードが支払い経路の最終ホップでない場合も、インボイスのプリイメージ明かす状況というのが発生する。

攻撃内容

↑の挙動を悪用すると以下のようにして、HTLCの資金を盗む攻撃が可能になる。

A -> M -> Bのような経路(Bがコインの受信者でMが攻撃者)のマルチホップ支払いのケースにおいて。

  1. BがAにインボイスを発行する。
  2. AがMを経由してBに支払う経路を選択しHTLCをオファーする。
  3. MはAのHTLC内のペイメントハッシュと同じ値のペイメントハッシュを持つM -> B -> M'の別のHTLCをBにオファーする。
  4. 3のHTLCを含むコミットメントトランザクションをオンチェーンにブロードキャストして、一方的にチャネルをクローズする。
  5. Bが4のブロードキャストを検知するとHTLC-successをブロードキャストを試みる。この時点で↑のバグのため、本来プリイメージデータベースからこのプリイメージを取得する必要があり、実際このプリイメージはそのDBには存在しないのだけど、フォールバックされインボイスデータベースへの照会が発生し、実際にオンチェーン上にプリイメージが公開され、A -> M -> Bのインボイスは既に決済済みとマークされる。
  6. Mは2と3の2つのHTLCを解決して資金を入手し、結果的にBがインボイスで請求していたコインは盗まれる。

尚、MPPを使ってる場合、他の並行MPPのHTLCがBに届いている場合は、安全チェックにより攻撃は失敗する。

修正

修正内容は、↑のインボイスデータベースとプリイメージデータベースの適切な分離で、v0.11.0-betaにおいて修正されている。