1 ポイント 投稿者 GN⁺ 2024-07-08 | 1件のコメント | WhatsAppで共有

QuickJS - WebAssembly QuickJSサンドボックスでJavaScriptを実行

このTypeScriptパッケージは、QuickJSエンジンを使用してWebAssemblyサンドボックス内でJavaScriptコードを安全に実行できるようにします。信頼できないコードを安全に隔離して実行するのに適しており、WebAssemblyにコンパイルされた軽量で高速なQuickJSエンジンを活用して、堅牢なコード実行環境を提供します。

特徴

  • セキュリティ: 信頼できないJavaScriptコードを安全で隔離された環境で実行可能
  • ファイルシステム: 仮想ファイルシステムをマウント可能
  • カスタムNodeモジュール: カスタムNodeモジュールをマウント可能
  • Fetchクライアント: http(s) 呼び出しができるfetchクライアントを提供可能
  • テストランナー: テストランナーとchaiベースの expect を含む
  • パフォーマンス: 軽量で効率的なQuickJSエンジンの利点を活用可能
  • 多様性: 既存のTypeScriptプロジェクトと簡単に統合可能
  • シンプルさ: サンドボックス内でJavaScriptコードを実行・管理するための使いやすいAPIを提供

ドキュメント全体を見る

リポジトリでサンプルを探す

基本的な使い方

以下は、このパッケージを使う簡単な例です:

import { quickJS } from '@sebastianwessel/quickjs'

// QuickJS wasmのロードや初期化などの一般設定
// リソース集約的な処理のため、可能なら一度だけ実行すべき
const { createRuntime } = await quickJS()

// jsコードを実行するたびにランタイムインスタンスを生成
const { evalCode } = await createRuntime({
  allowFetch: true, // fetchを注入し、コードがデータを取得できるよう許可
  allowFs: true, // 仮想ファイルシステムをマウントし、node:fsモジュールを提供
  env: {
    MY_ENV_VAR: 'env var value'
  },
})

const result = await evalCode(`
  import { join } as path from 'path'
  const fn = async ()=>{
    console.log(join('src','dist')) // ホストシステムで "src/dist" をログ出力
    console.log(env.MY_ENV_VAR) // ホストシステムで "env var value" をログ出力
    const url = new URL('https://example.com')
    const f = await fetch(url)
    return f.text()
  }
  export default await fn()
`)

console.log(result) // { ok: true, data: '<!doctype html>\n<html>\n[....]</html>\n' }

クレジット

このライブラリは以下をベースにしています:

  • quickjs-emscripten
  • quickjs-emscripten-sync
  • memfs
  • Chai

使用ツール:

  • Bun
  • Biome
  • Hono
  • poolifier-web-worker
  • tshy
  • autocannon

ライセンス

このプロジェクトはMITライセンスの下で提供されています。


このパッケージは、TypeScriptアプリケーション内でJavaScriptコードを安全に実行したい開発者に最適であり、QuickJS WebAssemblyサンドボックスを通じて性能と安全性を保証します。

GN⁺の要約

この記事では、QuickJSエンジンを使用してWebAssemblyサンドボックス内でJavaScriptコードを安全に実行する方法を説明しています。これは、信頼できないコードを隔離して実行する際に非常に有用です。QuickJSは軽量でありながら高速な性能を提供し、TypeScriptプロジェクトと簡単に統合できる利点があります。類似の機能を提供するプロジェクトとして、DenoやNode.jsがあります。

1件のコメント

 
GN⁺ 2024-07-08
Hacker Newsのコメント
  • quickjs-emscriptenライブラリの作者が、このライブラリの標準ライブラリを評価している

    • ブラウザやバンドラーで実行してみたかと質問している
    • Webpackのようなバンドラーとの互換性の問題を指摘している
    • セキュリティ警告: ライブラリにより、ゲストコードがホストのfetch関数と同じCookieを使ってfetchを呼び出せてしまう
    • 信頼できないコードを実行する際は注意が必要
    • quickjs-emscriptenが低レベルで、魔法のような機能を避けているのは、安全性を確保するため
    • 信頼できないコードを実行する際は、サンドボックスとAPIを慎重に監査すべき
    • Figmaのプラグインサンドボックスのセキュリティに関するブログ記事を参考にすることを勧めている
  • 前職でquickjs-emscriptenを使っていた際に、多くの"segmentation faults"やエラーを経験した

    • プロジェクトは中止され、やり直すなら公式にサポートされているwasmバンドルを使うつもり
  • JavaScriptをサンドボックス化する方法はいくつもある

    • DOMアクセスをサンドボックス化する方法があるかと質問している
    • iframeが唯一の技術だが、重くて遅い
    • プラグインをホスティングするアプリを書いており、プラグインにDOMアクセスを許可すると問題が起こりうる
  • ブラウザで実行できるかと質問している

    • サポートされる環境への言及が見当たらない
  • quickjsを使ってみたが、最終的にはisolated-vmを選んだ

    • どちらのライブラリもセキュリティ要件は満たしていたが、isolated-vmのほうがパフォーマンス面で優れていた
  • 別のJSサンドボックスライブラリの作者が、quickjs-emscriptenのアプローチを興味深いと考えている

    • JS-in-JSまたはJS-in-WASMが高いレベルの分離を提供すると述べている
    • Node.jsは分離やサンドボックス化を念頭に設計されていないと指摘している
    • createRuntimefetch以外にホスト環境への呼び出しを定義できるのかと質問している
    • ブラウザサポートがあると有用だと述べている
  • このライブラリによって、ユーザーが提供したJSコードを実行できるようになると考えている

    • バンドラーをサンドボックス環境で実行する方法についておすすめを求めている
  • QuickJSのパフォーマンスはホストのJS VMに太刀打ちできないと述べている

    • 古いCインタープリタやJavaScriptで実装されたインタープリタよりは速い
  • quickjs-emscriptenの高レベルラッパーに取り組んでいた

    • quickjs-emscriptenのAPIはquickjsのC APIと非常によく似ていて使いにくい
    • require()サポートの実装が難しい
    • モジュールファイルをメモリファイルシステムに事前ロードする方法を使っている
  • quickjs-emscripten-syncライブラリはホストとゲストの関数の自動同期を提供するが、これは大きな攻撃面になりうる

    • サンドボックスを脱出できる可能性を懸念している
  • wasmにコンパイルされているため、ブラウザで実行できるのかと質問している

    • Cookieを添付せずにfetchリクエストを送れるのか気にしている