Greetings! New to Zcash?
The Zcash network is young, but evolving quickly! Sign up and we'll be in touch with monthly highlights on ecosystem growth, network development and how to get started with Zcash!

言語

Zcashプロトコルの脆弱性の修正

Taylor Hornby, Zooko Wilcox | Apr 26, 2016

前書き

Zooko作成

私は、人生の半分以上(20年、あるいはそれ以上?)にわたり暗号作成、情報保護 およびデジタル通貨に関わってきました。しかし、Zcash以上に画期的な暗号システムに 関わったことはありません。また、安全で実用的な暗号システムの構築に関する既存の タスクにおいて、これほどまでに優秀な`チーム`_ と作業をしたこともありません。

コンピュータセキュリティの重要な要素として、「反対」の プロセスをとることがあります。弱点を発見するためにシステムを攻撃し、 同時にシステムを強化するのです。このプロセスは、外部者を当惑させる可能性が ありますが、コンピュータセキュリティのエキスパートの目には、セキュリティの 問題が発見、修正、公開されるのであれば、システムがより強力なものになる という安心をもたらすものです。

これまで、チームメンバーは他企業(CryptocatGlobaLeaksSpiderOak、 および Ethereum)のためにこのような監査作業を実行してきました。

このブログ記事では、許可を必要としないオープンな金融システムと してのデプロイ準備中にZcashプロトコルで発見されたセキュリティの問題を 報告します。

一部のチームにより、2014年に査読付きの Zerocashオリジナル科学論文 を出版しました。最近では、プロトコルを拡大して改善し、詳細な新しい プロトコル仕様書 を作成してセキュリティの脆弱性を評価しています。

今日までに、3つのセキュリティ上の脆弱性を発見し修正しました。

1. Zooko Wilcoxにより、 Faerie Goldの脆弱性 が発見されました。これは、 Zcashユーザーに使用可能なノートをたくさん受け取ったと思い込ませるもの でした。しかし実際に使用しようとすると、そのうちの1つのみが使用可能なのです。

2. Taylor Hornbyにより、内部ハッシュ衝突脆弱性 が発見されました。 これは、128ビットのハッシュ衝突を検出できるほど強力なコンピュータを 持っていれば、特別に細工されたノートを二重支払いに使用することができるものです。

3. Daira Hopwoodは、悪用される可能性のない 誤りをセキュリティ証明書内に 見つけました。プロトコルで使用されている疑似ランダム関数の1つが衝突に 耐性のない関数である場合、特別な細工がされたプライベートアドレスに 送信されるノートが二重支払いされる可能性があります(実際に使用されている 関数は衝突に耐性のある関数なので、この問題が悪用される可能性はありません)。

以下では、この3つのうち最もインパクトのあるTaylorの記事を紹介します。 内部ハッシュ衝突脆弱性に関する記事です。

— Zooko Wilcox、2016-04-25

内部ハッシュ衝突脆弱性

執筆者: Taylor

Zcashが、内部ハッシュ衝突脆弱性を修正することなくローンチされていたら、 偽造通貨に利用されていたかもしれません。128ビットのハッシュ衝突を検出する のに十分な計算能力を備えたコンピュータを使えば、何もないところからZcashを 作成し、自分宛てに二重支払いさせることができます。

128ビットのハッシュ衝突を認識するには、今日実際に攻撃が可能な \(2^{64}\) 平行化可能 操作が要求されます。そのため、実際に脆弱性を攻撃に利用する ことができます。攻撃がどのように動作し、修正できるかを検証していきます。

間違い

弱点は、ノートのコミットメントスキームにありました。コミットメント スキームは、開示することなく情報に*コミットメント*を発行できる有用な 暗号ツールです。後に、コミットメントを 開いて 情報を開示し、最初に コミットした情報と同じ情報であることを証明することができます。

これが機能するには、コミットメントスキームが2つのプロパティを満たす必要があります。

1. 非公開: コミットメントを参照しても、情報に関して何もわからないこと。 情報についてほぼ確実に推測できたとしても、推測を確定することは不可能。

2. バインディング: ある数値にコミットすると、その後考えを変えたり 実は異なる数値にコミットしていたと言ったりすることはできません。 コミットメントは、一意の固有の数値に*オープン*でなければならず、それ以外 の数値にオープンであることはできません。

Zcashでは、数値の基本的なオブジェクトは「ノート」と呼び、プロトコルで 特殊な意味を持つ以下の数値で構成されています \((a_{pk}, v, \rho , r)\) 。 プロトコルの一部として、ノートへのコミットメントはブロックチェーンに 公開されます。以下に、オリジナルの設計におけるコミットメントの計算 方法を説明します。

\(InternalH = \text{SHA256Compress}(a_{pk} \text{ \| } \rho ) \text{ truncated to 128 bits }\)
\(k = \text{SHA256Compress}(r \text{ \| } InternalH)\)
\(cm = \text{SHA256Compress}(k \text{ \| } [0]^{192} \text{ \| } v)\)

ここでは、SHA256Compressは、SHA256ハッシュ機能により内部で使用される圧縮機能です。

このスキームには*バインディング*プロパティがないため、InternalH 衝突の 脆弱性が存在します。あるノートにコミットし、後で別のノートへの コミットメントを開くことは可能です。

128ビットハッシュを衝突させることができれば、この実行方法が容易に分かります。 コミットメントは、 \(InternalH\)\(a_{pk}\) の128ビットハッシュ、 そして \(\rho \) を計算し、そしてそのハッシュにコミットすることで開始します。 InternalH 衝突を発見すると、2つの異なる \(a_{pk}\)\(\rho \) ペア \((a_{pk}, \rho )\)\((a_{pk}\prime, \rho \prime)\) (同じ:math:InternalH を 付与)を持ち、コミットメントを \((a_{pk}, v, \rho , r)\) または \((a_{pk}\prime, v, \rho \prime, r)\) のいずれかに開くことができます。このコミットメントスキームは バインディングではありません。この弱点は攻撃の対象となり得るでしょうか。

攻撃

存在するすべてのノートへのコミットメントは、ブロックチェーンに格納されます。 ノートを使用するには、そのブロックチェーンにコミットされたノートの スペンディングキーを知っていることをゼロ知識証明すると同時に、ノートの ナリファイアを開示する必要があります。ナリファイアは、それぞれのノートに 固有の数値です。ノートが2回使用されないように、ネットワークのすべての ノードは新しく開示されたナリファイアが既出でないかどうかを確認します。

スペンディングキー \(a_{sk}\) に所有されるノートのナリファイア \((a_{pk}, v, \rho , r)\) は、疑似乱数の関数を \(\rho \) に適用することで計算 されます。例:ナリファイアは \(PRF_{a_{sk}}^{nf}(\rho )\)。使用者は、 (\(\rho \) または \(a_{sk}\) を開示することなく)ナリファイアを正しく 計算したということをゼロ知識証明する必要があります。

InternalHの弱点により、攻撃者は2つの有効な \(\rho \) 値が存在するためのノートコミットメントを作成することが可能になります。コミットメントが \((a_{pk}, v, \rho _1, r)\) または \((a_{pk}, v, \rho _2, r)\) のいずれかに開くという \(\rho _1\) と別の \(\rho _2\) を発見できるのです。最初に \(\rho _1\) を使用する際、ナリファイア \(PRF_{a_{sk}}^{nf}(\rho _1)\) を開示してノートコミットメントを使用します。次に、\(\rho _2\) を使用してナリファイア \(PRF_{a_{sk}}^{nf}(\rho _2)\) を開示し、2回目を使用します。その結果、このノートには1つではなく2つの異なるナリファイアがあることになり、2回使用することができるのです。このすべてがゼロ知識で行われるため、ネットワークのノードにより両方の支払いが同じノートコミットメントを参照していることを特定できません。別の形の攻撃には、2つの異なる ρ ではなく、2つの異なる \(a_{pk}\) を発見することで実行されるものがあります。

攻撃者は、128ビットハッシュ衝突を発見するたびに、すべてのZcashを 1つの二重支払いノートにまとめて自らのために二重支払いを行い、資産を 効率的に2倍にすることができます。\(2^64\) のオペレーションを通しても、 衝突の発見には費用がかかりますが、この攻撃によりすぐに利益を回収する ことができるのです。

修正

Zerocashオリジナル科学論文 のセクション5.1で、コミットメントスキーム に 統計的ハイディング と呼ばれる強力なプロパティを与えるために \(InternalH\) を128ビットと選択したことが説明されています。 元のハイディングプロパティは、計算が可能です。極めて高速の コンピュータ(例えばSHA256以上)を使用しない限り、入力に関して 何も学ぶことができないと言れています。一方、統計的ハイディングでは、非常に速いコンピューターを使用しても 入力に関して何も学ぶことが できないと言われています。これにより、いつの日かSHA256ハッシュの 機能が壊されたとしても、Zcashはプライバシー保証を維持することができるはずです。

脆弱性を修正をするため、安全なバインディングをもつ異なるコミットメント スキームに変更しました。Zcashのゼロ知識証明が効率よく計算に使用される よう、強力な統計的ハイディングを停止し、通常のものを採用しました。 新しいコミットメントスキームのハイディングプロパティを破壊するには、 研究し尽くされたSHA256のセキュリティプロパティを壊す必要があるため、 現実的に実現することは近い将来ではあり得ないと考えられます。以下は、 ノートコミットメントスキームの現在の設計です。

\(cm = \text{SHA256}(\text{0xB0} \text{ \| } a_{pk} \text{ \| } v \text{ \| } \rho \text{ \| } r)\)

詳細は プロトコル仕様書 に説明されています。

結論

安全な暗号プロトコルを作成することはたやすくありません。世界トップクラス の暗号作成者とセキュリティエンジニアで構成されるZcashのチームでさえ、 その過程で間違いを犯す可能性があります。しかし、セキュリティレビューを 注意深く行い、透明性を実践することで安全な製品を生み出すことができる と考えています。

現時点では、Zcashプロトコルは厳しいセキュリティレビューの対象と なっています。まずピアレビューが行われ、その後会社内部の専門家チーム によるレビューが行われます。しかしながら、プロトコルが安全である ことを保証するためには*より多くの*精密調査を必要とします。

暗号プロトコル内のバグ発見に興味をお持ちの場合は、プロトコル仕様書 を ご覧ください。プロトコルを破ることができたら、その方法をお知らせください。 人類がオープンで許可を必要としない、プライバシーの確かな金融システムを 獲得するための多大な貢献となります!

— Taylor Hornby と Zooko Wilcox、2016-04-25