CPU脆弱性についての論文を読んでいると必ずと言っていいほど出てくるIntel SGX(Software Guard Extension)。 なんとなく秘匿データを扱うためのIntelのハードウェア機構なんだろうなと思っていたけど、あまり知ったかぶりをしているのもよくないのでチュートリアルを読んでみることにした。
前回に続いて、今回はTutorialのPart-2だ。今回は前提条件が長々と書いてあるのであまり面白くない。途中までまとめていたが止めてしまった。速く手を動かしたい。
Intel® Software Guard Extension チュートリアル連載
Part-2 アプリケーションデザイン
Intel®Software Guard Extensions (Intel® SGX)チュートリアルの第2回は、アプリケーションの開発についてである: シンプルなパスワードマネージャについて取り上げる。アプリケーションを一から開発するため、Intel SGXについて最初から弁学ぶためにはよい教材である。Intel SGXデザインと、他に影響を与えるアプリケーションアーキテクチャについて学ぶ。
最初に、本連載の最初のチュートリアルを読むか、Intel® Software Guard Extensions Tutorial Series のすべての連載のリストを見ておくこと。
一目でわかるパスワードマネージャ
多くの人々はパスワードマネージャの役割について知っているが、アプリケーションの設計をする前にその基本的な機能について見ておくことは良いことだろう。
パスワードマネージャの主たる目的は
- エンドユーザが記憶する必要のあるパスワードの数を減らす。
- エンドユーザが通常選択しがちなパスワードよりもより強固なパスワードを使用できるようにする。
- すべてのアカウントで異なるパスワードを使えるような環境を整える。
パスワードの管理は、インターネットユーザにとって頭を抱える問題になっている。いくつかの研究により、パスワード管理の問題が指摘されている。Microsoftの2007年の研究ーほぼ10年前ーによると、一人当たり平均25個のアカウントを持っていると推定されている。さらに最近、2014年になると、DashlaneはUSユーザが平均で130個のアカウントを持っていると推定されており、全世界では平均で90個のアカウントを持っているという研究成果が発表された。さらに問題はこれで終わらない。人々は「良い」パスワードを選ぶのが悪く、複数のサイトで同じパスワードを頻繁に再利用する傾向にある。これにより驚くべき攻撃につながっている。この問題は、2つの問題に集約される: ハッキングされにくいパスワードは人々にとっても覚えにくいということ、そしてより多くの種類のパスワードと、ペアとなるアカウントを記憶するというのは問題を複雑にするということである。
パスワードマネージャを使用すると、ユーザは1つの非常に強力なパスフレーズを記憶しておくだけで、パスワードデータベースや金庫室にアクセスすることができる。一度パスワードマネージャにより認証されると、ユーザはパスワードデータベースに格納しているすべてのパスワードにアクセスでき、必要に応じてパスワードを認証フィールドにコピー&ペーストすることができるようになる。もちろん、鍵となる脆弱性はパスワードデータベースそのものである: このデータベースにはすべてのパスワードが格納されているため、攻撃者にとっては格好の攻撃対象である。したがって、パスワードデータベースは強力な暗号化技術を使って暗号化され、ユーザのマスタパスフレーズによってデータベース内のデータを複合化する仕組みになっている。
本チュートリアルの目標は、商用製品と同一の機能を持つシンプルなパスワードマネージャを作り上げる中で、セキュリティ対策の良い例題を取り上げながら、Intel SGXを使用した開発について学ぶことである。チュートリアルのパスワードマネージャを、"Tutorial Password Manager with Intel® Software Guard Extensions"(長くてちょっと発音しにくいが、記述的だ。)と呼ぶことにする。これは商用プロダクトの機能を説明する目的のものではなく、すべてのセーフガードの機能を含むわけではないが、詳細レベルは必要ではない。
基本的なアプリケーションの必要要件
私たちがこれから紹介するIntel SGXを活用するパスワードマネージャは、商用のプロダクトレベルのアプリケーションを作ることではない。Tutorial Password Managerは複数のオペレーティングシステムで動作する必要はないし、すべてのCPUアーキテクチャで動作する必要はない。かなりリーズナブルな条件から始めよう。
私たちの基本的なアプリケーションの要件は以下のとおりである:
必要条件と設計決定
- Intel SGXが搭載されているかどうかにかかわらずすべてのプラットフォームで動作しなければならない。
Microsoft Windows Vista®, 64-bit以降のサポートが必要である。(Intel SGXサポートには Windows® 10, 64-bit以降が必要である)
Intel® Data Protection Technology(Intel® DPT)をサポートするインテルのプロセッサが必要である。
- サードパーティのライブラリやユーティリティに依存してはならない。
最初の条件は奇妙かもしれないが、少なくとも世の中にはIntel SGXを使用していないレガシーな環境も存在する。Intel SGXを使用している環境ではハードな(xxx)実行環境が提供されるが、そうでない環境もまた現役である。パスワードマネージャは、パスワードデータベースをIntel SGXを使用していない、古いシステムでもサポートする必要がある。これは2系統のコードを実装しなければならないときの良い題材である。
2番目の条件は、非Intel SGXコードのパスでいくつかのライブラリを使用する必要があるからである。64-bitの制約は、64-bitの演算の際に型の大きさを気にしなくてもよいということと、暗号化のアルゴリズムにおいて64-bitのコードを使用してパフォーマンスを向上させる目的がある。
3番目の条件は、非Intel SGX環境においてRDRAND命令を使用するための条件である。この条件により、乱数の生成と高品質なエントロピーソースであることを保証できるようになる。RDSEED命令を使用することができるシステムでも同様の保証が得られる(RDRANDおよびRDSEED命令についての情報は、Intel® Digital Random Number Generator Software Implementation Guideを参照のこと)。
4番目の条件は、開発者に必要なソフトウェアのリストを最小限に抑えるためのものである。サードパーティのライブラリ・フレームワーク・アプリケーション・ユーティリティはダウンロードやインストールの必要が無い。しかし、ユーザインタフェースを作成するにあたり、サードパーティのフレームワークを利用する必要がある。それらのオプションは、
ユーザインタフェースフレームワーク
必要条件と設計決定
- WPFベースのGUI
- Microsoft .NETフレームワーク 4.5.1以降
- (削除)Microsoft Windows Vista®, 64-bit以降のサポートが必要である。(Intel SGXサポートには Windows® 10, 64-bit以降が必要である)
- Microsoft Windows Vista with SP2, 64-bit以降(Intel SGXサポートにはWindows 10, 64-bit以降が必要)
パスワードの金庫の必要条件
必要条件と設計決定
- パスワード金庫は持ち運び可能(portable)でなければならない。
- 金庫は暗号化されていなければならない。
- すべての暗号化処理は認証された暗号化モードを使用しなければならない。
パスワード
必要条件と設計決定
- アカウントパスワードは暗号化され金庫に格納されていなければならない。
- アカウントのパスワードはオンデマンドに複合化されなければならない。
暗号化アルゴリズム
必要条件と設計決定
- 暗号化はAES-GCMを使って行われる。
- 128-bit鍵
- 128-bit認証タグ
- Additional Authenticated Data(AAD)は使用しない
- 97-bit IV
暗号鍵とユーザ認証
必要条件と設計決定
- 金庫のカギはRDSEED命令から生成されるか、RDSEED命令をサポートしていないプラットフォームではRDRAND命令から生成されるシードを利用して生成される。
- 金庫のカギはマスター鍵を使用して暗号化される。
- マスター鍵はユーザのパスフレーズから、KDFを通じて伝えられる。
- KDFはSHA-256をベースにしている。
アカウントの詳細
必要条件と設計決定
- 金庫は以下のアカウント情報を格納する。
- アカウント・ベンダ名
- アカウント・ベンダURL
- ログインID
- 認証パスワード
- 金庫は固定された数のアカウントを持っている。