TWINE: An Embedded Trusted Runtime for WebAssembly
タイトル: TWINE: An Embedded Trusted Runtime for WebAssembly
著者: Jämes Ménétrey, Marcelo Pasin, Pascal Felber, Valerio Schiavoni
37th IEEE International Conference on Data Engineering (ICDE’21)
TL;DR
安全性の高いかつ高速で軽量なアプリケーション実行環境を実現するためにTEEとWasmのいいとこ取りしたTWINEというTEE内で動作する軽量な組み込みランタイムを提案
WasmをTEE内で動かすプロジェクトはいくつかあるが、WASIを導入し、WasmとWASIをシームレスに活用してTEEの特定の機能を提供する初のシステム
開発言語に依存せずTEEアプリケーション開発が可能であり、またレガシーなWasmでも修正や再コンパイルなしで即実行可能というメリットも大きいが、ネイティブと比べると性能が少し落ちる
本文
背景
Intel SGXを用いたEnclaveと呼ばれる暗号化されたメモリ領域を作成・その上でアプリケーションを実行することで不正なアクセスから保護され、安全にアプリケーションを実行することが可能になる。一方で、TEEアプリケーション開発は複雑で、対応する言語も限られており、またEnclaveの操作にはECALL/OCALLが必要で、処理コストが高い(パフォーマンス低下につながる原因の一つ)
Wasmは徐々に普及している軽量のバイナリ命令フォーマットで、ブラウザ上で使うために誕生したが、最近ではブラウザ以外のところでも幅広く使われている(例えばBlockchain)。Wasmは速度が速い、サンドボックス化が可能、安全性も高い、移植性も高い技術だが、コンパイル方法による特定のOSと密結合になることがあり、移植性が落ちる
安全性の高いかつ高速で軽量なアプリケーション実行環境を実現するためにTEEとWasmのいいとこ取りしたのがTWINE
TWINE(Trust Wasm IN Enclave)
修正されていない(execute unmodified)、言語に依存しないアプリケーションを実行するために設計されたWebAssemblyトラステッドランタイム
TEE内で動作する高移植生の軽量なWebAssemblyトラステっどランタイム
修正されていない is 特定のOS上で実行するためにコンパイルされたWasmをTWINEで実行するためにアプリケーションの修正・再コンパイルが不要
言語に依存しない is コンパイル言語・スクリプト言語関係なく対応
アプリケーションの基盤となるTEE、OS、ハードウェアの間のレイヤー
WASIレイヤーが含まれており、レガシーなWasmでも修正や再コンパイル不要で即実行可能
WASIでOSのシステムコールや、SGXのライブラリを動的に変換
WasmをTEE内で動かすプロジェクトがいくつかあるが、WASIを導入し、WasmとWASIをシームレスに活用してTEEの特定の機能を提供する初のシステム
詳細
https://gyazo.com/48923454e59e9335ede98a6971f52198
WASI
WebAssembly system interface
ウェブブラウザ以外の環境で実行するため、 ホストのファイルやネットワークなどの資源に安全にアクセスさせるための仕様
Wasmと基盤となるOSとのやりとりを標準化されたIFで実行可能
異なるOSに適した複数の実装可能
仮想化、サンドボックス化、アクセス制御など非機能的な部分が抽象化されている
目的は2つ
レガシーなWasmとの互換性
信頼できる環境と信頼できない環境の間のブリッジとして機能
WASIを使う利点
TEEはアプリケーションから抽象化される
TEEがWASIでサポートされているWasmを実行できる限り、アプリケーションは安全に実行できる
WASIが必要とするAPIと同等なものをOSが提供できる限り、システムに依存しない
サンドボックス化によるセキュリティ向上
nrryuya.icon >
TWINE dynamically translates WASI operations into equivalent native OS calls or to functions from secure libraries purposely built for SGX. In particular, TWINE maps file operations to Intel protected file system, and persisted data is transparently encrypted and never accessible in plaintext from outside an enclave
組み込み可能で軽量かつ言語非依存を実現するためにWAMRを採用(WASIは独自実装) WebAssembly micro runtime
開発者はWasm開発に特定の言語に依存せず自由に選べる
AoTとJITの2つのバイナリ実行モード。どちらもLLVM使用
cipepser.icon バイナリ実行モード?コンパイルではなく?
ランタイムバイナリサイズはAoTが50KiB、インタプリタが85KiB
cipepser.icon すご。めちゃ小さい。SGXライブラリとは動的にリンクするから、runtime binaryに含まれないのかな?
外部依存が少ない
SGXのEnclaveと簡単にリンク可能なため、WasmとSGXの統合が大幅に簡素化される
(まだ未実装だが)
https://gyazo.com/9e51fc4a578ebae1824f10dda57c30c6
Intel SGXのみサポート
性能評価
結論
TWINEはネイティブやWAMRより性能が落ちるのは事実。だが、速度低下の一番大きな原因としてはEPCサイズの制限が大きい。また、最適化(Intelが提供しているSGX SDKを修正)を行うことで性能が向上する
cipepser.icon 85KiBしかないのにEPCサイズの制限に抵触してしまう?
cipepser.icon runtimeが小さいだけで、アプリケーションコードが大きくなった場合にってことかな?
cipepser.icon Fig.5のfileを見るとEPC full以下でも遅い?少なくとも閾値でパフォーマンスが変わっていないので、アプリケーションコードが大きくなるだけでは説明できない原因がありそう。
https://gyazo.com/d5406971da37277ef7c495e20b67909b
性能: ネイティブ > WAMR > TWINE
dericheのような明かに速度低下が発生しているテストはEPCサイズの制限に達したのが原因
SQLiteテスト
https://gyazo.com/2534ea671868a38a74a9e70a42779e44
410, 510
ページキャッシュをオーバーフローさせてランダムにレコードを読み出す実験
ファイルシステムとの相互作用による追加の遅延が発生し、EnclaveのOCALLと暗号化によってさらに悪化。その結果としてインメモリデータベースを使用した場合のクエリと比較すると、TWINEで最大12.4倍、SGX LKLで最大22.1倍の遅延が発生
jkcomment.icon そもそもテストの前提条件が違うのでは?TWINEがPOSIX使えないからVFSベースにし、アクセスもWASI API経由になっている
https://gyazo.com/edcd971ee1bda50e7116e8d120852e75
最適化を行った結果(SGX SDK内部処理を修正)
https://gyazo.com/26e41a2f2e268538fe501aa1a553b05e
参考
関連研究
AccTEE, Se-Lambda, Enarx, CryptSQLite, EnclaveDB, StealthDB
Wasm runtime
Wasmtime, Wasmer, Lucet, WAVM, Wasm3, WAMR