SGX入門：HTTPからEnclaveまで


(※この資料はhttps://medium.com/corda/intro-to-sgx-from-http-to-enclaves-1bf38a3bf595 と、https://medium.com/corda/corda-and-sgx-a-privacy-update-c1a74354c156 の二つの英文記事の抜粋翻訳です。
正確さ等は保証いたしかねます。)


　[R3](https://www.r3.com/)社ではIntel社の開発したSGXのJAVA上での実装を進めています。まずは、SGXがどのようなものなのか、その概要について紹介します。

##SGXはなぜ必要なのですか？
　一言で言うと、SGXは信頼されていないコンピューターでも機密データを安全に処理する方法を提供します。まだ課題はたくさんありますが、将来的にプライバシーとセキュリティに関する考え方に革命をもたらす可能性があります。

##これは暗号技術ですか？
　SGXはハードウェア支援型のセキュリティソリューションです。既存の暗号技術よりもはるかに強力です。

##わかりやすい説明ができますか？
　まずはHTTPとHTTPSについて知ることが理解への近道です。
###①HTTP接続
　HTTPのWebページを開くと、ブラウザはサーバーへの接続を確立し、プレーンテキストを要求します。その後、サーバーはプレーンテキストを送信します。パケットが通過する中間ノードは、パケットを傍受、読み取り、または改竄することができます。
さらに、サーバーによるデータの使用方法を制御することもできません。つまり、データがエンドユーザーのデバイスから送信されると、すぐにデータは完全に表示され、改竄が可能になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/392119/acf32048-497d-488d-bf61-380d8386430d.png)


###②HTTPS接続
これを解決するために、HTTPSと呼ばれる安全なバージョンのHTTPがあります。
HTTPS のWebページを開いたら、ブラウザはサーバーへの接続を確立します。サーバーはブラウザに公開鍵を送信します。ブラウザは共通鍵を生成し、サーバーから送られてきた公開鍵で共通鍵を暗号化します。暗号化した共通鍵をサーバーに送信し、サーバーが秘密鍵で復号すれば、中間ノードに傍受されずにブラウザとサーバーは同じ共有鍵を保有することが可能です。この共有鍵はブラウザとサーバーの間を流れるトラフィックを暗号化するために使用します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/392119/badf6ca2-5ba7-d412-6627-e3df82811d7d.png)
ただし、このプロセスは信頼関係を確立し、接続自体を保護するだけです。__サーバー側が第三者にトラフィックを漏らすことにした場合、共通鍵による暗号化は意味のないものとなります。__

###③HSM導入
これを解決する1つの方法は、サーバー側の処理をハードウェアセキュリティモジュール（HSM）に入れ、流れるデータを物理的に保護することです。ただし、これを行っても、エンドユーザーはサーバーが実際にこれらのHSMを使用していることを信頼する必要があります。これを__検証する方法はありません。__

![image.png](https://qiita-image-store.s3.amazonaws.com/0/392119/b4d324d0-1cdb-0234-4f11-28c7f1fbd4d2.png)


###④SGX
ここでSGX（Intel Software Guard Extensions）の出番です。SGXはミニHSMのようなものであり、最新のIntel CPUに搭載されております。

* __SGXの内部へは、特定のアクセス方法でしか到達できません。__

> SGXへは、（SGX内部でしか復号化できない）暗号化されたプログラムとデータしか書き込むことができません。他の（ハッキングされる可能性のある）ユーザー領域からのアクセスはもちろん、OSからもアクセスすることはできません。

* __SGXは、エンドユーザーがサーバー側でどんなコードが機能しているかを検証する方法も提供します。__

>
1. はじめに、サーバー側で実行されているコードを識別する方法が必要ですが、サーバーの実行可能イメージをハッシュ化するだけです。 SGXの用語では、ハッシュはMRENCLAVEと呼ばれます。
* コードを特定したら、サーバー側が実際にそれを実行していることを証明する必要があります。これを行うために、SGXはチップ固有のキーを使用して、実行ファイルが生成するレポートに署名します。
* エンドユーザーが、レポートの署名を本物のIntelチップによって行われていることを確認するには、Intelの用意するREST APIへその署名を送信します。そのレポートが有効で正規のIntel CPUによって署名されている場合、Intelのルートキーで署名されたデータが返信されます。
* 一連のプロセスの結果、SGXクライアントはレポートが特定の実行可能ファイルから送信されていることを確認できます。

__これらの機能により、送信した機密データを完全に保護することが可能です。__
![image.png](https://qiita-image-store.s3.amazonaws.com/0/392119/dcbd17aa-a403-ff89-8cf5-5249c727634a.png)

##最後に、SGXとCordaの関係は?

SGXの良さを一言でいうなら、__だれにも触ることのできない秘密の場所で、正しく計算を実行できること__です。
これは、Cordaの求める世界観（ビジネス上の要求）と、非常に相性のいい技術です。Cordaは、プライバシーを重視しています。Cordaを用いると、取引のプライバシーは保たれます。つまり、取引当事者以外が取引の内容を知ることはありません。（これは、ブロックチェーンを知らない、普通にビジネスをしている人間からすると当然の要件である一方で、ブロックチェーン界隈では今のところ我々以外誰も理解できていないビジネス上の要件です）

しかし、Cordaが作るデータの整合性を検証するためには、その履歴をさかのぼって監査する必要があります。Cordaは、その履歴を個別取引ごとにさかのぼり、履歴の正しさを確認するプロセスを持っています。当然ながら、この__プロセスが正しく行われていること、プロセスの途中でデータが盗まれない事は、Cordaにとって重要な要求__です。

ここに、SGXの出番があります。

__スマートコントラクトの実行、二重支払いの防止と言った、Cordaの核となるプロセスを、SGXの中で実行する。それによって、プライバシーに対する懸念は完全に払しょくされ、スマートコントラクトの正しさも完全な意味で保障されることになります。__

###ゼロ知識証明
こうしたプライバシーや監査の文脈では、同種の技術としてゼロ知識証明があります。確かにゼロ知識証明は非常に面白い。（_※訳者も数学、情報工学的な観点でこの分野の進展を楽しみに見守っています。_）しかし、そのロジックは基本的に複雑です。単なる二重支払いの防止であっても、膨大で複雑な計算を必要としますし、一般化されたスマートコントラクトのゼロ知識証明は、MSR GepettoやvnTinyRAMのような研究者の努力の結晶として、ようやく理論的な可能性が示されたにすぎませんし、その実装と計算には大量の計算リソースが必要です。
こうした実装の難しさ（＝バックドアの可能性）と、計算コストを前にして、私たちはゼロ知識証明より、SGXを使うことを選びました。

SGXは、新しい専門的なスキルを習得する必要がありません。パフォーマンスに重大なペナルティを課すこともありません。テクノロジの失敗によってプライバシーが損なわれたり、整合性が損なわれる心配もありません。シンプルな暗号化だけで実現可能です。いつか、ゼロ知識証明が日常生活の中でこっそりとつかわれているような（スタートレックのような）未来が来たとしても、SGXは依然として重要な役割を果たすと予想しています。

-----

#参考文献
最後に、関連する資料へのリンクを添付します。さらなる高みを目指す方は、こちらをご覧ください。（すべて英語です）

###原文
[Corda and SGX: a privacy update](https://medium.com/corda/corda-and-sgx-a-privacy-update-c1a74354c156)
[Intro to SGX: from HTTP to enclaves](https://medium.com/corda/intro-to-sgx-from-http-to-enclaves-1bf38a3bf595)

###SGX概要
[より詳細な解説論文](https://eprint.iacr.org/2016/086.pdf)
[最新の状況（medium）](https://medium.com/corda/developer-preview-java-in-intel-sgx-8d7127ede826)


###実装(github)
[SGX実装](https://github.com/corda/sgxjvm-public)
[SGX実装の概要説明（その１）](https://github.com/corda/corda/blob/master/docs/source/design/sgx-infrastructure/design.md)
[SGX実装の概要説明（その２）](https://github.com/corda/corda/blob/master/docs/source/design/sgx-integration/design.md)
[インストール用のGradleプラグイン](https://docs.corda.net/sgxjvm/1/sgx-gradle-plugins.html)
[Gradleプラグインの説明](https://docs.corda.net/sgxjvm/1/rng-client.html)
[サンプル](https://github.com/corda/sgxjvm-public/tree/release-1/samples/rng)

###その他
[Intelによるドキュメントその1](https://software.intel.com/en-us/sgx/details)
[Intelによるドキュメントその２](https://www.intel.co.uk/content/www/uk/en/architecture-and-technology/64-ia-32-architectures-software-developer-manual-325462.html)
[Intelによるドキュメントその３](https://software.intel.com/en-us/articles/code-sample-intel-software-guard-extensions-remote-attestation-end-to-end-example)