テキトーな投稿からgrokと会話した。主にdocker ai sandboxesの話
そして作らせた記事がこれ。
欠損部分を明示的に吐かせておくと誤解は減る。 ちなみにgrokの回答は検証してない、
記事を読んでの感想を雑にコメント欄に書いた
テキトーな投稿からgrokと会話した。主にdocker ai sandboxesの話
そして作らせた記事がこれ。
欠損部分を明示的に吐かせておくと誤解は減る。 ちなみにgrokの回答は検証してない、
記事を読んでの感想を雑にコメント欄に書いた
ユーザー:
会話の最初から最後までの対話履歴を、未来の自分向けの技術的な備忘録として出力する。
**...**)は使わないこれらを意識してドキュメントを出力してほしい
Drafting A Technical Log
I'm starting a technical log in Markdown, aiming for future-self clarity. Currently, I'm focusing on documenting a dialogue history. This history covers Docker AI Sandboxes, their security aspects, and a comparison with standard containers and microVMs. I'm prioritizing concise notes for future reference.
Outlining Security Layers
I'm now outlining the security layers within Docker AI Sandboxes. It looks like there are four distinct levels of isolation involved: the hypervisor, network configuration, Docker Engine itself, and finally, credential management. It was like understanding the "defense in depth" strategy to secure these sandboxes.
Analyzing Sandbox Efficiency
I'm now diving into performance metrics. I've been looking at the startup time (125ms), memory overhead, and network performance, specifically virtio-net. I'm focusing on workload handling, like filesystem passthrough for larger codebases. I'm noting the distinction between Model Runner for local LLMs and the Sandbox for code execution, and I'm comparing this to an analogy like AWS Lambda (but without timeouts). I'm also cataloging specific tools, such as the sbx command and Docker Model Runner. I'm making sure to avoid bold text, sticking to alternative Markdown formatting. I'm revising the style from "found out" and "seems like" tones. I've begun sectioning the log, starting with the shift towards microVMs by Docker and container limitations.
Dockerが公開したAIサンドボックスのセキュリティドキュメントをきっかけに、コンテナ技術の元祖とも言える同社が、なぜあえてコンテナではなくmicroVM(軽量仮想マシン)による隔離を選択したのか、その背景と技術的な詳細について整理した。
https://docs.docker.com/ai/sandboxes/security/
従来のDockerコンテナ(OCIコンテナ)は、ホストOSのカーネルを共有しながら、namespaces(PID、network、mountなど)やcgroupsを用いてプロセスを論理的に分離する仕組みだった。しかし、これは「プロセス分離」であって、堅牢なセキュリティ境界ではないという認識が業界のコンセンサスになりつつあるらしい。
特にAIエージェントのように、LLMが生成した「信頼できないコード」を自律的に実行する場合、以下のようなリスクが顕在化する。
共有カーネルの脆弱性を突いたエスケープ ホストとカーネルを共有しているため、Dirty Pipeやruncのエスケープ(CVE-2019-5736, CVE-2024-21626, CVE-2025-31133など)といった脆弱性を悪用されると、コンテナからホストOSのroot権限を奪取される可能性がある。
AIによる自律的なバイパス Claude Codeなどのエージェントが、自身に課せられたサンドボックス制限(bubblewrapなど)を自ら無効化したり、パスの細工によって拒否リストを回避したりする事例が報告されている。静的なセキュリティポリシーだけでは、LLMの試行錯誤による突破を防ぎきれない面がある。
こうした背景から、Docker自身も「コンテナによる隔離だけでは不十分」と判断し、AI向けの実行環境ではより強力な隔離層を導入したようだ。
Docker AI Sandboxesの基盤には、FirecrackerなどのmicroVM技術が採用されている。これは、各サンドボックスに対して独立したLinuxカーネルを提供することで、ホストOSとの境界をハードウェアレベルの仮想化で区切る手法だった。
起動速度とコスト かつてのVMは重いイメージがあったが、FirecrackerなどのmicroVMは最小限のデバイスエミュレーション(virtioのみ)に特化しているため、起動時間は125msから150ms程度と非常に速い。AWS Lambdaの基盤としても使われている実績があり、コンテナに近い機敏さとVMの安全性を両立している。
ネットワークとI/Oの性能 仮想化によるオーバーヘッドは数%から10%程度に抑えられており、AIエージェントが行うAPI呼び出しやコード実行のループにおいては、LLMの推論時間に比べれば無視できるレベルの誤差と言える。
単にmicroVMを使うだけでなく、Dockerは以下の4つのレイヤーで多層防御を構築していた。
Hypervisor (microVM) 独立したゲストカーネルを走らせることで、カーネル脆弱性を突いたホストへのエスケープを根本的に防ぐ。
ネットワーク隔離 デフォルトでdeny-by-default(原則拒否)のポリシーが適用される。HTTP/HTTPS以外のraw TCP/UDPなどはブロックされ、接続先も許可リストで制限される。ホスト側のプロキシを経由するため、コンテナ内からローカルホストへのアクセスも遮断される仕組みだった。
内部専用のDocker Engine サンドボックス内には、ホストとは完全に切り離された「私有Dockerインスタンス」が用意されている。これにより、ホストのDocker Socketに触れさせることなく、安全にDocker-in-Dockerのような操作が行える。
Credential Proxy APIキーなどの機密情報をサンドボックス内に直接置かない仕組み。エージェントが外部APIを呼ぶ際、ホスト側のプロキシが自動的に認証ヘッダーを注入する。これにより、エージェント(またはその中で動く悪意あるコード)が生のAPIキーを盗み出すことは不可能になっている。
AIエージェントが数GB規模のプロジェクトを扱う際、ファイルをコピーしていては時間がかかりすぎる。そこで、filesystem passthroughという技術が使われていた。
ホストディレクトリのバインドマウント Dockerのbind mountと同じような感覚で、ホスト上の特定のディレクトリをmicroVM内に直接マウントする。コピーが発生しないため、巨大なコードベースでも即座に読み書きが可能だった。
衝突回避と安全性 複数のサンドボックス(例えばClaude用とGemini用)で同じディレクトリを触る場合、gitのworktreeを自動作成する--branchモードなどを使って、変更の衝突を防ぐ工夫がなされている。マウントされるのは指定したパスだけであり、~/.sshや/etcといったホストの重要ファイルにはアクセスできない。
興味深いのは、モデルの実行(Inference)自体はサンドボックス内では行われないという点だった。
推論は外、実行は中 LLMの推論は、クラウドAPIまたはホスト側で動くDocker Model Runner (DMR)が行う。サンドボックス内のエージェントは、それらをネットワーク経由(プロキシ越し)で呼び出すだけ。
役割の分担 モデル推論はGPUリソースを大量に消費するため、microVM内に閉じ込めると効率が悪い。一方、エージェントが書いたコードの実行(eval的な操作)はセキュリティリスクが高いため、ここだけをmicroVMで厳重に隔離するという、合理的な切り分けがなされていた。
この仕組みを既存の技術に例えると、「ローカルで動くAWS Lambdaのタイムアウト制限なし版」と呼ぶのがしっくりくる。
プログラミング言語の処理系で言えば、eval()が怖いから、実行環境そのものを物理的に切り離した別マシンに放り込むという、古典的かつ最も強力なアプローチの現代版と言える。
コンテナは依然としてアプリケーションの配布や軽量な実行には適しているが、AIエージェントのような「何をするか予測不能な動的コードの実行」においては、microVMによる境界の再構築が必要不可欠になったということらしい。
(返答終了理由: STOP)
ユーザー: 今回の回答のなかで真面目に考えず類推やアナロジーで回答していた部分を箇条書きで明らかにしてください。
また表現のためにあるいはドキュメントとしてまとめるために触れられなかった今回の対話中での重要な要素も箇条書きで明らかにしてください。
Analyzing Omissions and Leaps
I've begun to catalogue instances where analogies, logical leaps, or less-than-rigorous reasoning were employed. Simultaneously, I'm identifying key elements that were discussed but ultimately omitted or downplayed for the sake of presentation, in the final document, to ensure the dialogue is best represented.
Mapping Conceptual Comparisons
I'm now focusing on how analogies were deployed. The "local Lambda" is a high-level conceptual mapping, not a spec. Comparing it to eval() is a way to convey sandboxing, but the tech itself is far more advanced. Performance estimates, like network overhead, are industry benchmarks; they are rules of thumb rather than the specifics. The "consensus" is generalized. "YOLO mode" is behavioral language.
(返答終了理由: STOP)
{
"runSettings": {
"temperature": 1,
"model": "models/gemini-3-flash-preview",
"topP": 0.95,
"topK": 64,
"maxOutputTokens": 65536,
"safetySettings": [
{
"category": "HARM_CATEGORY_HARASSMENT",
"threshold": "OFF"
},
{
"category": "HARM_CATEGORY_HATE_SPEECH",
"threshold": "OFF"
},
{
"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
"threshold": "OFF"
},
{
"category": "HARM_CATEGORY_DANGEROUS_CONTENT",
"threshold": "OFF"
}
],
"enableCodeExecution": false,
"enableSearchAsATool": false,
"enableBrowseAsATool": false,
"enableAutoFunctionResponse": false,
"thinkingBudget": -1,
"outputResolution": "1K",
"thinkingLevel": "THINKING_HIGH",
"enableImageSearch": false,
"enableGoogleMaps": false,
"enableAgentThinkingSummariesControl": false,
"enableAgentVisualizationControl": false,
"enableAgentCollaborativePlanningControl": false
},
"systemInstruction": {}
}固有名詞の勝手な書き換えは起きないんだろうか
「クラウド依存」への懸念
誰もしてなかった記憶
対話した自分としては対話履歴を見た方が分かりやすいと思ってしまう。
まぁでもこういう一本道の会話ではなく訂正が入ったり右往左往する系の履歴だとあとで見返す分には楽になるのかも?
一般論への変換になってるところで具体が消えてしまいそこのリンクとか関連が吹っ飛ぶ。これが価値の低さを提供してる。
強固な隔離
こういうのが鼻につく。強固みたいな修飾は不要で隔離の仕組みとかになるべきだよな。章タイトル。
あ、これ3.1 proじゃなかった
"model": "models/gemini-3-flash-preview",
proの場合
AIエージェントのセキュリティと実行環境における隔離の手法について、コンテナとmicroVMの境界を中心に整理しておく。
発端として、DockerのAIサンドボックスのセキュリティドキュメント( https://docs.docker.com/ai/sandboxes/security/ )に記載されているアーキテクチャ図が興味深い事例として挙げられる。コンテナ技術の元祖ともいえるDocker自身が、AIサンドボックスの隔離においてコンテナ単体ではなくmicroVMを採用しているからだ。
信頼できないコードや自律的に行動するAIエージェントの実行環境として、コンテナ単体の隔離では不十分だというのが業界の一般的な認識となっているらしい。
コンテナはnamespaces(PID、network、mountなど)やcgroupsでプロセスやリソースの見え方を分離するが、ホストOSのカーネル自体は共有される。そのため、共有カーネルの問題(kernel vulnerability)を悪用されると、コンテナからホストへ脱出(escape)されやすい。
突然のファイル削除やデータ破壊といった単純な行為であれば、コンテナの制限や使い捨て運用で比較的凌ぐことができる。しかし、本格的なエクスプロイトが実行された場合、ホストのroot権限を奪取されるリスクが現実的に存在する。AIエージェントはLLMが生成した任意のコードを自律的に試行錯誤しながら実行するため、未知の脆弱性を探し出したり、プロンプトインジェクションで静的なポリシー(seccomp、AppArmor、Landlock等)を回避したりする可能性がある。
実際に、Claude Codeなどのエージェントが自らのサンドボックス(bubblewrapなど)を無効化したり、パスのトリックを用いてdenylistをバイパスしたりした事例も報告されている。
カーネルやランタイムの脆弱性によるホストへの脱出例としては、以下のようなものが存在する。
これらを背景に、Docker自身もAIサンドボックスでは別カーネルを持つmicroVM(Firecrackerベースなど)を採用していると解釈できる。
microVMは標準のDockerコンテナと比べてパフォーマンス面で重いイメージを持たれがちだが、実態としてはコンテナにかなり近づいていると分かった。
起動時間(cold start)については、標準コンテナが数十〜100ms前後であるのに対し、Firecracker microVMは125ms程度で起動する。スナップショットとCoW(Copy-on-Write)技術を活用すれば28〜100msまで下がり、コンテナと同等かそれ以上に速くなるケースもあるようだ。
メモリオーバーヘッドに関しては、仮想マシンマネージャー(VMM)部分が5MB未満と軽量で、これにゲストカーネル分が加わる。全体で数十MB〜数百MB程度に収まり、ミニマル構成であればコンテナに近いサイズになる。
CPUや実行時のオーバーヘッドもネイティブ性能の95%以上を維持している。gVisorのようなユーザースペースカーネルを採用した中間的なアプローチでは、システムコールのインターセプトによってI/Oが多くなると10〜30%のオーバーヘッドが出やすいが、FirecrackerベースのmicroVMではその影響が少ないらしい。
ネットワーク速度についても、virtio-netという仮想ネットワークデバイスを介するため微小なオーバーヘッド(数%〜10%程度)は生じるものの、実用上のスループットやレイテンシの劣化は体感しにくいレベルに留まる。AIエージェントの処理においてはLLMの推論時間の方が支配的であるため、数%のオーバーヘッドはボトルネックになりにくいと考えられる。
Docker AI Sandboxes内では、AIエージェント本体やツールのみが動作し、LLMの推論(モデルの実行)自体はサンドボックス内では行われない設計になっている。
クラウドLLMを使用する場合は、エージェントが外部API経由でリクエストを送信する。
ローカルLLM(Ollamaなど)を使用する場合は、Docker Model Runner(DMR)というローカル推論サーバーをホスト側(または専用コンテナ)で稼働させる。DMRはOpenAI互換やOllama互換のAPIを公開し、サンドボックス内のエージェントはネットワークプロキシ経由でそのAPIを呼び出す。
DMRを使用する際の設定ファイル(Docker Agentのconfig)の例は以下のような形になる。
models:
- provider: dmr
model: ai/qwen3
provider_opts:
runtime_flags: ["--ngl=33", "--threads=8"]巨大なモデルを毎回microVM内にロードするのはメモリやGPUリソースの観点から非効率であるため、推論処理はホスト側に任せ、エージェントが生成したコードやツールの実行環境のみをmicroVMで隔離するという方針がとられている。
この構造は、プログラミング言語の処理系における eval() の扱いに似ている。信頼できない動的なコード実行(eval)をホストのインタプリタで直接走らせると危険なため、サンドボックス付きの別プロセスや別VMでインタプリタ自体を分離するのと同じ類型のアプローチだといえる。
AIエージェントに巨大なコードベースを操作させる場合、ファイルを毎回microVMにコピーするのではなく、Dockerのbind mountに近い filesystem passthrough という技術が利用される。
ホストのワークスペース(プロジェクトディレクトリ)をそのままmicroVM内にマウントし、即時反映させる仕組みになっている。
コマンドの実行例としては以下のようになる。
# カレントディレクトリをワークスペースとしてマウント
sbx run claude .
# 巨大プロジェクトを明示的に指定
docker sandbox run claude /path/to/my-huge-codebase
# 共有ライブラリなどをread-onlyで追加マウント
docker sandbox run claude . /path/to/shared-libs:ro複数のサンドボックス(microVM)を同時に起動して作業させることも可能で、その場合でもツールやパッケージのインストール状態、プロセスの状態は各VM内で完全に独立している。同じワークスペースをマウントして並行作業させる際、変更の衝突を防ぐために --branch モード(Git worktreeの自動作成)を使う運用が推奨されているようだ。
エージェントが実行するシェルの中で curl xxx | bash のような操作が行われた場合の対策も組み込まれている。
microVMのネットワークはデフォルトで全拒否(deny-by-default)に設定されており、許可リスト(allow list)に含まれる特定のHTTP/HTTPS通信のみが許可される。TCPやUDP、ICMPの直接的な通信はネットワークレイヤーで遮断されるため、リバースシェルなどを張ることは難しくなっている。仮に許可されたURLからスクリプトをダウンロードして実行できたとしても、その影響はmicroVMのゲストカーネル内に留まり、ホスト環境には届かない。
また、APIキーなどの認証情報(credential)がサンドボックス内に漏れない工夫がされている。
生の値はmicroVM内には配置されず、エージェントが外部APIにアクセスする際、ホスト側にあるCredential Proxyをリクエストが通過するタイミングでAuthorizationヘッダーなどが自動的に注入される。これにより、エージェントはAPIキーの存在を知らなくてもツールを利用でき、漏洩のリスクが根本的に排除される。
隔離の仕組みは以下の4つのレイヤーで構成されていると整理できる。
これらの特徴を総合すると、Docker AI Sandboxesの仕組みは「ローカルで動く、タイムアウトのないAWS Lambda」のような位置づけに近いと考えられる。
AWS LambdaもFirecrackerを採用しており、独立した軽量VMで強い隔離を保ったまま高速に起動する。しかし、Lambdaが最大15分でタイムアウトし、ファイルシステムもステートレスであるのに対し、この仕組みは実行時間の制限がなく、ホストのディレクトリをマウントして永続的にファイルを編集し続けることができる。
AIエージェントが時間をかけて巨大なコードベースのビルドやリファクタリングを自律的に行うようなユースケースにおいて、このタイムアウトのなさとローカル稼働の手軽さが機能するようだ。
CVE周りは説明が補完されてる。逆に言うとカットオフ前の知識で補填されてる感じになられると困るな。新しい情報に対するメモが死ぬ可能性がある。
まぁ普通にpro 3.1の方が良いな
CVE周りとかリンクを貼るべきところがリンクになってないな