【ITニュース解説】Claude Code can delete your files. The 3-layer setup I run: sandbox, hooks, git checkpoints
2026年10月08日に「Dev.to」が公開したITニュース「Claude Code can delete your files. The 3-layer setup I run: sandbox, hooks, git checkpoints」について初心者にもわかりやすく解説しています。
ITニュース概要
AI(Claude Codeなど)がファイルを誤って削除する事故が増加している。開発環境の安全を守るため、記事では3つの対策を紹介。OSで書き込みを制限するサンドボックス、危険なコマンド実行前に止めるフック、そしてGitでいつでも復元できるチェックポイントだ。これらを導入し、安全にAIを活用しよう。
ITニュース解説
AIエージェントがコードの生成や実行を自動で行うことで、開発作業は飛躍的に効率化できる。しかし、その強力な能力は、時に意図しない危険な結果を招く可能性がある。実際に、AIエージェントがユーザーのドライブを完全に消去したり、数万ものファイルを削除したり、「プロジェクトを台無しにした」といった報告が世界中で相次いでいる。システムエンジニアとしてこのようなAIツールを安全に活用するためには、潜在的なリスクを理解し、適切な対策を講じることが不可欠だ。
こうした事故からシステムを守るための解決策は、単一のツールに依存するのではなく、複数の防御層を組み合わせることにある。記事では、異なる種類の失敗をカバーする三つの安価で効果的な防御層が紹介されている。これらは、AIエージェントが危険な行動を起こすのを未然に防ぎ、万が一の問題発生時でも被害を最小限に抑え、元の状態に戻せるように設計されている。具体的には、OSレベルで実行環境を隔離する「サンドボックス」、危険なコマンドの実行を事前にチェックする「フック」、そして問題が起きた後に作業状態を元に戻す「チェックポイント」の三層である。
最初の防御層は「サンドボックス」だ。これは、AIエージェントが実行するコードやコマンドの動作範囲を、OS(オペレーティングシステム)レベルで厳しく制限する仕組みである。サンドボックスを有効にすると、AIエージェントは指定されたプロジェクトディレクトリの外にあるファイルに書き込むことができなくなる。例えば、macOSでは「Seatbelt」、LinuxやWSL2(Windows Subsystem for Linux 2)では「bubblewrap」といった技術がこれに該当する。これらの技術は、AIエージェントが直接実行するコマンドだけでなく、そこから呼び出される子プロセス(例えばPythonスクリプトがファイルを削除するコマンドを実行する場合など)にも適用されるため、プロジェクト外への意図しない書き込みや削除を強力に防ぐ。サンドボックスは最も強力な防御層であり、まず最初に有効にすべき対策だ。ただし、プロジェクトディレクトリ内での破壊的な操作、例えば「git push --force」(Gitのリモート履歴を強制的に上書きする)、データベースの「DROP TABLE users」(ユーザーテーブルを削除する)、「git reset --hard」(コミットされていない数時間分の作業を破棄する)といったコマンドは、プロジェクト内の操作として許可されてしまうため、サンドボックスだけでは防げない。また、このサンドボックス機能はWindowsネイティブ環境では利用できない点にも注意が必要だ。
二番目の防御層は「プリツールユースフック」と呼ばれる仕組みである。これは、AIエージェントが特定のツール(例:Bashシェルコマンド)を実行しようとする「直前」に、事前に定義されたスクリプトを割り込ませて実行させる機能だ。このフックは、AIエージェントが実行しようとしているコマンドの内容を受け取り、そのコマンドを「拒否する (deny)」「確認を求める (ask)」「許可する (nothing/allow)」のいずれかをAIエージェントに伝えることができる。記事の例では、Pythonスクリプトを用いて、危険な可能性のあるコマンドパターンを正規表現で検出している。例えば、「rm -rf /」や「rm -rf ~」といったシステム全体やユーザーの全ファイルを削除する可能性のあるコマンドは「拒否」する設定だ。「git push --force」や「git reset --hard」のように、Gitの履歴やローカルの作業を破壊するコマンド、「drop table」や「drop database」のようにデータベースのデータを消去するコマンド、あるいは空の変数によって削除対象がルートディレクトリになる可能性がある「rmコマンドと変数の組み合わせ」などは、「確認を求める」設定にする。このフックを設定する際には、開発で頻繁に行われる「rm -rf node_modules」のような日常的な削除作業を妨げないよう、許可ルールと拒否・確認ルールを慎重に区別することが重要である。また、このフック機能は、AIエージェントがプロジェクトの機密情報(.envファイル、SSHキーなど)を読み取ろうとするのを防ぐためにも活用でき、特定のパスへの読み取りアクセスを「拒否」することで、情報漏洩のリスクを低減できる。
三番目の防御層は「Gitチェックポイント」だ。サンドボックスやフックで危険なコマンドを阻止しようと試みても、予期せぬ方法で問題がすり抜けてしまう可能性はゼロではない。このような万が一の事態に備え、作業内容を迅速に元に戻せるようにするのがチェックポイントの役割である。記事では、ユーザーがAIエージェントにプロンプトを送信するたびに、現在の作業ツリーの状態を自動的にスナップショットとして保存する「UserPromptSubmitフック」という仕組みが紹介されている。このスナップショットは、通常のgit commitとは異なり、現在のブランチやステージングエリア、git stash(一時的な作業退避場所)に影響を与えない特殊なGitコミットとして作成される。具体的には、一時的なGitインデックスファイルを作成し、現在のすべての変更(追跡対象ファイルと未追跡ファイル)をそこに記録する。そして、この状態を指す新しいコミットを作成し、refs/checkpoints/という特殊な参照名の下に、日時を含んだ名前で保存する。これにより、通常のgit logやブランチの一覧には表示されない「隠れたコミット」として、作業履歴が密かに記録されることになる。もしAIエージェントが誤ってファイルを変更したり削除したりした場合、git for-each-ref refs/checkpoints/コマンドで保存されているチェックポイントの一覧を確認し、復元したい特定の日時のチェックポイントを指定してgit restore --source refs/checkpoints/YYYYMMDD-HHMMSS -- .コマンドを実行すれば、プロジェクト全体の状態をその時点に戻すことができる。AIエージェント自身の/rewind機能は、エージェントが「編集ツール」を使って行った変更にのみ対応できることが多いが、このGitチェックポイントはシェルコマンド経由で行われた変更も含め、すべての変更をカバーできるため、より包括的な復元手段となる。
これらの三層防御は非常に強力だが、それでも完璧ではない。特に、パターンマッチングに基づくフックは、AIエージェントが「ファイルに悪意のあるコードを書き込み、その後そのファイルをシェルコマンドで実行する」といった巧妙な手口を使った場合、検知をすり抜けてしまう可能性がある。そのため、最も強力な防御層であるサンドボックスの役割が依然として重要である。また、これらの対策はあくまで第一線での防御策であり、最終的な安全性を確保するためには、常に最新のバックアップを別途取っておくことや、AIエージェントを実行する環境を隔離されたコンテナ(Dockerなど)内で運用するといった追加の対策も欠かせない。これにより、万が一AIエージェントがシステムに損害を与えてしまっても、その影響を限定的なものにとどめることができる。
AIエージェントを開発作業に導入する際、その生産性の高さからセキュリティ対策を後回しにしがちかもしれない。しかし、ファイル削除といった重大な事故を防ぐためには、サンドボックスによるOSレベルの隔離、フックによる危険なコマンドの事前検出と阻止、そしてGitチェックポイントによる復元能力という、多層的な防御策を講じることが極めて重要だ。これらの対策を適切に設定し、運用することで、AIエージェントがもたらすリスクを大幅に低減し、その恩恵を最大限に享受できる安全な開発環境を構築できるだろう。