Wasmのシステムインタフェースの現状と課題
導入
Wasm単体ではほとんど何もすることができず、実用的な処理をするには外部APIを明示的にimportして用いる必要がある。Wasm Runtimeはimportされた関数以外使われないことを保証するため、アプリケーションを動かすのに必要最小限のAPIだけ使用を許可することができる。これがWasmがセキュアといわれる理由の一つであるが、この安全性は「外部APIで何ができるか」に依存している。例えばsyscallのような任意のシステムコールを実行するAPIがあれば、明らかに脆弱である。このため、WASI(WebAssembly System Interface)の標準化が進められている。
課題
WasmのDesign Goalsには「Safe」の他に「Portable」がある。Wasmは仮想CPUの命令セットであり、特定のCPUに依存しない。Wasm Runtimeがそれぞれの環境向けに翻訳して実行するため、WasmバイナリはPortableである。(以下は上の記事からの引用)
WASIはシステムリソースへのアクセスを提供するため、その役割はOSが提供するシステムコールと同じである。WasmバイナリがPortableであるためには、この “システムコール” はOSに依存したものであってはならない。さらに、そのインタフェースはセキュリティを考えて注意深く定義する必要がある。
問題はこれには時間がかかることである。実際、WASIの仕様策定が遅いため、Wasmerは独自にWASIXというインタフェースを定義している。さらに最近、WALIという、WASIとは別のシステムインタフェースが出てきた。これはLinuxのシステムコールをそのままWasmの世界に持ってくるものである。論文では高レベルなAPIでは合意をとるのが難しいため、より低レベルなAPIを用意して、そのうえでWASIやWASIXのような高レベルAPIを実装することが提案されている。
考察
WasmのPortabilityは 「皆が同じものを使う」 ことで実現される。WASIの目的はシステムインタフェースを標準化することだったが、WASIXやWALIが出てきてしまった。汎用だったはずのWasmバイナリは、既にランタイム依存になりつつある。
WASIを定義したところで、それが使われなければ意味がない。仕様が大きくなれば合意を取るのが困難になるため、仕様は必要最小限のものである必要がある。つまりWASIは必用最小限で、かつOSに依存しない汎用的なインタフェースを目指す必要がある。
現状、WASIはどちらの条件も満たしていない。WASIの大部分はPOSIXを前提としたインタフェースになっているし、仕様もどんどん大きくなることが予想される。アプリケーションが必要とするすべてのインタフェースについて仕様を定義し、合意を取ることはかなり難しいことに思える。(しかもそのインタフェースはセキュリティを考えた"使いにくい"ものなのだ)
WASIXやWALIのような独自APIが沢山生まれてしまうと、Wasmの「Portable」,「Safe」という特徴が完全に失われ、Wasm+WASIが廃れる恐れがある。Wasm+WASIが目指す世界はとても魅力的だが、その実現にはまだまだ課題があると言わざるを得ない。
Discussion