0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeのsandbox設定、Writeツールには効いていません——denyWriteバイパス問題と回避策

0
Posted at

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以上のファイルが破壊されました。

仕組みはこうです:

  1. Readはsandbox内を参照する → Claudeには本物のファイルが見えない
  2. Writeはsandbox外に書き込む → 本物のファイルを上書きする
  3. 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:

  • #52325 — 通常モードでのバイパス(2026-04-23)
  • #33681--dangerously-skip-permissionsでのバイパス
  • #29048 — Agent SDK bypassPermissionsモードでのバイパス
  • #40321 — 非対称性による2,500ファイル破壊事故
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?