<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>サンドボックス</title><link>https://blog.ast.moe/tags/%E3%82%B5%E3%83%B3%E3%83%89%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9/</link><description>Recent posts from 五里霧中</description><generator>Hugo</generator><item><title>Izanagiでできること</title><link>https://blog.ast.moe/blog/2026-10-08-3/</link><pubDate>Thu, 08 Oct 2026 22:24:12 +0900</pubDate><guid>https://blog.ast.moe/blog/2026-10-08-3/</guid><description>&lt;p&gt;&lt;code&gt;npm install&lt;/code&gt;を実行すると、パッケージをダウンロードするだけでなく、パッケージが用意したスクリプトも動くことがあります。そのコードを普段の開発環境で動かせば、実行するユーザーが読めるファイルや、プロセスへ渡した環境変数に触れられます。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ieee0824/izanagi"&gt;Izanagi&lt;/a&gt;は、こうした開発用コマンドをサンドボックス内で実行し、ファイルアクセスやネットワーク通信、子プロセスの起動を記録するRust製のツールです。作業場所を隔離する機能に加え、実行したコードが何をしようとしたかを調べる機能を持っています。&lt;/p&gt;
&lt;p&gt;最初の記事では、Izanagiで何ができるかを説明します。対象は2026年10月8日に確認した&lt;a href="https://github.com/ieee0824/izanagi/tree/bc74c86ef5aced240918d419b42bdda20f79ca3b"&gt;mainの&lt;code&gt;bc74c86e&lt;/code&gt;&lt;/a&gt;です。READMEだけでなく、コマンド実装、検知ルール、関連PRと検証記録を参照しています。&lt;/p&gt;
&lt;h2 id="コマンドを別の作業環境で動かす"&gt;コマンドを別の作業環境で動かす&lt;/h2&gt;
&lt;p&gt;基本の操作は、設定を作り、サンドボックス内でコマンドを実行することです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;izanagi init
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;izanagi exec -- npm install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;init&lt;/code&gt;は対話形式で設定を生成します。バックエンドや共有するディレクトリを選び、&lt;code&gt;exec&lt;/code&gt;へ実行したいコマンドを渡します。サンドボックスの環境には、使うビルドツールやランタイムを用意しておく必要があります。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ieee0824/izanagi/blob/bc74c86ef5aced240918d419b42bdda20f79ca3b/src/commands/exec.rs"&gt;&lt;code&gt;exec&lt;/code&gt;の実装&lt;/a&gt;は、稼働中のセッションがあればそこへ接続し、なければ単発の実行環境を起動します。標準出力、標準エラー、終了コードを呼び出し元へ返し、単発実行の終了後は停止処理を行います。&lt;/p&gt;
&lt;p&gt;環境を起動したまま、複数の作業を続けることもできます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# このターミナルで起動したまま待機する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;izanagi up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 別のターミナルから操作する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;izanagi exec -- npm test
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;izanagi shell
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;izanagi down
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;shell&lt;/code&gt;は対話シェルです。PTYを使い、入力、出力、端末サイズの変更を扱います。&lt;code&gt;up&lt;/code&gt;で起動した環境は、Ctrl+Cまたは&lt;code&gt;down&lt;/code&gt;で停止します。&lt;/p&gt;
&lt;p&gt;設定は作業ディレクトリから求めたハッシュごとに保存されるので、プロジェクト単位で共有範囲や監視条件を分けられます。&lt;/p&gt;
&lt;h2 id="隔離の方法を選ぶ"&gt;隔離の方法を選ぶ&lt;/h2&gt;
&lt;p&gt;サンドボックスのバックエンドには、Apple Container、QEMU、LinuxのLandlockがあります。&lt;code&gt;native&lt;/code&gt;という指定の意味はOSによって変わります。&lt;a href="https://github.com/ieee0824/izanagi/blob/bc74c86ef5aced240918d419b42bdda20f79ca3b/src/engine.rs"&gt;バックエンドを選択するコード&lt;/a&gt;では、macOSならApple Container、LinuxならLandlockを選びます。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;バックエンド&lt;/th&gt;
&lt;th&gt;実行環境&lt;/th&gt;
&lt;th&gt;主な隔離の方法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Apple Container&lt;/td&gt;
&lt;td&gt;macOS&lt;/td&gt;
&lt;td&gt;コンテナ用の仮想化環境で実行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QEMU&lt;/td&gt;
&lt;td&gt;macOS・Linux&lt;/td&gt;
&lt;td&gt;ゲストOSを起動してVM内で実行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Landlock&lt;/td&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;ホスト上の子プロセスへファイルアクセス制限を適用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;QEMUとコンテナでは、ホストから共有したディレクトリをゲストの作業場所へ渡します。LinuxのLandlockは別のOSを起動せず、ホストのパスに対してアクセスルールを設定します。&lt;a href="https://github.com/ieee0824/izanagi/blob/bc74c86ef5aced240918d419b42bdda20f79ca3b/src/landlock_sandbox.rs"&gt;Landlockの実装&lt;/a&gt;は、共有対象の読み書きと、実行に必要なシステムファイルの読み取りなどを許可しています。&lt;/p&gt;
&lt;p&gt;共有した場所は、実行するコードが作業する場所でもあります。プロジェクトを読み書き可能で渡せば、そのプロジェクトのファイルを書き換えられます。ホストの秘密鍵を共有しないことと、共有したソースコードを変更できないことは別の条件です。&lt;/p&gt;
&lt;p&gt;LinuxでLandlockとeBPFを使う場合は、対応機能を含めてビルドします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cargo build --release --features landlock,ebpf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Linux側の必要機能がないビルドでは、再ビルド方法を示すエラーになります。&lt;a href="https://github.com/ieee0824/izanagi/pull/6"&gt;PR #6&lt;/a&gt;では、この案内とLandlockによるシステムコマンドの実行、終了時の後片付けを修正しています。&lt;/p&gt;
&lt;h2 id="ファイルや通信へのアクセスを記録する"&gt;ファイルや通信へのアクセスを記録する&lt;/h2&gt;
&lt;p&gt;隔離と監視は、それぞれ別の部品です。Sandboxが実行環境を管理し、TracerがOSへの操作をイベントとして集め、Detectorがルールと照合します。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;flowchart LR
C[開発用コマンド] --&amp;gt; S[Sandboxで実行]
S --&amp;gt; T[Tracerが操作を収集]
T --&amp;gt; D[Detectorがルールと照合]
D --&amp;gt; L[ログとアラート]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;syscallは、プロセスがOSにファイルを開く、接続する、別のプログラムを起動するといった操作を依頼する入口です。IzanagiはLinuxのeBPFやmacOSのDTraceを使い、こうした操作を監視します。QEMUでは、ゲスト内のagentからイベントをホストへ送る&lt;code&gt;vm-agent&lt;/code&gt;を使えます。&lt;/p&gt;</description></item></channel></rss>