最近のFilecoin Network v16 Skyアップデートでは、SnarkPack証明集約ライブラリの新バージョンがリリースされました。このバージョンでは、新しい機能は導入されていませんが、代わりに暗号プロトコルそのものが強化されています。この投稿では、SnarkPackライブラリの検証を行った理由、発見された問題、そしてそれらがどのように解決され、Filecoin Networkに出荷されたかを詳しく説明します。
SnarkPackとは?
Filecoinプロトコルの中心には、Proofs-of-Replication(PoReps)と呼ばれる暗号化証明のコレクションがあります。これらのPoRepsは、Filecoinネットワークの中心である分散型、検証可能なストレージを可能にしています。
SnarkPackは、複数の証明を効率的に集約して同時に検証するための暗号化プロトコルです。Filecoinプロトコルは、Proofs-of-Replicationに関するSnarkParkライブラリを使用し、迅速なストレージの可能にしています。SnarkPackライブラリの詳細については、Financial Crypto ’22でのプレゼンテーションをご覧になるか、論文または関連するブログをご覧ください。
SnarkParkが利用している多くの暗号化技術の中に、Fiat-Shamir変換があります。Fiat-Shamir変換は、簡単に言うと、証明の検証者が問題の文の証明者と通信する必要をなくす暗号技術です。これらの変換はSnarkPackで生成される集約証明の基礎となるため、Fiat-Shamir変換に問題があると、SnarkPack自体の正確さも危うくなります。
Frozen Heartの脆弱性
2022年4月13日、Trail of Bitsは、さまざまな証明システムの健全性を破壊する脆弱性を公開しました。Trail of Bitsチームによって「Frozen Heart」脆弱性と呼ばれるこれらの問題は、安全でないFiat-Shamir変換実装が中心となっており、悪意のあるエージェントによって不正な記述を「証明」するために悪用される可能性があります。Frozen Heartの脆弱性は、すでに製品化されているプロトコルへの攻撃に利用できるため、まずは影響を受けるさまざまなプロジェクトに公開され、安全に修正されるようにしました。
この発表は、Filecoinの暗号化チームがSnarkPackの実装に同じ脆弱性がないか監査をするきっかけとなりました。この監査により、Frozen Heart脆弱性と同様の性質を持つ問題が明らかになりました。この脆弱性も、Fiat-Shamir変換のリスクのある実装に基づくものです。しかし、前述とは異なり、Filecoinに取り組む暗号化チームは、これらの問題はFilecoinプロトコルに対する直接的な攻撃が行われる可能性はないことを発見しました。しかしながら、チームは、セキュリティを安全に保ち、健全性を最大限に確保するために、Filecoinチームはこれらの問題を修正することを決意しました。
SnarkPack v1における問題点
SnarkPack v1実装の問題を理解するためには、Fiat-Shamir変換がどのように機能するかをもう少し深く掘り下げる必要があります。先に述べたように、この変換は、証明の検証者が証明者と通信する必要がある対話型の証明システムを、非対話型の証明システムに変換するものです。つまりランダムな値を証明者に伝達するステップを「対話型」から「非対話型」にします。Fiat-Shamir変換では、この対話的なステップを、「ランダムオラクル」と呼ばれるものに置き換えます。実際には、ランダムオラクルは安全なハッシュ関数に置き換えられるので、証明者は公開情報と部分出力を単純にハッシュ化し、その結果を必要な乱数値として使用することができます。特に、検証者が対話型バージョンでアクセスできたであろうすべての値をハッシュに入れることが重要です。
概念的には単純でも、Fiat-Shamir変換の実装には細心の注意が必要です。なぜなら、ハッシュ化処理に含まれない公開情報は、攻撃の対象となる領域を広げてしまうからです。悪意のあるエージェントは、ハッシュ化されていない公開情報を変更し、偽の証明を作成することができます。
SnarkPackでは、N個の証明を集約する際に、log2(N)個のFiat-Shamir変換の際にハッシュを実行する必要があります。各ハッシュの計算には、証明の過程で既に生成したすべての要素を入力としなければなりません。これは次のような擬似コードで模擬することができます。
rand = H(…)
……
for i in 0…log2(n):
A <- generate_proof_step(i)
rand <- H(rand, A)
B <- generate_post_randomness_step(rand)
この処理が完了すると(つまり、log2(N)ステップでループが終了すると)、最後に計算する必要のあるハッシュが1つ、つまり、最後に計算する必要のあるランダム性が1つあります。このランダム性は、SnarkPackプロトコルの残りの部分で使用されます。擬似コードでは次のようになります。
KZG_proof(final_randomness, …)
final_randomness = H(B)
問題点
CryptoNetによる監査で、SnarkPack v1のこのプロセスの実装には主に2つの問題があることが判明しました。
- ループ内の最初のハッシュ生成をスキップしている。i=0のとき、ハッシュ関数の呼び出しをスキップし、代わりに1行目以前に生成したランダム性を再利用していることがわかりました。その結果、最初のランダム性を変更することなく、最初の証明要素Aを証明者が変更することができます。
- 一番最後のランダム性生成をスキップしてしまうことがありました。これは、KZG_proofが、証明の前の段階と正しく「リンク」されないことを意味します。
ループ内の他の乱数値は正しく計算されているため、これらの問題は比較的軽微なものです。したがって、攻撃者は、意味のある証明を偽造するために、他の計算された値に一致する入力を見つける必要があります。しかし、セキュリティの安全を保証することと、最近Fiat-Shamir実装のエクスプロイト(ソフトウェアの脆弱性またはセキュリティ上の欠陥を利用するコード)に注目が集まっていることから、次のFilecoinネットワークアップグレードで必要な修正を行うことにしました。
ネットワークへのSnarkPack v2の導入
上記の2つの問題に対する修正は、Filecoin CryptoチームによってBellpersonリポジトリで行われ、修正を実装したプルリクエストはこちらで見ることができます。修正されたコードをご覧になりたい方のために、問題A(prover、verifier)の関連するサブセクションへのリンクを共有します。問題B(prover、verifier)はこちらからご覧ください。
後方互換性を維持しつつ適切に修正を適用するために、API を更新し、 AggregateVersionを追加しました。このバージョンは、より安全な新しいコードパス(SnarkPack v2)とレガシーコードパス(SnarkPack v1)のどちらを使用しているかを示すフラグとして使用されます。Skyrネットワークのアップグレード前に導入された集約証明はv1、アップグレードエポック後に導入されたものはv2と予想されます。証明の実装にこのバージョン管理を実装したプルリクエストはこちらにあり、バージョン11.1.0でリリースされました。
Lotusチームは、コア開発会議において、これらの問題を他のFilecoin Core Devsと共有しました。Core Devsは、この修正をできるだけ早くFilecoinネットワークに導入すべきだという意見で合意し、そのためFilecoinネットワークへのSnarkPack v2の導入はSkyrのアップグレードに組み込まれました。SnarkPack v2をサポートするビルトインアクターの実装は、こちらでご覧いただけます。そしてクライアント実装で使用されます。参考となるクライアント実装は、こちらからご覧いただけます。
Filecoinネットワークにおけるセキュリティ
SnarkPackは、PLEngResチーム内の暗号解読者や他の専門家によって監査されています。しかし、プロトコルが複雑なため、まだバグが存在する可能性があります。Trail of Bitsブログ記事シリーズが公開されれば即座にSnarkPackの実装を再検討し、Filecoinネットワークに力を与える証明が同じ種類の問題に対して脆弱性のリスクがないことを確認することにしました。私たちはFilecoinのネットワークにおいて最高水準のセキュリティを維持したいと考えており、それには最新のセキュリティ開発と暗号の脆弱性を把握することも含まれます。Filecoin はまた、すべてのセキュリティおよび暗号研究者が、Filecoin ネットワークのセキュリティを維持し、管理するために参加するよう求めています。
バグバウンティプログラムの詳細については、こちらをご覧ください。
本ブログは、www.filecoin.io/blogからの翻訳となります。
ソース:https://filecoin.io/blog/posts/snarkpack-v2-a-new-version-of-filecoin-s-proof-aggregator/
コメント