sandbox設定を信頼していませんか
Claude Codeのsettings.jsonにsandbox.filesystem.denyWriteを設定している方へ。
Writeツール・Editツールは、その制限を無視します。
これはバグです。2026年2月に最初に報告され(#29048)、3月に再報告(#33681)、4月23日に3度目の報告(#52325)がされています。2026年4月23日時点で未修正です。
何が起きているのか
sandbox設定はこういう構造になっています:
{
"sandbox": {
"filesystem": {
"denyWrite": ["/"],
"allowWrite": ["/your/project/dir", "/tmp"]
}
}
}
この設定の意図は「指定ディレクトリ以外への書き込みを禁止する」こと。
実際の挙動:
| ツール | denyWrite制限 | 理由 |
|---|---|---|
| Bash | ✅ 効く | bubblewrap/sandbox-execでカーネルレベルの制限がかかる |
| Write | ❌ 効かない | Node.jsのfs.writeFileでin-process実行。sandbox制限を経由しない |
| Edit | ❌ 効かない | 同上 |
Bashツールだけがsandbox制限を受け、Write/Editツールは素通りする。
なぜ危険か
#40321では、この非対称性が原因で2,500以上のファイルが破壊されました。
仕組みはこうです:
- Readはsandbox内を参照する → Claudeには本物のファイルが見えない
- Writeはsandbox外に書き込む → 本物のファイルを上書きする
- Claudeは「存在しないファイルへの新規作成」だと認識して、躊躇なく書き込む
Claudeに悪意はない。自分が見えている世界に基づいて正直に行動した結果です。しかし見えている世界と書き込み先が別のファイルシステムだったため、既存のファイルが次々と上書きされた。
今すぐできる回避策
Anthropicの修正を待つ間、hookで自衛できます。
方法1:Write/EditをdenyWriteパスで検査するhook
PreToolUseフックで、Write/Editの書き込み先がallowWrite外かどうかを検査します。
#!/bin/bash
# sandbox-write-guard.sh
# .claude/settings.json → hooks.PreToolUse[matcher="Write|Edit"]
INPUT=$(cat)
FILE=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty' 2>/dev/null)
[ -z "$FILE" ] && exit 0
# allowWriteに相当するパスリスト(自分のプロジェクトに合わせて変更)
ALLOWED_PATHS=(
"/home/user/myproject"
"/tmp"
)
ALLOWED=false
for path in "${ALLOWED_PATHS[@]}"; do
case "$FILE" in
"$path"/*) ALLOWED=true; break ;;
esac
done
if [ "$ALLOWED" = false ]; then
echo "BLOCKED: Write to $FILE is outside allowed paths" >&2
echo " Allowed: ${ALLOWED_PATHS[*]}" >&2
echo " sandbox.filesystem.denyWrite does not apply to Write/Edit tools." >&2
echo " See: https://github.com/anthropics/claude-code/issues/52325" >&2
exit 2
fi
方法2:大量書き込みを検出するhook
sandbox非対称性で被害が連鎖するのを防ぎます。60秒以内に10ファイルを超える書き込みを検出したらブロック。
#!/bin/bash
# bulk-write-guard.sh
# .claude/settings.json → hooks.PreToolUse[matcher="Edit|Write"]
INPUT=$(cat)
FILE=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty' 2>/dev/null)
[ -z "$FILE" ] && exit 0
WRITE_LOG="/tmp/cc-write-guard-${PPID}"
echo "$(date +%s) $FILE" >> "$WRITE_LOG" 2>/dev/null
NOW=$(date +%s)
RECENT=$(awk -v now="$NOW" '$1 > now - 60 {count++} END {print count+0}' "$WRITE_LOG" 2>/dev/null)
if [ "$RECENT" -gt 10 ]; then
echo "BLOCKED: ${RECENT} files written in 60 seconds" >&2
echo " This may indicate sandbox read/write mismatch (Issue #40321)." >&2
exit 2
fi
settings.jsonへの設定
{
"hooks": {
"PreToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "bash ~/.claude/hooks/sandbox-write-guard.sh"
}
]
}
]
}
}
まとめ
- sandbox設定のdenyWrite/allowWriteはBashツールにしか効かない
- Write/Editツールはsandbox制限を素通りする(2026-04-23時点で未修正)
- 3回報告されている既知のバグ。自衛が必要
- hookでWrite/Editの書き込み先を検査するのが現実的な回避策
関連Issue: