リソース制限とインストルメンテーション
debug.sethookで命令数を数え、CPU予算を適用します。
「リソース制限とインストルメンテーション」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
リソース制限が必要な理由
信頼できないコードは、無限に実行し続ける(CPU)、大量のメモリを割り当てる、過剰な出力を生成するといった方法で DoS を引き起こす可能性があります。リソース制限によってホストを保護できます。
debug.sethook による CPU 制限
実行された命令数を数え、制限を超えた時点で中断します。
local function withCPULimit(fn, maxOps)
local ops = 0
debug.sethook(function()
ops = ops + 1
if ops > maxOps then error("CPU limit exceeded", 2) end
end, "", 50) -- check every 50 instructions
local ok, result = pcall(fn)
debug.sethook()
return ok, result
endカウントの粒度
sethook の第 3 引数(count)は、フックを呼び出す頻度を制御します。値を小さくすると精度は高くなりますが、オーバーヘッドが増加します。一般的な範囲は 50~500 です。
collectgarbage によるメモリ制限
フック内でメモリ使用量を確認し、しきい値を超えた場合は中断します。
local MEM_LIMIT_KB = 1024 -- 1 MB
debug.sethook(function()
if collectgarbage("count") > MEM_LIMIT_KB then
error("Memory limit exceeded")
end
end, "", 200)ウォールクロック制限
os.clock() と組み合わせて、命令数ではなく(または命令数に加えて)実時間を制限します。
local deadline = os.clock() + 0.5 -- 500ms
debug.sethook(function()
if os.clock() > deadline then
error("Time limit exceeded")
end
end, "", 100)出力制限
サンドボックスの print 関数をラップして書き込んだバイト数を数え、制限に達したらそれ以上の出力を拒否します。
local totalOutput = 0
local OUTPUT_LIMIT = 10240 -- 10 KB
env.print = function(...)
local s = table.concat({...}, "\t") .. "\n"
totalOutput = totalOutput + #s
if totalOutput > OUTPUT_LIMIT then
error("Output limit exceeded")
end
output[#output+1] = s
endプロファイリング用の計測
「call」および「return」フックイベントを使用して、サンドボックス化されたコードの計測済みコールグラフを構築します。
local callGraph = {}
debug.sethook(function(event)
local info = debug.getinfo(2, "Sn")
local name = info.name or info.short_src
if event == "call" then callGraph[name] = (callGraph[name] or 0) + 1 end
end, "c")コルーチンのフック
debug.sethook の制限はスレッドごとに適用されます。サンドボックス化されたコードがコルーチンを生成する場合は、各コルーチンに個別にフックを設定してください。
リソース使用量の報告
サンドボックスの実行後に、実行した命令数、使用メモリ量、出力長、経過時間を報告します。悪用の検出やクォータの適用に役立ちます。
入れ子になったサンドボックス
サンドボックス化されたプラグインが自身でサブサンドボックスを作成できる場合は、親サンドボックスのリソース制限が子に継承されるか、さらに厳しく設定されることを確認してください。
本番環境向けツール
ツールには、luasandbox(LuaJIT)、seccomp を使用する Lua の Docker コンテナ、メモリに厳格な上限を設けるカスタムアロケーターがあります。OS レベルの cgroup と組み合わせることで、強力な保証を実現できます。
リソース制限の確認
debug.sethook はどのように CPU 制限を適用しますか?
まとめ:リソース制限と計測
debug.sethook を使用して、CPU 制限(命令数)、メモリ制限(collectgarbage による確認)、時間制限(os.clock)を適用します。print をラップして出力を制限します。監視とクォータ適用のため、実行後に使用量を報告します。
よくある質問
「リソース制限とインストルメンテーション」レッスンは無料ですか?
はい。「リソース制限とインストルメンテーション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「リソース制限とインストルメンテーション」で何を学びますか?
debug.sethookで命令数を数え、CPU予算を適用します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「リソース制限とインストルメンテーション」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Lua 5.2以降の_ENVモデル
- 制限付きサンドボックスの構築
- サンドボックス脱出の防止
- リソース制限とインストルメンテーション