X-Forwarded-For の信頼
AP サーバはリバースプロキシ RP(192.0.2.10)からの接続だけを受け付ける。RP は 1 台で,受信した接続の送信元 IP アドレスを X-Forwarded-For ヘッダの末尾に追加する。AP サーバは,X-Forwarded-For の先頭の値が 203.0.113.0/24 の場合だけ管理画面を表示する。AP サーバに次のログが記録されていた場合の記述として,適切なものはどれか。
remote=192.0.2.10 method=GET path=/admin/ status=200 xff="203.0.113.50, 198.51.100.77"- アX-Forwarded-For の先頭は元のクライアントのアドレスであり,198.51.100.77 は経由したプロキシのアドレスなので,203.0.113.50 からの正当な接続と判断できる。
- イRP が追加したのは末尾の 198.51.100.77 で,これが RP に接続した送信元である。203.0.113.50 は接続元が付けた値の可能性があるので,信頼する RP が追加した値で判定すべきである。
- ウX-Forwarded-For は詐称され得るので,AP サーバが受け付けた接続の送信元アドレス(remote の値)で判定するように変更すれば,接続元を正しく判別できる。
- エX-Forwarded-For の値を全て検査し,いずれか一つが 203.0.113.0/24 に含まれれば表示するように変更すれば,詐称による不正な表示を防げる。
正解と解説を見る
正解 イ
この問題の基礎知識
- X-Forwarded-For は,プロキシが受信した接続の送信元 IP アドレスを末尾に追加していくヘッダであり,正しく運用されていれば「クライアント, プロキシ 1, プロキシ 2」の順に並ぶ。
- HTTP のヘッダはクライアントが任意に設定できるので,プロキシに届いた時点で X-Forwarded-For に偽の値が含まれていることがある。プロキシは既存の値の末尾に追加するので,先頭側の値は信頼できない。
- サーバが TCP の接続で直接見る送信元アドレスは直前の接続元であり,リバースプロキシを経由する構成ではプロキシのアドレスになる。
- アクセス制御に X-Forwarded-For を使う場合は,信頼するプロキシが追加した値だけを使い,末尾から信頼するプロキシの台数に応じて数えた位置の値を採用する。
アX-Forwarded-For の先頭は元のクライアントのアドレスであり,198.51.100.77 は経由したプロキシのアドレスなので,203.0.113.50 からの正当な接続と判断できる。
先頭の値が元のクライアントだと言えるのは,経路上の全てのクライアントとプロキシが正しく振る舞う場合だけである。先頭の値は接続元が自由に設定できるので,正当と判断する根拠にならない。
イRP が追加したのは末尾の 198.51.100.77 で,これが RP に接続した送信元である。203.0.113.50 は接続元が付けた値の可能性があるので,信頼する RP が追加した値で判定すべきである。正解
信頼できるのは信頼するプロキシが追加した部分だけであり,RP が 1 台なら末尾の値を使う。先頭の値で判定すると,接続元がヘッダを付けるだけでアクセス制御を回避できる。
ウX-Forwarded-For は詐称され得るので,AP サーバが受け付けた接続の送信元アドレス(remote の値)で判定するように変更すれば,接続元を正しく判別できる。
AP サーバは RP からの接続だけを受け付けるので,remote の値は常に RP の 192.0.2.10 になる。この値では元のクライアントを区別できず,全ての接続を同じ送信元として扱うことになる。
エX-Forwarded-For の値を全て検査し,いずれか一つが 203.0.113.0/24 に含まれれば表示するように変更すれば,詐称による不正な表示を防げる。
接続元が付けた値もリストに含まれるので,いずれか一つが一致すれば許可する方式では,203.0.113.0/24 のアドレスを付けるだけで許可されてしまう。詐称の対策にならない。
検証用の出典出典照合済み
MDN Web Docs: X-Forwarded-For header / RFC 7239 Forwarded HTTP Extension照合の根拠(5 件)
- イ(正解): アクセス制御には信頼するプロキシが追加した値だけを使う
Any security-related use of `X-Forwarded-For` (such as for rate limiting or IP-based access control) _must only_ use IP addresses added by a trusted proxy.
MDN Web Docs: X-Forwarded-For · Security and privacy concerns(新しいタブで開きます) - イ(正解): RP が 1 台なら RP が追加した末尾の 198.51.100.77 が RP への接続元である
For example, if there is only one reverse proxy, that proxy will add the client's IP address, so the rightmost address should be used.
MDN Web Docs: X-Forwarded-For · Selecting an IP address(新しいタブで開きます) - ア(誤り)・エ(誤り): RP が追加していない 203.0.113.50 は詐称され得るので,先頭やいずれか一つの値で許可する判定は詐称を防げない
If any proxy is malicious or misconfigured, any part of the header not added by a trusted proxy may be spoofed or may have an unexpected format or contents.
MDN Web Docs: X-Forwarded-For · Security and privacy concerns(新しいタブで開きます) - ア(誤り): 先頭が元のクライアントと言えるのはクライアントとプロキシが正しく振る舞う場合に限られる
This means that the rightmost IP address is the IP address of the most recent proxy and the leftmost IP address is the address of the originating client (assuming well-behaved client and proxies).
MDN Web Docs: X-Forwarded-For · Description(新しいタブで開きます) - ウ(誤り): AP サーバから見える接続元(remote)は常に RP の 192.0.2.10 なので,元のクライアントを区別できない
If a client connection passes through any forward or reverse proxies, the server only sees the final proxy's IP address, which is often of little use.
MDN Web Docs: X-Forwarded-For · Description(新しいタブで開きます)