SlideShare a Scribd company logo
フロントからバックエンドまで
— WebAssemblyで広がる可能性
YAMAMOTO Yuji (山本悠滋)
2020-12-16 IIJ Technical WEEK 2020 DAY 3
Copyright © 2020 IIJ Innovation Institute Inc.
はじめまして!
 山本悠滋 (@igrep)
 所属: IIJ-II 技術開発室
 趣味ではHaskeller歴約8年
Copyright © 2020 IIJ Innovation Institute Inc.
私とWebAssembly
 WASIが発表されたあたり(2019年の春頃)くらいから
WebAssemblyに強い関心が
 仕様を追いかけてみたり少しフィードバックしたり
 WebAssemblyを使った新しいウェブサービスを模索中
 趣味ではWebAssemblyをArm32にコンパイルするコンパイラー
をゆっくり開発
 先週WebAssembly nightというイベントで発表しました
Copyright © 2020 IIJ Innovation Institute Inc.
📝今日話すこと
 そもそもWebAssemblyとは
 現在のWebAssemblyの活躍
 なぜ安全か
 ウェブブラウザー以外における活躍
 これからの活躍
Copyright © 2020 IIJ Innovation Institute Inc.
そもそもWebAssemblyとは
 ウェブブラウザー上でJavaScriptのように(プラグインなしで)動
作させることを目的として作られた命令セットと、そのバイナリー
フォーマット
 2017年11月、主要な4つのウェブブラウザー(Chrome・Firefox・
Safari・旧Edge)がver. 1.0をサポート
 2019年12月、W3CによりHTML・CSS・JavaScriptに続く「ウェブ
ブラウザーで動く4つめの言語」として標準化
 World Wide Web Consortium (W3C) brings a new language to the Web
as WebAssembly becomes a W3C Recommendation
Copyright © 2020 IIJ Innovation Institute Inc.
現在のWebAssemblyの活躍
 Google Meet
 FFMPEG.WASM
 Blazor WebAssembly
 Showcase | Magnum Engine
Copyright © 2020 IIJ Innovation Institute Inc.
Google Meet
Google AI Blog: Background Features in Google Meet, Powered by
Web ML
 背景ぼかし機能の実装にWebAssemblyが!
 C++で書かれたGoogle製機械学習フレームワーク MediaPipe
をWebAssemblyにコンパイルして実現
 関連: WebAssemblyでの機械学習モデルデプロイの動向
Copyright © 2020 IIJ Innovation Institute Inc.
FFMPEG.WASM
https://ffmpegwasm.github.io/
 様々なコーデックを利用して動画や音声の変換ができるCLIツー
ル ffmpeg をWebAssemblyに移植!
 動画のエンコードなどが全部ウェブブラウザー上で完結!
Copyright © 2020 IIJ Innovation Institute Inc.
Blazor WebAssembly
https://docs.microsoft.com/ja-jp/aspnet/core/blazor/hosting-
models?view=aspnetcore-5.0
 ASP.NET Core Blazor: C#・F#向けウェブアプリケーションフレ
ームワーク
 クライアントもサーバーも概ねC#で書ける
 実行モデルを切り替えれば主要な処理をサーバーで実行したり
WebAssemblyで実行したりと切り替えられる
Copyright © 2020 IIJ Innovation Institute Inc.
Showcase | Magnum Engine
https://magnum.graphics/showcase/
 「Magnum Engine」というC++向けグラフィックスエンジンのサン
プル集
Copyright © 2020 IIJ Innovation Institute Inc.
なぜ安全か
 ホストのAPIからの分離
 ホストのデータからの分離
 index空間の分離
Copyright © 2020 IIJ Innovation Institute Inc.
なぜ安全か
用語
 ホスト: ウェブブラウザーなど、WebAssemblyを動作させること
ができるプログラム
 後述のとおりブラウザー以外でもWebAssemblyを動かすプログラムがある
 index空間: 配列の添え字(index)の集合
 e.g. 長さ50の配列であれば0から49までの50個のindexの集合
 「名前空間」の「名前」を文字列から整数に置き換えたバージョン
 WAT
 「WebAssembly Text Format」の略
 WebAssemblyはバイナリーフォーマットなので直接人間が読むのは難しい
ため、テキストファイルとして読めるよう翻訳したもの
 「普通の機械語」に対する「アセンブリー」と同じ役割
Copyright © 2020 IIJ Innovation Institute Inc.
ホストのデータからの分離
WebAssemblyでは
 原則: ホストのメモリーには勝手にアクセスできない!
 ホストとデータをやりとりしたくなったら
 Memoryオブジェクトが表す、割り当てられた専用の領域を使う
 ホスト側でサイズを指定して作って、WebAssemblyを呼ぶときに渡す
Copyright © 2020 IIJ Innovation Institute Inc.
ホストのデータからの分離
コード例 (WAT):
この行でMemoryをimportする必要が
あることを明示
Copyright © 2020 IIJ Innovation Institute Inc.
ホストのデータからの分離
コード例 (Node.js):
ここでMemoryを作って
ここでimport
ここで書き込み
出力: 7
Copyright © 2020 IIJ Innovation Institute Inc.
ホストのAPIからの分離
普通の機械語では
 リンクした関数やOSのシステムコールは原則どのモジュールも
呼べちゃう!
 あなたがダウンロードした悪質なプログラムが、意図しない関数
を呼ぶかも知れない!
※アセンブリーの内容に特に意味はありません
Copyright © 2020 IIJ Innovation Institute Inc.
ホストのAPIからの分離
WebAssemblyでは
 明示的にimportした外部の関数しか呼べない!
 何も明示しない限りは何もできない
 ※もう一つ、間接呼び出しを実現するためのTableという機能が
ありますが割愛
ここでimportした関数しか呼べない!
Copyright © 2020 IIJ Innovation Institute Inc.
index空間の分離
普通の機械語では
 概ねどこにでもジャン
プ(goto)できるように
作られている
 ※CPUによって細かい
制約はありますが
 😈プログラムに脆弱性
があると、攻撃者によ
ってジャンプ先を意図
しないアドレスに書き
換えられてしまう
※アセンブリーの内容に特に意味はありません
Copyright © 2020 IIJ Innovation Institute Inc.
index空間の分離
WebAssemblyでは
 関数呼び出しやブロッ
クを抜け出したいとき
に使う命令毎に「
index空間」が分かれ
ている
 図における(call
0)の0と(br 0)の0
は完全に別の配列へ
のindexとして解釈さ
れる
Copyright © 2020 IIJ Innovation Institute Inc.
index空間の分離
関数呼び出し命令callの場合
 callの引数に渡せるのは、関数専用のindexだけ!
 (func …)で定義した関数の他importした関数が含まれる
 関数専用のindex空間が区切られている
Copyright © 2020 IIJ Innovation Institute Inc.
index空間の分離
ブロックから抜け出す命令brの場合
 brに渡せるのは、brを囲っているブロックのうち、「内側から何
番目のブロックから抜け出すか」を表すindexのみ指定できる
 図ではbrしている箇所で3つのblockに囲われているので0, 1, 2のい
ずれか
Copyright © 2020 IIJ Innovation Institute Inc.
ウェブブラウザー以外における活躍
 PostgreSQL
 Envoy Proxy
 Krustlet
 WASI
Copyright © 2020 IIJ Innovation Institute Inc.
PostgreSQL
Announcing the first Postgres extension to run WebAssembly
 PostgreSQLのSQLからWebAssemblyで定義した関数が呼べ
る!
Copyright © 2020 IIJ Innovation Institute Inc.
Envoy Proxy
Istio / Redefining extensibility in proxies - introducing
WebAssembly to Envoy and Istio
 Microservice向けのプロキシサーバー
 「独自の認証・認可機構を使いたい」・「標準でサポートされてないプロトコル
を扱いたい」といったケースのために、拡張機能が
 従来:
 C++で拡張を書いて静的リンク
 => 速いけどリビルドが必要で気軽じゃない
 Mixerというアダプターにprotobufでメッセージを送る
 => 気軽だけど遅い
 WebAssemblyなら
 デプロイも簡単で動作も速い
 いろいろな言語をサポートできる
 一般化するために仕様も策定中:
 https://github.com/proxy-wasm
Copyright © 2020 IIJ Innovation Institute Inc.
Krustlet
What is Krustlet?
 KubernetesのノードとしてのWebAssembly処理系wasmtimeを
動かす
 Dockerのimageの代わりに、WebAssemblyのモジュールをとっ
てきてKubernetesクラスターにデプロイできる
Copyright © 2020 IIJ Innovation Institute Inc.
WASI
WASI: WebAssembly System Interface
 WebAssemblyがPOSIX風のAPIを利用できるようにするための
標準仕様
 importしない限りprintfとかopenとかが使えない!
 => importする関数の名前や型を決めましょう!
 WebAssemblyがアクセスできるファイル・ディレクトリーを制限す
る機能を提供することで、セキュリティーを保つ
 importしないとホストのAPIを利用できないのと同様に、ファイル・ディレク
トリーにもホストが明示的な許可を与える仕組みを
Copyright © 2020 IIJ Innovation Institute Inc.
これからの活躍
 Docker v.s. WebAssembly
 Shopify
 Flash Playerの移植
 まだまだパーツが足りない
 WASIのさらなる発展
 他の言語処理系を埋め込みやすく
 ホストとの連携を強める
Copyright © 2020 IIJ Innovation Institute Inc.
Docker v.s. WebAssembly
DockerのCo-founder, Solomon HykesさんのTwitterでの発言
 「2008年にWebAssemblyとWASIがあれば、Dockerを作る必要
はなかっただろう」
 Krustletのような仕組みが発達すれば、コンテナーの代わりに
WebAssemblyという時代が来る?
Copyright © 2020 IIJ Innovation Institute Inc.
Shopify
Making Commerce Extensible with WebAssembly, Mitch Dickinson
- YouTube
 テナントのいろいろな要求をテナント側のコードで実現するため
に、Shopifyのサーバーで動くWebAssemblyによるプラグイン機
構を構築中
 Web APIで実現するよりも高速!
Copyright © 2020 IIJ Innovation Institute Inc.
Flash Playerの移植
ruffle-rs/ruffle: A Flash Player emulator written in Rust
 2020年末(もうすぐ!)サポートが終了するFlash Player
 Flashの資産をなくさないためWebAssemblyでエミュレート!
 WebAssemblyでできること以上のことはできないので、あらゆる
Flashが動くわけではないはず
 危険なFlashが動く可能性がその分低いということ!
Copyright © 2020 IIJ Innovation Institute Inc.
まだまだパーツが足りない
 「活躍」とはいったものの、実験的なものが大半で、広く使われる
には至っていない
 CやC++, Rustなど以外の言語を動かすとWebAssemblyのサイ
ズが膨らんでしまったり、
 ホストとWebAssembly間のデータの受け渡しが煩雑だったり、
など多くの問題が
Copyright © 2020 IIJ Innovation Institute Inc.
WASIのさらなる発展
 現状はファイルシステムや乱数、環境変数やコマンドライン引数
の処理が中心
 ソケットに接続したり、リッスンするAPIは策定中!
 feat(socket): berkeley socket API by 3miliano ꞏ Pull Request #312 ꞏ
WebAssembly/WASI
Copyright © 2020 IIJ Innovation Institute Inc.
他の言語処理系を埋め込みやすくする
 Exception
 Exception handling
 例外のcatch/throw
 GC
 GC Extension
 ガーベージコレクター。多くのプログラミング言語における縁の下の力持ち
 これらの機能が追加されることで、これらの機能が必要な言語を
WebAssemblyにし安く!
Copyright © 2020 IIJ Innovation Institute Inc.
ホストとの連携を強める: reference-types
WebAssembly Reference Types in Wasmtime
 externrefという「演算はできないポインターのようなもの」を表
す特殊な型が追加
 e.g. ウェブページにおけるElementへの参照
 importしたホストのAPIをWebAssemblyでラップできるように!
 FirefoxやWasmtimeが実装済み!
Copyright © 2020 IIJ Innovation Institute Inc.
ホストとの連携を強める: interface types
Interface Types Proposal
 WebAssemblyは整数や浮動小数点数(と、前述のexternref)しか
扱えない
 例えば文字列を扱おうと思ったら、一旦Memoryに書き込んだあと、アドレス
を整数として渡す必要が
 => 面倒なボイラープレートに!
 型宣言と、型の値を相互変換する際の仕様を標準化!
 => WebAssembly製の関数があたかも文字列などを直接扱えるかのように
見せるラッパーを提供
Copyright © 2020 IIJ Innovation Institute Inc.
まとめ
 WebAssemblyは、ウェブブラウザーだけでなく、様々な種類の
アプリケーションにおける拡張機構としての役割が期待されてい
る
 脆弱なWebAssemblyを実行してもユーザーに悪影響がないよう
に、工夫が凝らされた仕様となっている
 まだまだ足りない機能がたくさんあるので、更なる追加機能が検
討されている
 もっと多くのプログラミング言語をWebAssemblyで実装しやすくなって、
 もっと簡単にホストと連携できるようになりそう
Copyright © 2020 IIJ Innovation Institute Inc.
参考(言及していないもののみ)
 C#でSPAが実現できる、Blazor WebAssemblyのはじめかた
(1/3):CodeZine(コードジン)
 Istioldie 1.6 / Mixer Configuration Model (Deprecated)
 Istioldie 1.6 / Mixer Adapter Model
 Proxy-Wasm: Wasmを利用したPlugin機構の開発
 Control Flow Integrity (CFI) | Karamba Security
 たのしいバイナリの歩き方
 Security - WebAssembly
 Memory in WebAssembly (and why it’s safer than you think)
- Mozilla Hacks - the Web developer blog
 krustlet/architecture.md at master ꞏ deislabs/krustlet
 Bytecode Alliance

More Related Content

PPTX
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
PPTX
Redis勉強会資料(2015/06 update)
PDF
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
PDF
Infrastructure as Code (IaC) 談義 2022
PDF
WebAssemblyのWeb以外のことぜんぶ話す
PDF
AWS X-Rayによるアプリケーションの分析とデバッグ
PPTX
[社内勉強会]ELBとALBと数万スパイク負荷テスト
PDF
Swaggerで始めるモデルファーストなAPI開発
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
Redis勉強会資料(2015/06 update)
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
Infrastructure as Code (IaC) 談義 2022
WebAssemblyのWeb以外のことぜんぶ話す
AWS X-Rayによるアプリケーションの分析とデバッグ
[社内勉強会]ELBとALBと数万スパイク負荷テスト
Swaggerで始めるモデルファーストなAPI開発

What's hot (20)

PPTX
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
PDF
Babelfish Compatibility
PDF
ドメイン駆動設計の正しい歩き方
PDF
AWS BlackBelt AWS上でのDDoS対策
PDF
実環境にTerraform導入したら驚いた
PDF
WebブラウザでC#実行 WebAssemblyの技術
PPTX
Spring Boot ユーザの方のための Quarkus 入門
PDF
シリコンバレーの「何が」凄いのか
PPTX
ぱぱっと理解するSpring Cloudの基本
PDF
文字コードに起因する脆弱性とその対策(増補版)
PDF
いまさら聞けないパスワードの取り扱い方
PDF
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
PDF
Pythonによる黒魔術入門
PDF
Rest ful api設計入門
PDF
AWS Black Belt Techシリーズ Amazon Kinesis
PDF
SQL大量発行処理をいかにして高速化するか
PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
PDF
AWS Black Belt Online Seminar Amazon Aurora
PDF
nginx入門
PDF
EC2のストレージどう使う? -Instance Storageを理解して高速IOを上手に活用!-
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
Babelfish Compatibility
ドメイン駆動設計の正しい歩き方
AWS BlackBelt AWS上でのDDoS対策
実環境にTerraform導入したら驚いた
WebブラウザでC#実行 WebAssemblyの技術
Spring Boot ユーザの方のための Quarkus 入門
シリコンバレーの「何が」凄いのか
ぱぱっと理解するSpring Cloudの基本
文字コードに起因する脆弱性とその対策(増補版)
いまさら聞けないパスワードの取り扱い方
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
Pythonによる黒魔術入門
Rest ful api設計入門
AWS Black Belt Techシリーズ Amazon Kinesis
SQL大量発行処理をいかにして高速化するか
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
AWS Black Belt Online Seminar Amazon Aurora
nginx入門
EC2のストレージどう使う? -Instance Storageを理解して高速IOを上手に活用!-
Ad

Similar to フロントからバックエンドまで - WebAssemblyで広がる可能性 (20)

PPTX
Domino Voltアプリケーションを作成してみたよ!
PDF
Watsonを使ってAIアプリを作ってみよう!-ハンズオン-
PDF
【大阪】Bluemix勉強会 - Watson ハンズオン -
PDF
【C-2】スマホアプリの開発は、エンタメとエンプラでどこまで違う?
PPTX
【HackerWars 】ニフティクラウドmobile backend
PDF
Realm platform2019
PDF
イノベート・ハブ九州 Bluemix勉強会(第2回)
PDF
Web担当者Forumミーティング2013 Autumn 「マルチデバイス、HTML5がとりまくWebサイト制作とCMSの現在」
PPTX
オレ流クラウドデザイン
PDF
Smarthome dev overview
PDF
C#でのクロスプラットフォーム モバイル開発環境 Xamarin のご紹介
PDF
AWSとReactで始めるShopifyアプリ開発
PDF
Decode19 cd42 fixer_public_0601
PDF
Decode19 cd42 fixer_public_0601
PDF
マルチデバイスへ広がる最新動画配信とビジネス現場への活かし方
PPTX
【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -
PPTX
Php on windows vol.2 - session.1 - 公開用
PDF
C# を使い倒す!クロス プラットフォーム アプリ開発とクラウド連携の新潮流 - Xamarin セッション
PDF
Spring Boot × Vue.jsでSPAを作る
PDF
KDDIにおけるAWS×アジャイル開発
Domino Voltアプリケーションを作成してみたよ!
Watsonを使ってAIアプリを作ってみよう!-ハンズオン-
【大阪】Bluemix勉強会 - Watson ハンズオン -
【C-2】スマホアプリの開発は、エンタメとエンプラでどこまで違う?
【HackerWars 】ニフティクラウドmobile backend
Realm platform2019
イノベート・ハブ九州 Bluemix勉強会(第2回)
Web担当者Forumミーティング2013 Autumn 「マルチデバイス、HTML5がとりまくWebサイト制作とCMSの現在」
オレ流クラウドデザイン
Smarthome dev overview
C#でのクロスプラットフォーム モバイル開発環境 Xamarin のご紹介
AWSとReactで始めるShopifyアプリ開発
Decode19 cd42 fixer_public_0601
Decode19 cd42 fixer_public_0601
マルチデバイスへ広がる最新動画配信とビジネス現場への活かし方
【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -
Php on windows vol.2 - session.1 - 公開用
C# を使い倒す!クロス プラットフォーム アプリ開発とクラウド連携の新潮流 - Xamarin セッション
Spring Boot × Vue.jsでSPAを作る
KDDIにおけるAWS×アジャイル開発
Ad

More from IIJ (20)

PDF
プロダクトオーナーと開発者が別会社・別組織でも前のめりなチームを生み出す取り組み事例
 
PDF
IIJ_デジタルワークプレース事業紹介資料
 
PDF
監視 Overview
 
PDF
HTTPを理解する
 
PDF
DevOps Overview
 
PDF
ただいま三河。あれから1年、チームNOCKncokが開発しないスクラムで成果を出した経験から得た学び
 
PDF
上っ面スクラムチームにならないために気を付けたいこと
 
PDF
Super Easy Memory Forensics
 
PDF
チームみを大切にした 私たちの“受託アジャイル・スクラム”体験談
 
PDF
【解説】IKE(IIJ Kubernetes Engine):= Vanilla Kubernetes + 何?
 
PDF
コロナ禍での白井データセンターキャンパスの運用施策
 
PDF
コロナ禍の開発勉強会~社内教育ツールの開発と実装
 
PDF
セキュリティ動向2020
 
PDF
バックボーン運用から見るインターネットの実情
 
PDF
データセンターのエネルギーコントロールの仕組み
 
PDF
世界のインターネット事情
 
PDF
あ! やせいのEmotetがあらわれた! ~ IIJ C-SOCサービスの分析ルールについて~
 
PDF
インシデント調査システムが内製すぎる件~CHAGEのご紹介~
 
PDF
IIJ Technical DAY 2019 ~ IIJのサーバインフラはここまでやっています
 
PDF
IIJ Technical DAY 2019 ~ セキュリティ動向2019
 
プロダクトオーナーと開発者が別会社・別組織でも前のめりなチームを生み出す取り組み事例
 
IIJ_デジタルワークプレース事業紹介資料
 
監視 Overview
 
HTTPを理解する
 
DevOps Overview
 
ただいま三河。あれから1年、チームNOCKncokが開発しないスクラムで成果を出した経験から得た学び
 
上っ面スクラムチームにならないために気を付けたいこと
 
Super Easy Memory Forensics
 
チームみを大切にした 私たちの“受託アジャイル・スクラム”体験談
 
【解説】IKE(IIJ Kubernetes Engine):= Vanilla Kubernetes + 何?
 
コロナ禍での白井データセンターキャンパスの運用施策
 
コロナ禍の開発勉強会~社内教育ツールの開発と実装
 
セキュリティ動向2020
 
バックボーン運用から見るインターネットの実情
 
データセンターのエネルギーコントロールの仕組み
 
世界のインターネット事情
 
あ! やせいのEmotetがあらわれた! ~ IIJ C-SOCサービスの分析ルールについて~
 
インシデント調査システムが内製すぎる件~CHAGEのご紹介~
 
IIJ Technical DAY 2019 ~ IIJのサーバインフラはここまでやっています
 
IIJ Technical DAY 2019 ~ セキュリティ動向2019
 

フロントからバックエンドまで - WebAssemblyで広がる可能性

  • 2. Copyright © 2020 IIJ Innovation Institute Inc. はじめまして!  山本悠滋 (@igrep)  所属: IIJ-II 技術開発室  趣味ではHaskeller歴約8年
  • 3. Copyright © 2020 IIJ Innovation Institute Inc. 私とWebAssembly  WASIが発表されたあたり(2019年の春頃)くらいから WebAssemblyに強い関心が  仕様を追いかけてみたり少しフィードバックしたり  WebAssemblyを使った新しいウェブサービスを模索中  趣味ではWebAssemblyをArm32にコンパイルするコンパイラー をゆっくり開発  先週WebAssembly nightというイベントで発表しました
  • 4. Copyright © 2020 IIJ Innovation Institute Inc. 📝今日話すこと  そもそもWebAssemblyとは  現在のWebAssemblyの活躍  なぜ安全か  ウェブブラウザー以外における活躍  これからの活躍
  • 5. Copyright © 2020 IIJ Innovation Institute Inc. そもそもWebAssemblyとは  ウェブブラウザー上でJavaScriptのように(プラグインなしで)動 作させることを目的として作られた命令セットと、そのバイナリー フォーマット  2017年11月、主要な4つのウェブブラウザー(Chrome・Firefox・ Safari・旧Edge)がver. 1.0をサポート  2019年12月、W3CによりHTML・CSS・JavaScriptに続く「ウェブ ブラウザーで動く4つめの言語」として標準化  World Wide Web Consortium (W3C) brings a new language to the Web as WebAssembly becomes a W3C Recommendation
  • 6. Copyright © 2020 IIJ Innovation Institute Inc. 現在のWebAssemblyの活躍  Google Meet  FFMPEG.WASM  Blazor WebAssembly  Showcase | Magnum Engine
  • 7. Copyright © 2020 IIJ Innovation Institute Inc. Google Meet Google AI Blog: Background Features in Google Meet, Powered by Web ML  背景ぼかし機能の実装にWebAssemblyが!  C++で書かれたGoogle製機械学習フレームワーク MediaPipe をWebAssemblyにコンパイルして実現  関連: WebAssemblyでの機械学習モデルデプロイの動向
  • 8. Copyright © 2020 IIJ Innovation Institute Inc. FFMPEG.WASM https://ffmpegwasm.github.io/  様々なコーデックを利用して動画や音声の変換ができるCLIツー ル ffmpeg をWebAssemblyに移植!  動画のエンコードなどが全部ウェブブラウザー上で完結!
  • 9. Copyright © 2020 IIJ Innovation Institute Inc. Blazor WebAssembly https://docs.microsoft.com/ja-jp/aspnet/core/blazor/hosting- models?view=aspnetcore-5.0  ASP.NET Core Blazor: C#・F#向けウェブアプリケーションフレ ームワーク  クライアントもサーバーも概ねC#で書ける  実行モデルを切り替えれば主要な処理をサーバーで実行したり WebAssemblyで実行したりと切り替えられる
  • 10. Copyright © 2020 IIJ Innovation Institute Inc. Showcase | Magnum Engine https://magnum.graphics/showcase/  「Magnum Engine」というC++向けグラフィックスエンジンのサン プル集
  • 11. Copyright © 2020 IIJ Innovation Institute Inc. なぜ安全か  ホストのAPIからの分離  ホストのデータからの分離  index空間の分離
  • 12. Copyright © 2020 IIJ Innovation Institute Inc. なぜ安全か 用語  ホスト: ウェブブラウザーなど、WebAssemblyを動作させること ができるプログラム  後述のとおりブラウザー以外でもWebAssemblyを動かすプログラムがある  index空間: 配列の添え字(index)の集合  e.g. 長さ50の配列であれば0から49までの50個のindexの集合  「名前空間」の「名前」を文字列から整数に置き換えたバージョン  WAT  「WebAssembly Text Format」の略  WebAssemblyはバイナリーフォーマットなので直接人間が読むのは難しい ため、テキストファイルとして読めるよう翻訳したもの  「普通の機械語」に対する「アセンブリー」と同じ役割
  • 13. Copyright © 2020 IIJ Innovation Institute Inc. ホストのデータからの分離 WebAssemblyでは  原則: ホストのメモリーには勝手にアクセスできない!  ホストとデータをやりとりしたくなったら  Memoryオブジェクトが表す、割り当てられた専用の領域を使う  ホスト側でサイズを指定して作って、WebAssemblyを呼ぶときに渡す
  • 14. Copyright © 2020 IIJ Innovation Institute Inc. ホストのデータからの分離 コード例 (WAT): この行でMemoryをimportする必要が あることを明示
  • 15. Copyright © 2020 IIJ Innovation Institute Inc. ホストのデータからの分離 コード例 (Node.js): ここでMemoryを作って ここでimport ここで書き込み 出力: 7
  • 16. Copyright © 2020 IIJ Innovation Institute Inc. ホストのAPIからの分離 普通の機械語では  リンクした関数やOSのシステムコールは原則どのモジュールも 呼べちゃう!  あなたがダウンロードした悪質なプログラムが、意図しない関数 を呼ぶかも知れない! ※アセンブリーの内容に特に意味はありません
  • 17. Copyright © 2020 IIJ Innovation Institute Inc. ホストのAPIからの分離 WebAssemblyでは  明示的にimportした外部の関数しか呼べない!  何も明示しない限りは何もできない  ※もう一つ、間接呼び出しを実現するためのTableという機能が ありますが割愛 ここでimportした関数しか呼べない!
  • 18. Copyright © 2020 IIJ Innovation Institute Inc. index空間の分離 普通の機械語では  概ねどこにでもジャン プ(goto)できるように 作られている  ※CPUによって細かい 制約はありますが  😈プログラムに脆弱性 があると、攻撃者によ ってジャンプ先を意図 しないアドレスに書き 換えられてしまう ※アセンブリーの内容に特に意味はありません
  • 19. Copyright © 2020 IIJ Innovation Institute Inc. index空間の分離 WebAssemblyでは  関数呼び出しやブロッ クを抜け出したいとき に使う命令毎に「 index空間」が分かれ ている  図における(call 0)の0と(br 0)の0 は完全に別の配列へ のindexとして解釈さ れる
  • 20. Copyright © 2020 IIJ Innovation Institute Inc. index空間の分離 関数呼び出し命令callの場合  callの引数に渡せるのは、関数専用のindexだけ!  (func …)で定義した関数の他importした関数が含まれる  関数専用のindex空間が区切られている
  • 21. Copyright © 2020 IIJ Innovation Institute Inc. index空間の分離 ブロックから抜け出す命令brの場合  brに渡せるのは、brを囲っているブロックのうち、「内側から何 番目のブロックから抜け出すか」を表すindexのみ指定できる  図ではbrしている箇所で3つのblockに囲われているので0, 1, 2のい ずれか
  • 22. Copyright © 2020 IIJ Innovation Institute Inc. ウェブブラウザー以外における活躍  PostgreSQL  Envoy Proxy  Krustlet  WASI
  • 23. Copyright © 2020 IIJ Innovation Institute Inc. PostgreSQL Announcing the first Postgres extension to run WebAssembly  PostgreSQLのSQLからWebAssemblyで定義した関数が呼べ る!
  • 24. Copyright © 2020 IIJ Innovation Institute Inc. Envoy Proxy Istio / Redefining extensibility in proxies - introducing WebAssembly to Envoy and Istio  Microservice向けのプロキシサーバー  「独自の認証・認可機構を使いたい」・「標準でサポートされてないプロトコル を扱いたい」といったケースのために、拡張機能が  従来:  C++で拡張を書いて静的リンク  => 速いけどリビルドが必要で気軽じゃない  Mixerというアダプターにprotobufでメッセージを送る  => 気軽だけど遅い  WebAssemblyなら  デプロイも簡単で動作も速い  いろいろな言語をサポートできる  一般化するために仕様も策定中:  https://github.com/proxy-wasm
  • 25. Copyright © 2020 IIJ Innovation Institute Inc. Krustlet What is Krustlet?  KubernetesのノードとしてのWebAssembly処理系wasmtimeを 動かす  Dockerのimageの代わりに、WebAssemblyのモジュールをとっ てきてKubernetesクラスターにデプロイできる
  • 26. Copyright © 2020 IIJ Innovation Institute Inc. WASI WASI: WebAssembly System Interface  WebAssemblyがPOSIX風のAPIを利用できるようにするための 標準仕様  importしない限りprintfとかopenとかが使えない!  => importする関数の名前や型を決めましょう!  WebAssemblyがアクセスできるファイル・ディレクトリーを制限す る機能を提供することで、セキュリティーを保つ  importしないとホストのAPIを利用できないのと同様に、ファイル・ディレク トリーにもホストが明示的な許可を与える仕組みを
  • 27. Copyright © 2020 IIJ Innovation Institute Inc. これからの活躍  Docker v.s. WebAssembly  Shopify  Flash Playerの移植  まだまだパーツが足りない  WASIのさらなる発展  他の言語処理系を埋め込みやすく  ホストとの連携を強める
  • 28. Copyright © 2020 IIJ Innovation Institute Inc. Docker v.s. WebAssembly DockerのCo-founder, Solomon HykesさんのTwitterでの発言  「2008年にWebAssemblyとWASIがあれば、Dockerを作る必要 はなかっただろう」  Krustletのような仕組みが発達すれば、コンテナーの代わりに WebAssemblyという時代が来る?
  • 29. Copyright © 2020 IIJ Innovation Institute Inc. Shopify Making Commerce Extensible with WebAssembly, Mitch Dickinson - YouTube  テナントのいろいろな要求をテナント側のコードで実現するため に、Shopifyのサーバーで動くWebAssemblyによるプラグイン機 構を構築中  Web APIで実現するよりも高速!
  • 30. Copyright © 2020 IIJ Innovation Institute Inc. Flash Playerの移植 ruffle-rs/ruffle: A Flash Player emulator written in Rust  2020年末(もうすぐ!)サポートが終了するFlash Player  Flashの資産をなくさないためWebAssemblyでエミュレート!  WebAssemblyでできること以上のことはできないので、あらゆる Flashが動くわけではないはず  危険なFlashが動く可能性がその分低いということ!
  • 31. Copyright © 2020 IIJ Innovation Institute Inc. まだまだパーツが足りない  「活躍」とはいったものの、実験的なものが大半で、広く使われる には至っていない  CやC++, Rustなど以外の言語を動かすとWebAssemblyのサイ ズが膨らんでしまったり、  ホストとWebAssembly間のデータの受け渡しが煩雑だったり、 など多くの問題が
  • 32. Copyright © 2020 IIJ Innovation Institute Inc. WASIのさらなる発展  現状はファイルシステムや乱数、環境変数やコマンドライン引数 の処理が中心  ソケットに接続したり、リッスンするAPIは策定中!  feat(socket): berkeley socket API by 3miliano ꞏ Pull Request #312 ꞏ WebAssembly/WASI
  • 33. Copyright © 2020 IIJ Innovation Institute Inc. 他の言語処理系を埋め込みやすくする  Exception  Exception handling  例外のcatch/throw  GC  GC Extension  ガーベージコレクター。多くのプログラミング言語における縁の下の力持ち  これらの機能が追加されることで、これらの機能が必要な言語を WebAssemblyにし安く!
  • 34. Copyright © 2020 IIJ Innovation Institute Inc. ホストとの連携を強める: reference-types WebAssembly Reference Types in Wasmtime  externrefという「演算はできないポインターのようなもの」を表 す特殊な型が追加  e.g. ウェブページにおけるElementへの参照  importしたホストのAPIをWebAssemblyでラップできるように!  FirefoxやWasmtimeが実装済み!
  • 35. Copyright © 2020 IIJ Innovation Institute Inc. ホストとの連携を強める: interface types Interface Types Proposal  WebAssemblyは整数や浮動小数点数(と、前述のexternref)しか 扱えない  例えば文字列を扱おうと思ったら、一旦Memoryに書き込んだあと、アドレス を整数として渡す必要が  => 面倒なボイラープレートに!  型宣言と、型の値を相互変換する際の仕様を標準化!  => WebAssembly製の関数があたかも文字列などを直接扱えるかのように 見せるラッパーを提供
  • 36. Copyright © 2020 IIJ Innovation Institute Inc. まとめ  WebAssemblyは、ウェブブラウザーだけでなく、様々な種類の アプリケーションにおける拡張機構としての役割が期待されてい る  脆弱なWebAssemblyを実行してもユーザーに悪影響がないよう に、工夫が凝らされた仕様となっている  まだまだ足りない機能がたくさんあるので、更なる追加機能が検 討されている  もっと多くのプログラミング言語をWebAssemblyで実装しやすくなって、  もっと簡単にホストと連携できるようになりそう
  • 37. Copyright © 2020 IIJ Innovation Institute Inc. 参考(言及していないもののみ)  C#でSPAが実現できる、Blazor WebAssemblyのはじめかた (1/3):CodeZine(コードジン)  Istioldie 1.6 / Mixer Configuration Model (Deprecated)  Istioldie 1.6 / Mixer Adapter Model  Proxy-Wasm: Wasmを利用したPlugin機構の開発  Control Flow Integrity (CFI) | Karamba Security  たのしいバイナリの歩き方  Security - WebAssembly  Memory in WebAssembly (and why it’s safer than you think) - Mozilla Hacks - the Web developer blog  krustlet/architecture.md at master ꞏ deislabs/krustlet  Bytecode Alliance