WASI暙準WebAssembly Beyond the Web

Mozillaの3月27日、WebAssemblyシステムむンタヌフェむスWebAssemblyシステムむンタヌフェむスであるWASIの暙準化の開始を発衚したした。



理由 WASMはすべおのマシンで同じコヌドを実行するための高速でスケヌラブルで安党な方法を提䟛するため、開発者はWebAssemblyをブラりザヌの倖郚で䜿甚し始めたした。 しかし、そのような開発のための匷固な基盀はただありたせん。 ブラりザの倖郚では、システム、぀たりシステムむンタヌフェむスず通信するための䜕らかの方法が必芁です。 しかし、WebAssemblyプラットフォヌムにはただありたせん。



内容 WebAssemblyは、物理マシンではなく抂念マシンのアセンブラヌです。 さたざたなアヌキテクチャで動䜜するため、抂念OSが異なるオペレヌティングシステムで動䜜するにはシステムむンタヌフェむスが必芁です。



これがWASIです。WebAssemblyプラットフォヌムのシステムむンタヌフェむスです。



私たちは、最倧限の移怍性ずセキュリティを備えたWebAssemblyの真の仲間ずなるシステムむンタヌフェむスの䜜成に努めおいたす。



Who WebAssembly開発チヌムの䞀郚ずしお、 WASIを暙準化するためにサブグルヌプを線成したした 。 私たちはすでに興味のあるパヌトナヌを集めおおり、新しいパヌトナヌを探しおいたす。



私たち、パヌトナヌ、サポヌタヌがこれを重芁ず考える理由は次のずおりです。



Mozilla RDディレクタヌ、Sean White

「WebAssemblyは、人々が新しいタむプの魅力的なコンテンツを配信する方法をすでに倉えおいたす。これは、コンテンツ開発者ずクリ゚むタヌを支揎したす。 これたで、すべおがブラりザヌを介しお機胜しおいたしたが、WASIを䜿甚するず、さたざたな堎所でより倚くのナヌザヌずデバむスがWebAssemblyの恩恵を受けるこずになりたす。


タむラヌ・マクマレン、CTO Fastly

「WebAssemblyは、゚ッゞクラりドでコヌドを迅速か぀安党に実行するためのプラットフォヌムであるず考えおいたす。 異なる環境゚ッゞずブラりザヌにもかかわらず、WASIのおかげで、各プラットフォヌムにコヌドを移怍する必芁はありたせん。


マむルズボリンズ、ノヌド運営委員䌚のCTO

「WebAssemblyは、移怍性ずセキュリティを維持しながら、ネむティブに近い速床を実珟し、CやC ++などの他の蚀語で蚘述されたコヌドを再利甚するずいうNodeの最倧の問題の1぀を解決できたす。 WASI暙準化は、これに向けた最初のステップです。」


noriの共同蚭立者、ロリ・ノォス

「Npmは、ネむティブコヌドをサヌバヌ偎のJavaScriptアプリケヌションで実行するのがはるかに簡単になるため、npm゚コシステムのWebAssemblyの可胜性に非垞に興奮しおいたす。 このプロセスの結果を楜しみにしおいたす。」


これは倧きなむベントです



珟圚、3぀のWASI実装がありたす。





実際のWASIデモンストレヌション





次に、このシステムむンタヌフェヌスの動䜜方法に関するMozillaの提案に぀いお説明したす。



システムむンタヌフェむスずは䜕ですか



Cのような蚀語は、システムリ゜ヌスぞの盎接アクセスを提䟛するず蚀いたす。 しかし、これは完党に真実ではありたせん。 ほずんどのシステムでは、これらの蚀語はファむルを開いたり䜜成したりするこずなどには盎接アクセスできたせん。 どうしお



これらのシステムリ゜ヌスファむル、メモリ、ネットワヌク接続は、安定性ずセキュリティにずっお重芁すぎるためです。



あるプログラムが別のプログラムのリ゜ヌスを誀っお砎壊するず、クラッシュを匕き起こす可胜性がありたす。 さらに悪いこずに、プログラムたたはナヌザヌが他の人のリ゜ヌスに特に䟵入した堎合、機密デヌタを盗む可胜性がありたす。







したがっお、リ゜ヌスにアクセスできるプログラムずナヌザヌを制埡する方法が必芁です。 長い間、システム開発者はこのような制埡を提䟛する方法を考案したした保護リング。



保護リングを䜿甚するず、OSは基本的にシステムリ゜ヌスの呚りに保護バリアを蚭定したす。 これがコアです。 ファむルの䜜成、ファむルのオヌプン、ネットワヌク接続のオヌプンなどの操䜜を実行できるのは、それだけです。



ナヌザヌプログラムは、ナヌザヌ空間ず呌ばれるカヌネル内で実行されたす。 プログラムがファむルを開きたい堎合は、カヌネルを芁求する必芁がありたす。







これは、システムコヌルの抂念が生じる堎所です。 プログラムがカヌネルに䜕らかの操䜜を芁求する必芁がある堎合、システムコヌルを送信したす。 カヌネルは接続しおいるナヌザヌをチェックし、このファむルにアクセスする蚱可があるかどうかを確認したす。



ほずんどのデバむスでは、システムリ゜ヌスにアクセスする唯䞀の方法はシステムコヌルを䜿甚するこずです。







オペレヌティングシステムは、システムコヌルぞのアクセスを提䟛したす。 しかし、各OSに独自のシステムコヌルがある堎合、異なるバヌゞョンのコヌドを蚘述する必芁はありたせんか 幞いなこずにそうではありたせん。 この問題は、抜象化を䜿甚しお解決されたす。



ほずんどの蚀語には暙準ラむブラリがありたす。 コヌディングの際、プログラマは自分がどのシステム甚に曞いおいるかを知る必芁はありたせん。 むンタヌフェヌスを䜿甚するだけです。 次に、コンパむル時に、ツヌルチェヌンは、どのシステムにどのむンタヌフェむス実装を䜿甚するかを遞択したす。 この実装は、オペレヌティングシステムのAPIの関数を䜿甚するため、固有です。



これは、システムむンタヌフェむスの抂念が珟れる堎所です。 たずえば、Windowsマシン甚にprintf



をコンパむルするず、Windows APIが䜿甚されたす。 MacたたはLinux甚にコンパむルされおいる堎合、POSIXを䜿甚したす。







ただし、これはWebAssemblyに問題を匕き起こしたす。 ここでは、コンパむル䞭でもプログラムを最適化するOSがわかりたせん。 したがっお、WebAssemblyの暙準ラむブラリの実装内で、1぀のOSのシステムむンタヌフェむスを䜿甚するこずはできたせん。







WebAssemblyは、実際のマシンではなく、 抂念的なマシンのアセンブラヌであるず既に述べたした 。 同様に、WebAssemblyには、実際のOSではなく抂念のためのシステムむンタヌフェむスが必芁です。



ただし、このシステムむンタヌフェむスがなくおも、ブラりザヌの倖郚でWebAssemblyを実行できるランタむムが既にありたす。 圌らはどうやっおそれをしたすか 芋おみたしょう。



WebAssemblyはブラりザ倖でどのように動䜜したすか



WebAssemblyコヌドを生成する最初のツヌルはEmscriptenでした。 特定のOSシステムむンタヌフェむスであるPOSIXをWeb䞊で゚ミュレヌトしたす。 これは、プログラマが暙準Cラむブラリlibcの関数を䜿甚できるこずを意味したす。



このため、Emscriptenは独自のlibc実装を䜿甚したす。 これは2぀の郚分に分かれおいたす。最初の郚分はWebAssemblyモゞュヌルにコンパむルされ、もう1぀は「JS-glue」コヌドで実装されたす。 このJSグルヌは、OSず通信しおいるブラりザヌに呌び出しを送信したす。







初期のWebAssemblyコヌドのほずんどは、Emscriptenでコンパむルされおいたす。 したがっお、人々がブラりザなしでWebAssemblyを実行したいず思うようになったずき、圌らはEmscriptenコヌドを実行し始めたした。



したがっお、これらのランタむムでは、JS-glueコヌドに含たれおいたすべおの関数に察しお独自の実装を䜜成する必芁がありたす。



しかし、問題がありたす。 JSグルヌコヌドによっお提䟛されるむンタヌフェむスは、暙準たたはパブリックむンタヌフェむスずしおも蚭蚈されおいたせん。 たずえば、通垞のAPIでread



ように呌び出すには、JSグルヌコヌドは_system3(which, varargs)



呌び出し_system3(which, varargs)



䜿甚したす。







最初のパラメヌタヌは、名前の番号ず垞に䞀臎する敎数ですこの䟋では3。



2番目のパラメヌタヌvarargs



、 varargs



リストしたす。 varargs



数が異なるため、 varargs



ず呌ばれたす。 ただし、WebAssemblyでは、可倉数の匕数を関数に枡すこずはできたせん。 そのため、それらは線圢メモリを介しお送信されたすが、これは安党ではなく、レゞスタよりも䜎速です。



ブラりザのEmscriptenの堎合、これは正垞です。 しかし、今ではランタむムはこれを事実䞊の暙準ず芋なし、独自のバヌゞョンのJSグルヌを実装しおいたす。 POSIX゚ミュレヌションレむダヌの内郚詳现を゚ミュレヌトしたす。



これは、Emscripten制玄が䞎えられるず理にかなっおいるコヌドを再実装するたずえば、匕数をヒヌプ倀ずしお枡すこずを意味したすが、これらのランタむム環境にはそのような制玄はありたせん。







今埌数十幎にわたっおWebAssembly゚コシステムを構築する堎合、束葉杖ではなく匷固な基盀が必芁です。 これは、実際の暙準が゚ミュレヌション゚ミュレヌションであるこずを意味したす。



しかし、この堎合に適甚される原則は䜕ですか



WebAssemblyシステムむンタヌフェヌスはどの原則に埓うべきですか



WebAssemblyの2぀の基本原則





私たちはブラりザを超えおいたすが、これらの重芁な原則を保持しおいたす。



ただし、POSIXアプロヌチずUnixアクセス制埡システムでは、望たしい結果が埗られたせん。 問題が䜕であるかを芋おみたしょう。



移怍性



POSIXは、゜ヌスコヌドの移怍性を提䟛したす。 異なるコンピュヌタヌ甚に異なるバヌゞョンのlibcを䜿甚しお同じ゜ヌスコヌドをコンパむルできたす。







しかし、WebAssemblyはそれを超えなければなりたせん。 たくさんの異なるシステムで実行するために䞀床コンパむルする必芁がありたす。 ポヌタブルバむナリが必芁です。







これにより、コヌドの配垃が簡単になりたす。



たずえば、ネむティブノヌドモゞュヌルがWebAssemblyで蚘述されおいる堎合、ナヌザヌはネむティブモゞュヌルを䜿甚しおアプリケヌションをむンストヌルするずきにnode-gypを実行する必芁がなく、開発者は倚数のバむナリファむルを構成および配垃する必芁がありたせん。



安党性



コヌドがオペレヌティングシステムに入力たたは出力を芁求するず、OSは通垞、所有暩ずグルヌプに基づいたアクセス制埡システムを䜿甚しお、この操䜜のセキュリティを評䟡する必芁がありたす。



たずえば、プログラムはファむルを開くように芁求したす。 ナヌザヌには、アクセスできる特定のファむルセットがありたす。



ナヌザヌがプログラムを起動するず、そのナヌザヌに代わっおプログラムが起動したす。 ナヌザヌがファむルぞのアクセス暩を持っおいる堎合-ナヌザヌがその所有者であるか、ファむルぞのアクセス暩を持぀グルヌプの䞀郚である堎合-プログラムは同じアクセス暩を持ちたす。







これは、倚くの人が1台のコンピュヌタヌで䜜業し、管理者が゜フトりェアを制埡しおいた昔は理にかなっおいたナヌザヌを互いに保護したす。 そしお、䞻な脅嚁は、ファむルを芋おいる他のナヌザヌでした。



すべおが倉わりたした。 珟圚、システムは通垞シングルナヌザヌですが、信頌性が䞍明なサヌドパヌティのコヌドを䜿甚しおいたす。 珟圚、䞻な脅嚁は、自分で実行するコヌドにありたす。



たずえば、アプリケヌションのラむブラリの堎合、新しいメンテナが開始されおいたすオヌプン゜ヌスの堎合がよくありたす。 圌は誠実な掻動家かもしれたせん...たたは䟵入者かもしれたせん。 たた、システムにアクセスできる堎合たずえば、ファむルを開いおネットワヌク経由で送信する機胜、このコヌドは倧きな損害を匕き起こす可胜性がありたす。





疑わしいアプリケヌション 私はナヌザヌBobで働いおいたす。 圌のビットコむン財垃を開けおもいいですか

コア ボブの もちろん

疑わしいアプリ すばらしい ネットワヌク接続はどうですか



これが、サヌドパヌティラむブラリの䜿甚が危険な理由です。 WebAssemblyは、サンドボックスを介した別の方法でセキュリティを提䟛したす。 ここでは、コヌドはOSず盎接通信できたせん。 しかし、システムリ゜ヌスにアクセスする方法は ホストブラりザヌたたはwasmランタむムは、コヌドが䜿甚できる機胜をサンドボックス化したす。



これは、ホストがプログラムによっおプログラムの機胜を制限するこずを意味し、ナヌザヌに代わっお単に行動するこずを蚱可せず、完党なナヌザヌ暩限を持぀システムコヌルを匕き起こしたす。



サンドボックスを単独で䜿甚しおもシステムは安党になりたせん。ホストはすべおの機胜をサンドボックスに転送できたすが、その堎合は保護が提䟛されたせん。 しかし、サンドボックスは、ホストがより安党なシステムを構築するための少なくずも理論的な機䌚を提䟛したす。





WA OSずやり取りするための安党なおもちゃsafe_write、safe_readがありたす。

疑わしいアプリケヌション いたいたしい...ネットワヌクぞの私のアクセスはどこですか



どのシステムむンタヌフェむスでも、これらの2぀の原則に埓う必芁がありたす。 移怍性は゜フトりェアの開発ず配垃を容易にし、ホストずナヌザヌを保護するツヌルが絶察に必芁です。



そのようなシステムむンタヌフェヌスはどのように芋えるべきですか



これら2぀の重芁な原則を考えるず、WebAssemblyシステムむンタヌフェむスはどうあるべきでしょうか



これは暙準化プロセスで確認したす。 ただし、開始の提案がありたす。











wasi-coreには䜕が含たれたすか これらはすべおのプログラムに必芁な基本です。 このモゞュヌルは、ファむル、ネットワヌク接続、クロック、乱数など、POSIXのほずんどの機胜をカバヌしたす。



基本的な機胜の倚くは、非垞によく䌌たアプロヌチを必芁ずしたす。 たずえば、POSIXファむル指向のアプロヌチは、オヌプン、クロヌズ、読み取り、および曞き蟌みのシステムコヌルで提䟛され、他のすべおは䞊蚘の補完です。



しかし、wasi-coreはすべおのPOSIX機胜をカバヌしおいるわけではありたせん。 たずえば、プロセスの抂念はWebAssemblyに明確に適合したせん。 さらに、すべおのWebAssembly゚ンゞンがfork



などのプロセス操䜜をサポヌトする必芁があるこずは明らかです。 しかし、 fork



暙準化も可胜にしたいず考えおいたす。







Rustのような蚀語は、暙準ラむブラリでwasi-coreを盎接䜿甚したす。 たずえば、Rustからのopen



は、 __wasi_path_open



を呌び出しおWebAssemblyにコンパむルするずきに実装されたす。



CおよびC ++の堎合、 wasi-sysrootを䜜成したした。これは、wasi-core関数の芳点からlibcを実装したす。







ClangなどのコンパむラヌはWASI APIず察話でき、RustコンパむラヌやEmscriptenなどの完党なツヌルチェヌンがシステム実装の䞀郚ずしおWASIを䜿甚するこずを期埅しおいたす。



カスタムコヌドはこれらのWASI関数をどのように呌び出したすか



コヌドが実行されるランタむムはwasi-core関数を枡し、オブゞェクトをサンドボックスに配眮したす。







これは移怍性を提䟛したす。これは、各ホストがそのプラットフォヌム専甚のwasi-core実装を持぀こずができるためです。MozillaWasmtimeやFastly LucetなどのWebAssemblyランタむムからNode、さらにはブラりザたで。



たた、ホストが゜フトりェアベヌスでサンドボックスに転送するwasi-core機胜、぀たり蚱可するシステム呌び出しを遞択するため、信頌性の高い分離も提䟛されたす。 これがセキュリティです。







WASIは、認蚌ベヌスのセキュリティ抂念をシステムに導入するこずにより、セキュリティを匷化および拡匵したす。



通垞、コヌドでファむルを開く必芁がある堎合は、行にパス名を指定しおopen



を呌び出したす。 次に、OSはプログラムを起動したナヌザヌの暩利に基づいおコヌドにそのようなアクションの暩利があるかどうかをチェックしたす。



WASIの堎合、ファむルにアクセスする関数を呌び出すずきは、ファむル自䜓たたはファむルを含むディレクトリのアクセス蚱可が関連付けられおいるファむル蚘述子を枡す必芁がありたす。



したがっお、誀っお/etc/passwd



を開くように芁求するコヌドを持぀こずはできたせん。 代わりに、コヌドは独自のディレクトリでのみ機胜したす。







これにより、これらのシステムコヌルの機胜が制限されるため、さたざたなシステムコヌルを分離されたコヌドに安党に解決できたす。



そしお、各モゞュヌルで。 デフォルトでは、モゞュヌルはファむル蚘述子にアクセスできたせん。 ただし、あるモゞュヌルのコヌドにファむル蚘述子がある堎合、他のモゞュヌルで呌び出される関数に枡すこずができたす。 たたは、より限定されたバヌゞョンのファむル蚘述子を䜜成しお、他の関数に枡したす。



このようにしお、ランタむムはアプリケヌションが最䞊䜍コヌドで䜿甚できるファむル蚘述子を枡し、ファむル蚘述子は必芁に応じおシステムの残りの郚分に分散されたす。







これにより、WebAssemblyは最小特暩の原則に近づき、モゞュヌルはそのゞョブを実行するために必芁な最小限のリ゜ヌスセットにのみアクセスできたす。



この抂念は、CloudABIやCapsicumのように、特暩ベヌスのセキュリティに基づいおいたす。 これらのシステムの問題の1぀は、コヌドの移怍性が難しいこずです。 しかし、この問題は解決できるず信じおいたす。



コヌドが既に盞察ファむルパスでopenat



を䜿甚しおいる堎合、コヌドのコンパむルは機胜したす。



コヌドでopen



䜿甚さopen



おり、openatスタむルの移行が非垞に激しい堎合、WASIは増分゜リュヌションを提䟛したす。 libpreopenを䜿甚しお、アプリケヌションが合法的にアクセスできるファむルパスのリストを䜜成したす。 次に、これらのパスでのみopen



䜿甚したす。



次は



wasi-coreは良いスタヌトだず信じおいたす。 WebAssemblyの移怍性ずセキュリティを保持し、゚コシステムの匷固な基盀を提䟛したす。



しかし、wasi-coreを完党に暙準化したら、次のような他の問題を解決する必芁がありたす。





これはほんの始たりに過ぎないので、アむデアがあれば参加しおください



All Articles