ローカルファイルインクルージョン(LFI)は、攻撃者がサーバー上のファイルを不正に読み取る、または実行させる攻撃手法です。主に、Webアプリケーションがファイルを動的にインクルードする際に、適切な入力検証が行われていない場合に発生します。この脆弱性を利用することで、攻撃者はサーバーの内部ファイル(設定ファイルやパスワードファイルなど)を読み取ったり、任意のコードを実行したりすることが可能になります。
LFIの仕組み
Webアプリケーションは、多くの場合、ユーザーからの入力を基に動的にファイルを読み込みます。例えば、特定のページを表示するために、ファイルのパスをパラメータとして受け取り、そのファイルをインクルードして表示するケースがあります。
例として、次のようなコードを考えてみます。
<?php $page = $_GET['page']; include($page . ".php"); ?>
このコードは、pageというパラメータをもとに、指定されたファイルをインクルードしています。しかし、適切な入力検証が行われていない場合、攻撃者は次のようにリクエストを送ることで、任意のファイルを読み取ることができます。
http://example.com/index.php?page=../../etc/passwd
このリクエストでは、../../etc/passwdというパスを利用してサーバーの/etc/passwdファイル(Linuxシステムのユーザー情報が含まれるファイル)を表示させることが可能です。これは、ファイルパスの検証が行われていないために起こる脆弱性です。
LFIの影響
ローカルファイルインクルージョン攻撃によって引き起こされるリスクは非常に深刻です。主な影響は以下の通りです。
機密情報の漏洩
サーバーの設定ファイルやパスワードファイルなど、システムにとって重要な機密情報が攻撃者に漏洩する可能性があります。
任意コードの実行
攻撃者が任意のファイルをサーバーにアップロードし、それをインクルードさせることで、サーバー上で任意のコードが実行される恐れがあります。
ファイルの改ざんや削除
攻撃者がサーバー上のファイルにアクセスできるため、ファイルを変更したり削除することも可能になります。
LFIとRFIの違い
LFIと似た攻撃手法にリモートファイルインクルージョン(RFI)があります。LFIはサーバー内のローカルファイルを対象にした攻撃であるのに対し、RFIは外部からリモートのファイルをインクルードさせる攻撃です。RFIでは、攻撃者が外部に用意した悪意のあるスクリプトをサーバー上で実行させることが可能です。
LFIの防御策
ローカルファイルインクルージョンを防ぐためには、いくつかの重要な対策を実施する必要があります。
ユーザー入力の厳密な検証
ユーザーからの入力をファイルパスに利用する場合は、入力の妥当性を検証し、意図しないファイルが読み込まれないようにします。特に、ディレクトリトラバーサルのパターン(../)や危険な文字列をエスケープすることが重要です。
ファイルパスのハードコード化
ユーザー入力に依存せず、インクルードするファイルのパスは固定されたものを使用します。例えば、ファイル名にIDを使うのではなく、サーバー側であらかじめ許可されたファイルをハードコードして管理します。
ディレクトリの制限
PHPなどの設定で、特定のディレクトリの外にアクセスできないようにする制限を設けます。open_basedir設定などを活用して、ファイル読み込みが許可される範囲を限定します。
エラーメッセージの抑制
インクルード時にエラーメッセージが表示されると、攻撃者にシステムの情報が漏洩する可能性があります。エラーメッセージはユーザーに直接表示されないように設定し、代わりに適切にログに記録します。
Webアプリケーションファイアウォール(WAF)の導入
WAFを利用することで、LFI攻撃のパターンを自動的に検出し、攻撃を未然に防ぐことが可能です。
LFIの具体例
以下は、LFI攻撃が実際に発生した例の一つです。
CVE-2014-0914(IBM WebSphere Application ServerのLFI脆弱性)
この脆弱性では、WebSphere Application Serverが外部から提供されたファイル名を検証せずにインクルードしてしまい、ローカルファイルの内容が漏洩するという問題がありました。このような大規模なソフトウェアの脆弱性が発見されると、多くのシステムが影響を受けることになります。
まとめ
ローカルファイルインクルージョンは、適切な入力検証が行われていないWebアプリケーションに深刻なセキュリティリスクをもたらします。攻撃者にサーバー上のファイルを読み取られたり、任意のコードを実行されることで、システムの完全性が損なわれる可能性があります。
LFIを防ぐためには、ユーザー入力の徹底的な検証や、ファイルパスの固定化、ディレクトリの制限といった対策を講じることが重要です。また、WAFなどのセキュリティツールも活用し、多層的な防御体制を整えることが推奨されます。