0Pricing
Lua Academy · レッスン

プラグイン実行のサンドボックス化

setfenv/loadとカスタム_ENVを使い、制限された環境でプラグインを実行します。

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

プラグインをサンドボックス化する理由

信頼できないプラグインコードは、危険な関数(os.execute、io.open、load)を呼び出したり、アプリケーションの非公開状態にアクセスしたりできます。サンドボックスによって、コードが実行できることを制限します。

Lua 5.2以降のカスタム_ENV

Lua 5.2以降では、各チャンクのグローバル環境は _ENV です。制限された _ENV でチャンクをロードし、アクセス範囲を制限します。

local function sandbox(code, env)
  local chunk, err = load(code, "sandbox", "t", env)
  if not chunk then return nil, err end
  return pcall(chunk)
end

安全な環境の構築

安全な標準ライブラリ関数だけを含む、ホワイトリスト方式の環境を作成します。

local safeEnv = {
  print  = print,
  type   = type,
  pairs  = pairs,
  ipairs = ipairs,
  tostring = tostring,
  tonumber = tonumber,
  table  = {insert=table.insert, concat=table.concat, sort=table.sort},
  string = {format=string.format, find=string.find, match=string.match},
  math   = math,
}

危険な関数のブロック

次のものを明示的に除外します:os、io、load、loadfile、dofile、require、debug。これらをsafeEnvにコピーしないでください。

サンドボックスでのファイルロード

プラグインファイルをロードし、サンドボックス環境で実行します。

local function sandboxFile(path, env)
  local chunk, err = loadfile(path, "t", env)
  if not chunk then return nil, err end
  local ok, result = pcall(chunk)
  if not ok then return nil, result end
  return result
end

APIアクセスの提供

安全なメソッドだけを環境に含めることで、サンドボックス化されたプラグインに制限付きのアプリAPIへのアクセスを与えます。

local pluginEnv = setmetatable({
  app = {
    on       = function(e,f) app:on(e,f) end,
    emit     = function(e,...) app:emit(e,...) end,
    log      = function(msg) app:log(msg) end,
  },
}, {__index = safeEnv})

_ENVへのアクセス防止

サンドボックスに _G、_ENV、load を含めないでください。これらは制限された環境から抜け出す手段になります。

debug.sethookによる命令数カウント

実行された命令数を数え、上限に達した後に中断することで、無限ループを防ぎます。

local function withLimit(fn, maxInstructions)
  local count = 0
  debug.sethook(function()
    count = count + 1
    if count > maxInstructions then
      error("Instruction limit exceeded")
    end
  end, "", 100)
  local ok, err = pcall(fn)
  debug.sethook()
  return ok, err
end

メモリ制限

命令数のカウントと定期的な collectgarbage("count") のチェックを組み合わせ、メモリ使用量がしきい値を超えた場合に中断します。

出力のキャプチャ

サンドボックス環境の print を、stdoutに書き込む代わりに出力をバッファーへ取り込むカスタム関数に置き換えます。

回避すべきサンドボックスエスケープ

既知のエスケープ経路には、debug.getupvalue、標準オブジェクトに対する getmetatable、危険なコードへの coroutine.wrap の使用があります。環境内のすべてのエントリを慎重に確認してください。

サンドボックスに関する質問

サンドボックス化されたコードが os.execute を呼び出さないようにするには、どうすればよいですか?

まとめ:プラグインのサンドボックス化

安全なAPIだけを含むホワイトリスト方式の _ENV を作成します。load(code, name, "t", safeEnv) でプラグインコードをロードします。命令数をカウントして無限ループを防ぎます。サンドボックスに load、debug、_G を決して含めないでください。

よくある質問

「プラグイン実行のサンドボックス化」レッスンは無料ですか?

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

「プラグイン実行のサンドボックス化」で何を学びますか?

setfenv/loadとカスタム_ENVを使い、制限された環境でプラグインを実行します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「プラグイン実行のサンドボックス化」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. プラグインの検出と読み込み
  2. プラグインAPIとフックシステム
  3. プラグイン実行のサンドボックス化
  4. バージョン管理と依存関係管理
← Lua Academyに戻る