X-Forwarded-For ヘッダーを使用したIPスプーフィングについて
root me というサイバー攻撃技術の練習ができるサイトの問題を解く過程でX-Forwarded-Forヘッダーについて調べたのでアウトプットのために記事にしました。
問題の内容
問題の内容はプライベートIPアドレスからのリクエストは認証をせず、それ以外は認証をするのでなんとかして送信元IPアドレスを偽装しようというものでした。
X-Forwarded-Forについて
X-Forwarded-Forはリクエストの送信元IPアドレスをサーバーが取得するためのヘッダーだそうです。一対一で通信を行う場合はこのヘッダーを使用せずとも送信元IPアドレスは簡単に特定できますし、もしX-Forwarded-Forを参照しても一対一では簡単に偽装ができてしまうので危険です。このヘッダーが使われるのはクライアントとサーバーの通信がプロキシを経由するときに使われます。クライアントとサーバーの通信がプロキシを経由する場合、サーバーがX-Forwarded-Forを使用しないで特定できる送信元IPアドレスはプロキシのIPアドレスです。しかし、プロキシのIPアドレスが分かってもあまり嬉しいことがありません。そこでプロキシがそのプロキシにリクエストを送信したノードのIPアドレスをX-Forwarded-Forに追加します。こうすることでサーバーはプロキシを経由した通信であってもクライアントのIPアドレスを知ることができます。またプロキシを複数経由する場合であってもプロキシを通過するたびにその一つ前のノードのIPアドレスを追加するのでサーバーはクライアントのIPアドレスを知ることができます。
クライアント aaa.aaa.aaa.aaa
↓
プロキシ bbb.bbb.bbb.bbb
X-Forwarded-For: aaa.aaa.aaa.aaa
↓
プロキシ ccc.ccc.ccc.ccc
X-Forwarded-For: bbb.bbb.bbb.bbb aaa.aaa.aaa.aaa
↓
サーバー
X-Forwarded-For: bbb.bbb.bbb.bbb aaa.aaa.aaa.aaa
このときサーバーはX-Forwarded-Forの一番右の要素からクライアントのIPアドレスを参照することができます。
危険性
一対一の通信でクライアントのIPアドレスをX-Forwarded-Forから参照しても簡単に偽装されるので危険だと言いましたが、それはプロキシを介する場合であっても同じです。もしもプロキシが悪意を持っていたら簡単にX-Forwarded-Forを偽装することができます。したがってX-Forwarded-Forはクライアントとサーバーが一対一、もしくは信用できないプロキシを介している場合においてはほとんど意味がなく、それを参照してアクセスコントロールを行うことは非常に危険であると言えます。X-Forwarded-Forを使うときはロードバランサーなどの信用できるプロキシによって追加されたIPアドレスのみを使用しなくてはなりません。
IPスプーフィングについて
上で述べたようにサーバーが信用できないノードからのリクエストのX-Forwarded-Forから参照したIPアドレスによってアクセスコントロールを行っている場合、そのノードからリクエストを改竄することで簡単に送信元IPアドレスを偽装することができます。
情報源
最後に
このようなブログ記事も情報源としては非常に良いものだと思いますが、筆者は専門家ではなく、セキュリティの初心者に近い方なので間違った情報を書いている可能性があります。ですからMDNのドキュメントなど信頼できる情報源も参照してください。それから、今回始めてブログというものを書いてみました。情報のアウトプットは大切なので新しいことを学んで体力があるときは書きたいなと思いました。