0Pricing
Lua Academy · レッスン

サンドボックス脱出の防止

debugライブラリへのアクセス、rawget/rawsetの悪用、upvalueの漏洩を防ぎます。

「サンドボックス脱出の防止」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

脱出の問題

ホワイトリスト方式の環境を使用していても、巧妙な攻撃者は実際のグローバル環境にアクセスする方法を見つける可能性があります。このレッスンでは、既知の脱出経路と、それらを塞ぐ方法について説明します。

文字列メタテーブルの悪用

Luaでは、文字列が文字列ライブラリを公開する共有メタテーブルを持っています。サンドボックス化したコードは、文字列を利用してstring.repへの参照を取得し、そこからほかのライブラリに到達できます。

-- Escape vector (before patching):
local s = "hello"
local getenv = s.rep  -- reaches string library
-- Fix: use setmetatable on all sandboxed strings (not practical)
-- Better fix: override debug.getmetatable in the sandbox

rawget/rawsetによる回避の防止

サンドボックスにrawgetが含まれていると、コードはそれを使って__indexによる制限を回避し、実際のテーブルを直接読み取れます。

-- Fix: exclude rawget, rawset, rawequal, rawlen from the sandbox env

debugライブラリへのアクセス

debugライブラリは、_ENVを含む任意のupvalueを読み取り、変更できます。サンドボックスから完全に除外してください。

package.loaded テーブル

require または package にアクセスできる場合、サンドボックス化されたコードから、os や io を含む、すでに読み込まれたモジュールに到達できてしまいます。

-- Fix: exclude require and package from the sandbox env

コルーチンと再開

ホストによってサンドボックス化されたコルーチンが再開されると、状態を外部に持ち出される可能性があります。coroutine.wrap は慎重に使用し、権限を昇格させた状態でサンドボックス化されたコルーチンを再開しないでください。

アップバリューの走査

デバッグライブラリがなければ、サンドボックス化されたコードからアップバリューを走査することはできません。ただし、debug.getupvalue が誤って含まれていると、_G に到達するために悪用される可能性があります。

safeEnv の __newindex

サンドボックス環境のメタテーブルに __newindex を追加し、サンドボックス化されたコードが安全なグローバルを隠す新しいグローバルを作成できないようにします。

setmetatable(safeEnv, {
  __newindex = function(_, k, v)
    -- allow only whitelisted keys or reject
    error("Global assignment not allowed: " .. k)
  end
})

math ライブラリのプロキシ

実際の math テーブルを渡す代わりに(標準ライブラリとメタテーブルを共有するため)、必要な関数だけを含む浅いコピーを作成します。

サンドボックス脱出の自動テスト

既知の脱出パターンをサンドボックスに対して試すファジングテストスイートを維持します。サンドボックスのコードを変更するたびに実行してください。

多層防御

完全なサンドボックスは存在しません。制限された環境、命令数制限、メモリ制限、OS レベルのプロセス分離(別のサブプロセスまたはコンテナ)を組み合わせて、多層的に防御します。

OS レベルのサンドボックス

最大限のセキュリティを確保するには、OS レベルの制限を適用したサブプロセスで Lua を実行します。たとえば、seccomp(Linux)、App Sandbox(macOS)、読み取り専用ファイルシステムを使用する Docker などです。

サンドボックス脱出の確認

なぜ rawget をサンドボックスから除外する必要があるのでしょうか?

まとめ:サンドボックス脱出の防止

debug、rawget/rawset、package、require、load をサンドボックスから除外します。サンドボックス環境を __newindex で保護します。元のライブラリテーブルを参照するのではなく、コピーを作成します。最大限のセキュリティを確保するには、OS レベルの分離を組み合わせます。

よくある質問

「サンドボックス脱出の防止」レッスンは無料ですか?

はい。「サンドボックス脱出の防止」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「サンドボックス脱出の防止」で何を学びますか?

debugライブラリへのアクセス、rawget/rawsetの悪用、upvalueの漏洩を防ぎます。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「サンドボックス脱出の防止」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Lua 5.2以降の_ENVモデル
  2. 制限付きサンドボックスの構築
  3. サンドボックス脱出の防止
  4. リソース制限とインストルメンテーション
← Lua Academyに戻る