【VEE '21】複数プロセスが動作するTEEの分離を行うSpons & Shields
TL;DR
柔軟な分離抽象化を行うSpons & Shieldの提案
Spons: TEE内で動作する分離されたメモリ領域(プロセス)
Shield: メモリ保護境界の階層を定義し、メモリアクセスポリシーを適用
本文
前回紹介したCUREはenclaveをsub-space enclave、user-space enclave、self-contained enclaveに分離したTEEアーキテクチャを提案し、RISC-Vベースのプロトタイプを実装した内容だった。今回紹介するSpons & Shields Framework(SSF)も柔軟な分離抽象化を目指すという点で似ているが、メモリ割当、ファイルI/O、ネットワークI/O、スレッドのスケジューリング/同期といった機能をlibraryとして提供するTEE向けライブラリOSという方向性だ。 パフォーマンス計測の章では、ヘルスケアアプリを題材とし、LAMP構成のサービスにSSPを適用する例が挙げられている。
https://gyazo.com/d2e0238ae90f6fcd452d37806ccc4275
このようなサービスでは、WebサービスとDBMSをプロセスによって分離する方式が取られているが、TEEが想定する脅威モデルではプロセス分離機能を提供するホストOSを信用していない。サービスが複数存在するようなmulti-TEE環境において、ナイーブな実装では個別にTEEを生成することも考えられるが、TEEの動的作成のコストやデータコピーと暗号化のオーバーヘッドにより効率的なデータ共有の実現が難しい。
osuke.icon enclaveを分ける方法は?同一マシン上で全て実装しようとしてるのかな
cipepser.icon 分ける方法は後述のメモリ境界チェックを行う命令をコンパイル時に追加する方式です。同一マシンかは特に記述されていなかったです。。。
そこで本論文では、柔軟な分離抽象化を行うSpons&Shieldを提案している。
osuke.icon TEE OS、trustzoneとか想定?
cipepser.icon 本論文中ではSGX想定でした
Sponsはsandbox化されたライブラリや、従来のプロセスのように動作できる自己完結型の分離メモリ領域で、アプリケーションの実行コンテキストのカプセル化を行う。TEE内で動作する1つのプロセスのようなイメージがわかりやすいだろう。Sponはマルチプログラミングとconcurrencyをサポートし、低コストかつ動的にSponsを生成ができるとしている。Sponは適切に定義されたentry pointを介してのみ他Sponsを呼び出せすことができ、POSIX準拠のインターフェースとなっている。
https://gyazo.com/32f876aea848dabfd266c63c7a600102
Shieldsは、Spons全体のメモリ保護境界の階層を定義し、メモリアクセスポリシーを適用する役割を担う。各Sponは一つのShieldに割り当てられ、Spon SはSを囲むShiledに含まれるすべてのコードとデータにアクセスが可能だ。TEE OSは最も外側のShieldで実行され、このShieldがデフォルトとなる。また、複数Sponsに同じShieldを割り当てることも可能となっている。
https://gyazo.com/5703d988ac1643de90db7290242caa40
osuke.icon やばいshiledいまいちわからない
SSFは割り当てられたShield内のメモリアクセスをチェックするため、SSFPassによってSpon codeをinstrument化している。SSFPassは、Spon内のすべてのメモリアクセスに境界チェック命令を追加するコンパイラパスで、Shield外のメモリにアクセスしようとすると例外を発生発生させる。MPX境界レジスタを用いて、上限と下限のチェックする命令をコンパイル時に追加する仕組みだ。実装はLLVM IRレベルで行われるため、ソースコードの変更は不要としている。MPX境界レジスタとしては、XCR0レジスタ(SGXも本レジスタ上で動作)が利用され、悪意あるホストOSによって無効にされないようになっている。
本論文では、冒頭でも述べたヘルスケアサービスに対して、SSFを適用したベンチマークを行っている。システムとしては、DBMSに格納されたmarkdownページをホスティングするPHPベースのCMSだ。
https://gyazo.com/002b7e983225df15e29b13d8fb85838f
単純なMulti-TEEに比べて
Shieldあり: 2.6倍のレイテンシ
Shieldなし: 4.4倍のレイテンシ
https://gyazo.com/f9f1273e4f3a96b8d9c90335e05c63bc
実行時間が20%増加
前回紹介したCUREに引き続き、Multi-TEEやMulti-enclaveを同時に動作させるアーキテクチャを紹介した。SGX2では従来のSGXの大きな制限であったEPCサイズが引き上げられるなど、チップベンダーの動向もMulti-TEEを実現できる方向性のように感じる。依然パフォーマンスのオーバーヘッドも無視できない大きさではあるので、引き続き注目だ。(文責・恩田) Appendix
https://gyazo.com/980e1c31a7edec088d92b4604ac23671
参考) POSIXのexecve
int execve(const char *filename, char *const argv[], char *const envp[]);
Binary size overhead
SSFPassのmemory instrumentation
php-fcgi
16MB→26MB(1.7x)
NGINX
6.3MB→11MB(1.7x)
PostgreSQL
11MB→21MB(1.9x)