IPv4にマッピングされたIPv6の信頼サブネットを介したIPスプーフィングの脆弱性
### 影響
`proxy-addr`は、どのネットワークホップが信頼できるプロキシであるかを判断し、それによって`X-Forwarded-For`ヘッダーが信頼できると判断されます。アプリケーションが、短いプレフィックスを持つIPv4にマッピングされたIPv6アドレスを信頼サブネットとして設定する場合(例:`::ffff:10.0.0.0/8`。正しい表記は`::ffff:10.0.0.0/104`)、そのサブネットは先頭のすべてのビットがゼロで構成され、意図したブロックではなく、すべてのIPv4アドレスと一致してしまいます。同様に、先頭のビットがゼロのIPv6の信頼サブネット(例:`::/1`)でも同じ問題が発生します。
認証されていないすべてのクライアントが、ホップ0でプロキシとして信頼されるため、Expressにおける`proxyaddr(req, trust)`、そして`req.ip`と`req.ips`は、クライアントが`X-Forwarded-For`ヘッダーに送信した値をそのまま返します。これにより、IPアドレスに基づくアクセス制御、レート制限、位置情報判定、および監査ログが機能しなくなります。この誤った設定はエラーを発生させずに適用されます。一方、正しく記述された同じブロックは正しく動作するため、設定からはその違いがわかりません。
### 修正
`proxy-addr`をバージョン2.0.8にアップグレードしてください。IPv4アドレスは、そのサブネットが、マッピングされたアドレスのプレフィックスをカバーする、真正なIPv4にマッピングされたサブネットである場合にのみ、IPv6の信頼サブネットと一致します。
### 対策
IPv4の信頼サブネットを、プレーンなIPv4表記で記述してください(例:`10.0.0.0/8`)。IPv4にマッピングされたIPv6表記が必要な場合は、プレフィックスがマッピングされたアドレスをカバーする完全な形式を使用してください(例:`10.0.0.0/8`のブロックの場合、`::ffff:10.0.0.0/104`)。
影響を受けるパッケージ:
- npm (JavaScript) proxy-addr: 影響あり >= 1.1.0, < 2.0.8、2.0.8で修正済み。