Skip to content

原文(日本語)

コマンド密輸を防ぐための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

関連情報