すべてのネットワークインターフェースへのバインド

すべてのインターフェースへのバインドが、意図したアクセス範囲に合っているか確認してください。

説明

0.0.0.0にバインドすると、ローカルのすべてのIPv4インターフェースで接続を受けられます。実際の外部アクセスは、サービスの待ち受け状態、経路、ファイアウォールなどによって決まります。公開サービスには必要な場合がありますが、内部管理用ポートやデバッグサーバーまで外部から到達できると危険です。

想定される影響

  • 意図しないクライアントが管理機能やデバッグ情報にアクセスする可能性があります。
  • 外部から到達できるサービスに認証などの不備があると、攻撃に利用される可能性があります。
  • アクセス可能な機能とデータによっては、機密情報が漏えいする可能性があります。

対処方法

  • 同じホスト内だけで使うサービスは127.0.0.1にバインドしてください。他のホストからのアクセスが必要なら、使用するインターフェースと許可するクライアントを決めてください。
  • ファイアウォールで必要な接続元とポートだけを許可してください。
  • 公開サービスには認証、アクセス制御、TLSを適用し、管理機能やデバッグ機能を分離してください。

例

ソケットのバインド部分の抜粋です。サーバーの待ち受け処理や他の設定は省略しています。

変更前

python
# Unsafe socket binding all network
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 44444))

変更後

python
# Safe socket binding to restricted network
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 44444))

解説

  • 変更前: AF_INETでは、0.0.0.0や空文字列""はローカルのすべてのIPv4インターフェースを選びます。外部への接続経路があれば、意図した範囲を超えてサービスが公開される可能性があります。
  • 変更後: 127.0.0.1は接続を同じホスト内に限定します。ホスト内からのアクセスにも、認証と権限確認は別途必要です。

参考資料