世界を動かす技術を、日本語で。

ブラウザはサンドボックスである

概要

  • Paul Kinlan によるブラウザサンドボックスの研究
  • ブラウザが 安全なエージェント実行環境 として機能する可能性
  • Co-doデモ で実証された主要技術
  • ファイルシステム、ネットワーク、コード実行の3要素の解説
  • <input type="file" webkitdirectory> の新知見

ブラウザはサンドボックス

  • Paul Kinlan はGoogleのWeb Platform Developer Advocate
  • 近年は エージェントのコーディング に注目
  • ブラウザは 過去30年で最強のサンドボックス として進化
  • 世界中の 不特定多数のコード を即時実行可能な設計
  • Coworkのようなアプリを ブラウザで再現可能か の検証

Co-doデモの紹介

  • Co-do はCoworkのブラウザ版を目指すデモ
  • ユーザーが フォルダ選択、LLMプロバイダー設定、APIキー入力で利用開始
  • CSP承認API でプロバイダーと通信
  • ファイル操作用の チャットインターフェース を提供
  • ローカルコンテナ不要 で軽量な動作

サンドボックスの3要素とブラウザ技術

  • ファイルシステム: File System Access API(現時点ではChrome限定)

  • ネットワークアクセス: CSPヘッダーと<iframe sandbox>で制御

  • 安全なコード実行: Web Workers内のWebAssembly利用

    • <iframe sandbox> のドキュメント不足と互換性の課題
    • Paulの投稿で ダブルiframe技法 による詳細なネットワーク制御方法を解説

新しいファイルアクセス技術

  • <input type="file" webkitdirectory> タグの活用
    • Firefox、Safari、Chromeで動作確認済み
    • ブラウザから ディレクトリ単位で読み取り専用アクセス を実現
    • 今後のプロジェクトでの応用可能性

まとめ

  • ブラウザのサンドボックス機能 はエージェント実行環境として有望
  • Coworkのような複雑なアプリも ローカル環境不要で実現可能
  • 今後の Webアプリ開発 への多大な影響

Hackerたちの意見

フォルダ入力のやつ、最初に見たときはびっくりしたよ。何年もウェブアプリを作ってきたのに、webkitdirectory属性を見逃してた。これを考えると、成熟度の議論が一番興味深いね。ブラウザのサンドボックスは、何十年も怪しいリンクをクリックしてきた数十億人のユーザーによってテストされてきたからね。それに比べて、信頼できないコードを実行するたびに新しいコンテナを立ち上げるのは大変だよね。もちろん、トレードオフは明らかで、ブラウザができることに制限される。システムコールもできないし、任意のバイナリも使えないし、ハードウェアに直接アクセスすることもできない。多くのAIコーディングタスクにはそれで問題ないけど、他のタスクには致命的な欠点になることもある。実際のセキュリティの面積をベンチマークしてる人が見てみたいな。「ブラウザは安全」ってのは実際には正しいけど、最小限のコンテナと比べると攻撃面は膨大だよ。

これは、元のファイルを操作する必要がないエージェント的なフローでアプリを作る方法だと思ってる。要約したり、質問に答えたり、新しいドキュメントを生成したりする場合、ローカルまたは内部のLLMを使って、ツール呼び出しが制限されてるときに比較的安全に感じられるよ。

この枠組みで最も魅力的だと思うのは成熟度の議論だね。ブラウザのサンドボックスは、数十年にわたって怪しいリンクをクリックしてきた数十億のユーザーによってテストされてきたから[…] システムコールも、任意のバイナリも、直接のハードウェアアクセスもない。だから、NPMのプログラマーは、NodeJSの非標準(時々壊れる)APIに直接対抗するコマンドラインユーティリティを書くんじゃなくて、ブラウザのサンドボックスで動けるソースコードプロセッサ(や他のバッチ処理ツール)を書くべきだと思う。

それがないとは言わないよ。GoogleがNaClを開発した理由があって、それがWebAssemblyを究極のサンドボックス標準にするインスピレーションになったんだ。しかも、DOM、JS、CSSもレンダリング標準のサンドボックスとして機能してるし、能力ベースのデザインは多くのブラウザで見られるよ、Netscape Navigatorから始まってね。機能を制限して統一された体験を提供するのがブラウザの役割だから、パフォーマンスに関係なくね。もちろん、プラットフォーム特有のものを導入してこれを壊そうとしたベンダーもいるけど、それがIEや後のEdge(非Chrome)がひどい目に遭った理由でもあるよ。ただ、Adobe FlashやActiveX、Java Applet、Silverlightのような外部サンドボックスの脱出もあるけど、これらはどれもひどいものだけど、別のサンドボックスでもあるんだよね…でも、asm.jsや後のWebAssemblyの安定化によって、そういうのはすっかり消えちゃった。余談だけど、Flashのスクリプト言語であるActionScriptも、後のJava、あ、ECMAScriptの世代デザインに直接関係してるし、TypeScriptにもね。

どれもひどいものだけど、Silverlightは良かったな、廃止されたのが残念。

余談だけど、Flashのスクリプト言語であるActionScriptは、後のJava、あ、ECMAScriptの世代デザインに直接関わってるし、TypeScriptにも影響を与えてるんだよね。俺だけがActionScript、特にAS3をめっちゃ好きだった気がする。昔、AS3を使って動画アグリゲーター(chime.tv[1])を作ったんだけど、すごく楽しかったな。

JavaはActionScriptとは関係ないよ。LiveScriptはSun/Netscapeのビジネス契約のおかげでJavaScriptになったんだ。

systemdやLinuxのユーザー権限/グループがサンドボックスの議論に出てこないのが面白いと思った。どちらもかなり堅牢で、カスタマイズの幅も広いし、性質上、コストも低いんだよね。

これは、人々がDockerfileを書くこと以上のことを知っていると仮定しているけど、実際にはまだ珍しいよね。

だって、それは実際にUNIXのユーザー権限/グループで、何がうまくいくか、何がダメかの長い歴史があるからじゃない?

cgroupsは、dockerやpodmanを実装するために使われているものの一部だよ。

Unixの権限は、(マルチユーザー)システムがユーザーから自分を守るために書かれたものなんだ。すべてのプログラムはユーザーと同じ権限で動いてたから、プログラムがユーザーが思ってることをしないかもしれないっていうセキュリティの考慮はなかったんだよね。だから、クラシックなUnixツールのリストには、プログラムをサンドボックス化するようなものは何もなかった。そんなのは問題にならなかったから。だけど今は…それじゃ不十分なんだ。今日求められてるのは、ソフトウェア同士が互いに保護されて動くこと。しばらくの間、Unixの権限を使って(アプリごとに1ユーザー)やろうとしたけど、全然うまくいかなかった。ユーザー権限モデルじゃなくて、能力モデルが必要なんだ。まあ、このスレッドの他のところでもリンクしたけど、このコメントではこっちの方が合ってると思う。https://xkcd.com/1200/

Linuxカーネルはローカル特権昇格の脆弱性だらけなんだ。このアプローチは、単に制限したい信頼できるソフトウェアには有効だけど、悪意のあるソフトウェアには効かない。

同意!systemd nspawnは実際かなりすごいけど、あんまり使ってる人はいないよね。

エージェントが動作するための堅牢なサンドボックスについて、単純にエージェント用に別のコンピュータを用意することを提案したい。なんでこんなに複雑にする必要があるのか分からない。ナノEC2インスタンスは月5ドルくらいだし、今の私たちの多くは仮想化に頼らずにオンプレミスでこれを実現できると思う。

EC2インスタンスは大きなサーバー内のサンドボックスだから、問題を再定義してるわけじゃないよね。

信じられないな。特定のユースケースにはすごく役立つかもしれないけど、デスクトップオートメーションの流行や「料理のためのClaude」みたいなものが続く中で、ライブビジネスアプリケーションのコンピューティングモデルは、メンテナンス性、監査性、セキュリティ、データアクセスなどの観点から、クラウド中心になってしまってる。だから、ほとんどの「本物」のアプリにとってローカルで動かすのは…ちょっと無意味になってる。個人の生産性の可能性にはワクワクしてるけど、これが解決策だとは思わない。もしそうなら、AppleScriptやCOM、DDE(覚えてる?)を使って、主流のデスクトップOSでちゃんとしたデスクトップオートメーションができなくなってないはずだ。

COMはほぼ生きてるよ。Windows Vista以降の新しいWindows APIの主な配信メカニズムだし、君のコメントの文脈ではUIオートメーションフレームワークに関係してる。どこかにDDEの本があって、Windows 3.xの2つのアプリケーション間でいくつかの値を交換するためのCのボイラープレートが延々と載ってるんだ。

これは私のリンクブログのエントリーなんだけど、リンク先の記事を読んで全体の文脈を理解してほしい。私のコメントだけじゃ意味がわからないかもしれないから。https://aifoc.us/the-browser-is-the-sandbox/

リンクブログにそのことについてちょっとしたメモを追加した方がいいかもね :) 私のブログには年の表示を追加したんだ(古い記事にはタイトルに年が目立つように入ってる)。それと、購読のメモもね(みんなフィードリーダーにURLを入れられるって知らないから、自動でフィードURLを見つけてくれるのに)。毎回、同じ質問をメールしてくる人の数が減ってるよ :) まあ、とにかくブログを書いてくれてありがとう!

Simonや他の人にブラウザでできる2つのことを指摘したい。1) webcontainerを使えば、Node.jsのフロントエンドとバックエンドアプリをブラウザで動かせる。これは(今は残念ながらメンテされていない)bolt.diyプロジェクトで簡単にデモされてる。2) jslinuxやx86 Linuxの例を使えば、WASMで完全なLinux環境を動かせて、双方向通信もできる。薄い拡張がLinuxにネットワーキングサポートを追加するから、技術的にはURLを訪れるだけでかなりフル機能のエージェントシステムを動かすことが理論的には可能なんだ。

ここにすごくシンプルなv86の実験があるよ: https://tools.simonwillison.net/v86 最終的には、LLMがファイルシステムや実行環境として扱えるように拡張したいんだけど、v86経由でシェルコマンドをプログラム的に実行するのはあんまり簡単じゃないみたい。ブラウザのインタラクティブUIでLinux環境を見せるために設計されてる感じがする。まだ正しい実行方法を見つけてないかもしれないけどね。

  1. webcontainer webcontainers.ioって、実は有料プランのあるプロプライエタリな非オープンソースのソリューションじゃない?オープンソースで監査可能なプラットフォームと同じレベルで言うのはちょっと変な気がする。

これはFile System Access APIがどれだけ便利かの素晴らしい例だね。http://co-do.xyz/ では、ディレクトリを選択してAIにその中で作業させることができるから、副作用を心配する必要がないんだ。File System Access APIは、ここ数年でウェブに起きた最高のことだよ。ウェブアプリが一流の生産性アプリケーションになるんだから。

ウェブアプリが一流の生産性アプリケーションになる。ネイティブUIが優位な限り、一流にはならないよね。

残念ながら、このAPIの機能はSafariやFirefoxでは(まだ?)サポートされていないんだ。

AIがツールコールで長時間セッションを行えるようになってから、AIごとに1つのVMを使うサービスがかなり儲かるようになった。でも、実際にはブラウザ内で動かせるものがたくさんあると思う。特に、コードをライブアップデートしたり、マウントされたファイルシステムの上でシェルを実行したりするだけのものはね。ユーザーのブラウザ内でこれを効率的に実行できるんだ。ただし、失うものが2つある:コラボレーション(できるけど、中央サーバーがないと分散問題になる)とバックグラウンドでの作業(ユーザーのタブがサスペンドまたは閉じられると、すべての作業を一時停止する必要がある)。だから、制約の中で作業できれば、プラットフォームとしてたくさんの利点があるよ:レイテンシがかなり下がるし、パフォーマンスはユーザーのハードウェアによって上がるかもしれない(通常はこのために使うVMよりも強力だし)、正しく設計すれば帯域幅も大幅に減らせるし、同時に何千ものVMを動かす必要がなければ、プラットフォームの稼働時間やコストも改善されるよ(それをやってくれるプラットフォームにプレミアムを払う必要もないし)。とはいえ、ユーザーのブラウザにOS全体やWebContainersみたいなものを入れるのが正しい方法かはわからない。少しカスタムなランタイムを構築する必要があると思う。このタイプのローカルなエージェント環境にはね。でも、スムーズなユーザー体験とプラットフォームの成長を得るためにはこれがベストだと確信してる。Framerでは、ウェブサイトの任意の部分を60fps以上でReactコードに再コンパイルできるようにしたから、プラットフォームをサクサクに感じさせて、すぐに公開できるようにするためのトリックが少なくて済んだんだ。[1] OpenAIやAnthropicのような大規模モデルプロバイダーには、GPU負荷が非常に多く、これに利用できるCPUもたくさんあるという興味深いアドバンテージがあるよ。

これ、ファイルシステムをサンドボックス化してるんだ。それは一つの問題のクラスに過ぎない。人々はこれを自分の受信トレイやカレンダー、チャット、ソースコード、財務などに接続したいと思うだろう。ファイルシステムはセキュア?それはいいけど、他はどうなの?あまり良くないね。とはいえ、良いスタートだよ。