Pinning攻撃とその対策

はじめに

LNにはPinning攻撃と呼ばれる攻撃手法があり、現在この攻撃を防ぐことはできないとされている。ただし、この攻撃の実行可能性はそれほど高くないとされており、またこの対策・緩和策にはビットコインのベースレイヤーの変更が必要なため、それほど急務といった感じではない。しかし、本攻撃の仕組みや対策を知っておくことに越したことはないので、以下にその概要をまとめた。

LNのトランザクション構成

LNで使用されるトランザクションには以下の5種類がある。このうち今回重要になるのが、CommitmentトランザクションとHTLCトランザクションである。

  • Fundingトランザクション
  • Commitmentトランザクション
  • HTLC-successトランザクション
  • HTLC-timeoutトランザクション
  • Closingトランザクション

LNは1つのUTXOを2者間で共有し、両者の合意に基づき互いの残高を更新していく。更新ごとに作成するトランザクションをCommitmentトランザクションと呼ぶ。これは2者間の残高状態と送金の中継に使うHTLCを管理するもので、どちらか一方の通信が途絶えた場合でも、一方的に資金をオンチェーンで回収できるような構成になっている。このCommitmentトランザクションはFundingトランザクションをインプットに持つ。(Fundingトランザクションは2者間マルチシグアドレスをアウトプットに持つ)

HTLCトランザクションは、Commitmentトランザクションをインプットに持つトランザクションである。これは、送金の中継に使われるHTLCがタイムアウトした場合、オンチェーンでその資金を回収するために必要となるトランザクションである。HTLCの送信者はHTLC-timeoutトランザクションを、受信者はHTLC-successトランザクションを保有する。

Commitmentトランザクションのアウトプットは、以下の6種類がある。

  • To_local
  • To_remote
  • To_local_anchor
  • To_remote_anchor
  • Offered_htlc
  • Received_htlc

Offered_htlcとReceived_htlcは以下の方法で資金回収ができる。

Offered_htlcの使用条件は、HTLC-timeoutトランザクションか、プリイメジが必要である。Offered_htlcは送信者が保有する。Received_htlcの使用条件は、remotehtlcsigか、HTLC-successトランザクションが必要である。Received_htlcは受信者が保有する。AからBを経由する時に作成されるHTLCでは、AのCommitmentトランザクションにはOffered_htlcが、BのCommitmentトランザクションにはReceived_htlcが作成される。HTLCがある状態でCommitmentトランザクションが伝播した場合は以下の通りとなる。

AがCommitmentトランザクションを伝播した場合、

  • Aは一定時間経過後に事前に署名したHTLC-timeoutトランザクションを使い資金を回収できる
  • Bはいつでもプリイメジを使って資金を回収できる

BがCommitmentトランザクションを伝播した場合、

  • Aは一定時間経過後に自身の署名を使って資金を回収できる
  • Bはいつでも事前に署名したHTLC-successトランザクションを使い資金を回収できる

上記の仕組みがうまくいくのは各トランザクションが大幅な遅延なしでブロックに取り込まれる場合である。どちらか一方が音信不通となりかつ手数料が高騰した場合、Commitmentトランザクションを伝播しても手数料が低いためにブロックに取り込まれない可能性がでてくる。それを解決するために考案されたのがアンカーアウトプットだ。

アンカーアウトプット

ビットコインには手数料が低くブロック承認されない場合を考慮して、手数料を引き上げる仕組みがある。それがRBF(Replace by Fee)とCPFP(Child Pay For Parent)と呼ばれる方法である。RBFは手数料の高いトランザクションで置き換える手法で、CPFPは手数料の低い親Txに手数料の高い子Txを作る手法である。

アンカーアウトプットは上記のCommitmentトランザクションのブロック承認の遅延問題を解決するために提案された。CommitmentトランザクションのアウトプットにTo_local_anchorとTo_remote_anchorを追加することで、お互いがCPFPによる手数料の引き上げが可能となった。もし相手が音信不通になったとしても、ブロック承認されないCommitmentトランザクションのTo_local_anchorを使ってCPFPすることで手数料を引き上げることができる。しかし、これはMempoolが混雑している場合には有効だが、意図的にCommitmentトランザクションをブロック承認させないような攻撃を防ぐことはできない。その攻撃が次に説明するPinning攻撃と呼ばれるものである。

Pinning攻撃

アンカーアウトプットはCommitmentトランザクションのブロック承認の遅延問題を解決するために提案されたが、その他の攻撃を防ぐことはできない。その攻撃手法をPinning攻撃と呼ぶ。この攻撃にはHTLCレベルでの攻撃とCommitmentトランザクションレベルでの攻撃の2種類がある。また、Pinning攻撃には前提条件があり、ネットワークパーティション問題と呼ばれる分散ネットワークにおけるノード間のデータ不整合を引き起こす必要がある。

少し脱線となるが、分散ネットワークにおけるデータ不整合と聞くとビザンチン将軍問題や二重支払い問題を想起する方もいると思う。また、その二重支払い問題を解決するためにビットコインが採用したのがPoWによるブロックチェーンだ。これは一時的なデータ不整合は許容するが、徐々にデータの整合性が取れていくもの。ネットワークが分断されて一時的に複数のチェーンができたとしても、ネットワークが回復した際、PoWの仕事量が最大なチェーンを正としてチェーンを再構成することで、分散ネットワークでもデータの整合性を取ることができる。これはブロックに含まれるデータに限ってのことであることに注意が必要。

閑話休題、Pinning攻撃の前提条件では、Mempoolの分断が必要である。ビットコインのMempoolはノードごとに異なっており、これは受信するトランザクションの順番によってそのデータの受信を許可するか拒否するか変わるからである。攻撃者はあるマイナーのMempoolにはTxAを含ませ、それ以外のノードのMempoolにはTxBを含ませる必要がある。以下では、このMempool分断を前提に、Bが犠牲者として、A→B→Cの流れで送金される場合を例に説明する。またA→Bのタイムアウトは80ブロック、B→Cのタイムアウトは40ブロックとする。どちらの攻撃も、B→Cのタイムアウト後でもBは資金を回収できず、A→Bのタイムアウト後にAが資金を回収する。(Aの資金回収はブロックチェーン上のL1でもLN上のL2どちらでも可能)

1.HTLCレベルでの攻撃

BからHTLCを受け取ったCは応答しないことで、BはOffered_htlc付きのCommitmentトランザクションを伝播する。そして、Cはブロック承認されないほどの低い手数料で、プリイメジを使った資金回収TxをマイナーのMempoolへ伝播する。40ブロック経過後、BはHTLC-timeoutトランザクションを伝播するが、これは自身のMempoolにのみ滞在し、マイナーのMempoolへ伝播しようとしても、すでにCが資金回収Txを伝播しているので、拒否される。80ブロック経過後、Aは自身のOffered_htlc付きのCommitmentトランザクションおよびHTLC-timeoutトランザクションを伝播して資金を回収する(または、BがHTLCをタイムアウト前にキャンセルすることでLN上で資金を回収することもできる)。以上よりBは資金を回収することができずに資金を失うことになる。

この攻撃を回避するには、HTLCトランザクションにもアンカーアウトプットを追加する。具体的には、Offered_htlcのプリイメジによる資金回収条件にプレ署名を必要とし、またそのアウトプットを以下の3つとする。

  • Cへの支払い
  • Bのアンカーアウトプット
  • Cのアンカーアウトプット

Bはこのアンカーアウトプットを使ってCPFPによる手数料引き上げを試してみて、もし成功すれば、プリイメジを知ることができる。Bは自身のMempoolにCが作った資金回収Txがなくてもプレ署名されているのでそのTxidを知ることができ、CPFPを試すことができる。そのため、BのMempoolが意図的にマイナーのMempoolと分断されていたとしても問題ないのである。

2.Commitmentトランザクションレベルでの攻撃

Commitmentトランザクションは残高の更新ごとに作られるのであった。これを利用して、Cはある時点のCommitmentトランザクションをマイナーのMempoolへ含ませる。そして最新または別時点のCommitmentトランザクションをBのMempoolへ含ませる。マイナーへ含ませるCommitmentトランザクションは低い手数料でブロック承認されないようにする。またBによってCommitmentトランザクションがRBFされないように、

  • アンカーアウトプットがない場合、犠牲者BのCommitmentトランザクションの手数料率よりも高くしておく
  • アンカーアウトプットがある場合、アンカーアウトプットへ大きな子トランザクションを作成する (BIP 125 rule 5によるDoS攻撃プロテクションを悪用)。

40ブロック経過後、Bはremotehtlcsigを使って資金回収しようとするが、これは自身のMempoolにのみ滞在し、マイナーのMempoolへ伝播しようとしても、Commitmentトランザクションが異なるので、拒否される。そして80ブロック経過後、Aが資金を回収する。

この攻撃を回避するには、Package Relayの導入が必要である。Package Relayを使うことで、BのCommitmentトランザクションとその子TxをマイナーのMempoolに含まれるCのTxよりも高い手数料で伝播することができる。このBIPの策定は現在進行中である。

1の攻撃は犠牲者BによるCommitmentトランザクションの伝播と、後続の資金回収Txをブロック承認させないよう遅延させる攻撃である。一方、2の攻撃は攻撃者CがCommitmentトランザクションを伝播しかつそれをブロック承認させないように遅延させる攻撃である。

最後に

これらのPinning攻撃はローカライズされたMempoolの特徴を突いた攻撃であり、今後もこのようなL2のセキュリティホールをL1で突く攻撃手法が見つかるかもしれない。L2開発者はL1であるビットコインの特性、MempoolやTxレリーポリシーなどを詳しく知る必要がある。

参考

Remaining : 0 characters / 0 images
5,000

Sign up / Continue after login

Related stories

Writer

ちょビットコイナー

Share

Popular stories

LNノードの運用益はどれぐらい?パート1

1548

LNノードの運用益はどれぐらい?パート3

948

【Muun】ちょっと変わったライトニング搭載ノンカストディアルウォレット

768