
Antigravity に Terminal Sandbox 機能が追加されました
はじめに
こんにちは、すらぼです。
1月23日、Google Antigravity に v1.15.6 が公開され、 Enable Terminal Sandbox というオプションが追加されました。

今回は、この Terminal Sandbox 機能について、動作を検証してみました。
Terminal Sandbox 機能とは
Terminal Sandbox(ターミナルサンドボックス)は、Antigravity でエージェントがターミナルコマンドを実行する際に、制限された環境内でコマンドを実行することでシステムの安全性を確保するセキュリティ機能です。
本機能は macOS の sandbox-exec 機能を利用して提供されているため、執筆時点では macOS 版でのみ利用できます。Linux 版のサポートも予告はされているため、リリースされれば WSL や DevContainer 環境でも利用できるかもしれません。
特徴
Terminal Sandbox には2段階の制限があります。
- ファイルシステムの制限
- ネットワークの制限
1. ファイルシステムの制限
まず、 Enable Terminal Sandbox をオンにした場合に有効化されるのが、このファイルシステムの制限です。

サンドボックスが有効な場合、エージェントのターミナルコマンドは「書き込み権限が現在のプロジェクト配下」に制限されます。
2. ネットワークアクセスの制御
Enable Terminal Sandbox をオンにすると、さらに追加のオプションとして Sandbox Allow Network が選べるようになります。

このオプションは、サンドボックス化されたコマンドが、ネットワーク接続を行えるかどうかを制御します。
ON にした場合、サンドボックス化されたコマンドがネットワーク通信を行うことができます。反対に、OFF にした場合はサンドボックス化されたコマンドのネットワークリクエストは全て拒否されるようになります。
バイパスすることも可能
Enable Terminal Sandbox をONにした状態では、コマンドを実行する際に、「Bypass Sandbox」というオプションが表示されます。
このオプションを選択したときのみ、Sandbox の制限をかけずにコマンドを実行することができます。
Strict Mode を ON にしたときの設定値
Strict Mode(厳格モード)が有効な場合、2つのオプションはそれぞれ以下のような設定になります。
Enable Terminal Sandbox: オンSandbox Allow Network: オフ
もっとも制限が強い状態で固定され、Strict mode を有効にした場合はこの値を変更することができなくなります。

実際の動きを確認してみる
実際にエージェントに指示を出して、挙動を確認してみます。
ファイルシステムの制限
例えば、あるプロジェクトディレクトリの配下から、「ホームディレクトリに test ディレクトリを作成して」と指示してみます。

すると、 Operation not permitted というエラーと共に、コマンドが失敗しました。
このように、プロジェクト外のディレクトリには、書き込みができなくなっています。
また、sandbox-wrapper.sh というシェルスクリプトで、コマンド実行をラップしていることも読み取れます。Sandbox モードをONにすると、このラッパースクリプトを介してコマンドが実行され、プロジェクト外でのファイル操作が制限されるようですね。
これにより、プロジェクト外のエージェント自身の判断ではなく、機械的にコマンドの実行可否が判定されるようになりました。この機能により、「エージェントが暴走して重要なディレクトリを rm されてしまった、、、」といったトラブルは、ほぼ確実に防ぐことができそうです。エージェントに自走させる際には、とても強力なガードレールですね。
参照系のコマンドは通る
ただし、制限されるのはあくまで「書き込み」のみのようです。例えば、ファイル取得などは実行の制限を受けません。
その確認として、「親ディレクトリのファイル一覧を ls コマンドで取得して」とリクエストしてみました。

すると、同じようにラッパースクリプトを介しているものの、コマンドは成功しました。
つまり、Sandbox モードでは参照系を制限することはしておらず、あくまでファイルの書き込み系操作のみを弾く仕組みになっているようです。
ネットワークアクセスの制限
次に、 Sandbox Allow Network をオフにして、コマンドによるネットワークアクセスを行えない状態にした場合の挙動を確認してみます。
まず、「curl コマンドで example.com のレスポンスを取得して」とリクエストしてみます。

先ほどと同様に、ラッパースクリプトを通じてコマンドが実行されています。しかし、名前解決の時点で失敗するようになっていました。
その後の DNS へのリクエストも同様に失敗しており、外部ネットワークへのアクセスはすべて弾かれるようになっていました。
念の為、Sandbox Allow Network をオンにして再度実行してみます。

すると、今度は成功しました。
localhost もコマンドではアクセスできなくなる
外部ネットワークにアクセスできないことはわかりました。ただ、実際の開発ではローカルホストで動作確認を行うケースが非常に多いです。その場合の影響も確認してみます。
テストとして、Node.js で Hello! とだけ返却するスクリプトを書いて localhost:8080 で起動します。
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('hello!');
});
const PORT = 8080;
server.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}/`);
});
この状態で「curl コマンドで http://localhost:8080 からレスポンスを取得して」と指示してみます。

おっと、、どうやら失敗してしまったようです。
試しに、Sandbox Allow Network を ON にし、サンドボックスコマンドでもネットワークアクセスが行えるようにしてもう一度試してみます。

今度はレスポンスが期待通り返ってきていました。つまり、 Sandbox Allow Network をオフにすると、ローカルのネットワークでもコマンドを通じてはアクセスできなくなるようです。
コマンドを使わなければ外部接続できる?
コマンドについては挙動が見えてきました。ただ、Antigravity にはコマンドを使わなくても外部アクセスを行う方法があります。
例えば、「example.com のデータを取得して」と指示を出したときは、以下のような挙動をします。

これは Antigravity が持つ read_url_content という機能によるもので、これはコマンド実行とは別物です。
Sandbox Allow Network をオフにした状態で、このリクエストを行ってみると、、、

これは成功しました。あくまでコマンド経由のネットワーク接続しか制限を行わないようです。
同じように、ローカルホストにブラウザでアクセスするように指示を出してみます。

こちらも同じようにアクセスができました。
ネットワークに関しては、コマンド以外でアクセスする方法を Antigravity 自身が持っているため、指示の方法によってはこういった迂回ができてしまいそうです。
逆に言えば、コマンドレベルではオプションによって制限することで意図しない挙動を防ぎつつ、ツールで都度許可をする仕組みによって開発に大きな影響を出さずに開発することも可能かもしれません。
おわりに
新しく実装された Sandbox モードについて動作を検証してみました。ファイル操作に関する部分については強力なガードレールである一方で、ネットワークアクセスに関しては指示の仕方によっては制限を迂回できるケースもありそうです。
似たような機能に DevContainer もありますが、そちらはマウントしていないファイルは全く触ることができません。バイパスすることでコマンド実行が可能になる分、こちらの方がファイルシステムに対する制限としては少し緩い印象です。
ただ、DevContainer と比較した場合、大きなメリットとして Antigravity の強力な機能の1つであるブラウザ機能がネイティブで使えることにあります。DevContainer 内ではこの機能は大きな制限を受けているため、ブラウザ機能を優先する場合はこの Sandbox モードは強力な選択肢の1つになりそうです。
今後も、より安全に使える機能が充実し、より気軽に Vibe Coding できる環境として成長していくことが期待されます。
以上、すらぼでした。







