原文(日本語)
コマンド密輸を防ぐためのheredocデリミタ解析を改善
原文(英語)
Improved heredoc delimiter parsing to prevent command smuggling
概要
Claude Code 2.1.38では、Bashのheredoc(ヒアドキュメント)構文の解析機能が改善され、コマンド密輸攻撃(command smuggling)を防ぐセキュリティが強化されました。これにより、悪意のあるコマンドが埋め込まれたheredocが実行されるリスクが軽減されます。
基本的な使い方
特別な操作は不要です。Claude Codeが自動的にheredocを安全に解析・実行します。
bash
# heredocの基本的な使い方
cat <<EOF
複数行の
テキストを
ここに記述
EOF実践例
Git コミットメッセージの安全な作成
複数行のコミットメッセージを作成する際、セキュリティが確保されます。
bash
# 安全なコミットメッセージの作成
git commit -m "$(cat <<'EOF'
feat: 新機能の追加
- ユーザー認証機能を実装
- パスワードリセット機能を追加
- セッション管理を改善
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
EOF
)"ファイルへの安全な書き込み
複数行のコンテンツをファイルに書き込む際、不正なコマンド実行を防ぎます。
bash
# 設定ファイルの作成
cat <<EOF > config.json
{
"api_endpoint": "https://api.example.com",
"timeout": 5000,
"retry_attempts": 3
}
EOFスクリプト内でのheredoc使用
スクリプトファイル内でheredocを使用する際も安全性が保たれます。
bash
# deploy.sh の例
#!/bin/bash
# 環境変数の設定
export DATABASE_URL="postgresql://localhost:5432/mydb"
# SQLクエリの実行
psql $DATABASE_URL <<SQL
BEGIN;
UPDATE users SET last_login = NOW() WHERE id = 1;
COMMIT;
SQL
echo "デプロイ完了"複雑な入力データの処理
JSONやYAMLなどの構造化データをheredocで扱う場合。
bash
# APIリクエストボディの作成
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d "$(cat <<'JSON'
{
"name": "John Doe",
"email": "john@example.com",
"role": "developer"
}
JSON
)"セキュリティの改善点
コマンド密輸攻撃の防止
攻撃例(修正前に脆弱だった可能性):
bash
# 悪意のあるデリミタを使った攻撃の試み
cat <<EOF
正常なテキスト
EOF
rm -rf / # 危険なコマンド
# 真のEOF修正後の動作:
- デリミタの解析が厳密になり、不正なコマンドの挿入を検出
- 予期しないコマンド実行を防止
- サンドボックスモードでの保護が強化
クォートされたデリミタの適切な処理
bash
# シングルクォートで囲まれたデリミタ(変数展開を防ぐ)
cat <<'EOF'
$HOME は展開されない
$(command) も実行されない
EOF
# ダブルクォートで囲まれたデリミタ(変数展開を許可)
cat <<"EOF"
$HOME は展開されない
EOF
# クォートなしのデリミタ(変数展開を許可)
cat <<EOF
$HOME は展開される
EOF注意点
- 後方互換性: 正当なheredocの使用方法には影響しません
- サンドボックスモード: より厳格な制限が適用されます
- デリミタの命名: 標準的なデリミタ名(EOF, SQL, JSON など)の使用を推奨
- エスケープ処理: バックスラッシュによるエスケープも正しく処理されます
ベストプラクティス
安全なheredocの書き方
bash
# 推奨: シングルクォートでデリミタを囲む(変数展開が不要な場合)
cat <<'EOF'
静的なテキスト
コマンド置換なし
EOF
# 変数展開が必要な場合はクォートなし
cat <<EOF
ユーザー: $USER
ホーム: $HOME
EOF
# デリミタは明確で一般的な名前を使用
# 良い例: EOF, SQL, JSON, YAML, HTML
# 避けるべき: X, E, 1, あいまいな文字列入力データの検証
bash
# ユーザー入力を含む場合は検証を追加
if [[ "$user_input" =~ ^[a-zA-Z0-9_]+$ ]]; then
cat <<EOF > output.txt
ユーザー入力: $user_input
EOF
else
echo "無効な入力"
exit 1
fi