[非エンジニア向け] ウェブサイトの隠れた危険?ローカルファイルインクルージョン(LFI)入門 🤔

用語解説

知らないうちに情報が漏れているかも?

LFIってなに?難しく考えないで!

ローカルファイルインクルージョン(Local File Inclusion、略してLFI)とは、ウェブサイトが、本来は見せてはいけないはずのサーバー内部のファイルの中身を、うっかり見せてしまう問題のことです 📁。

ウェブサイトは、ページを表示するために色々な部品(ファイル)を組み合わせています。例えば、ヘッダー部分やフッター部分を別のファイルにしておき、必要なページでそれを「取り込んで(インクルードして)」表示する、といった具合です。

LFIは、この「ファイルを取り込む」機能が悪用されることで発生します。攻撃者は、ウェブサイトの作りの甘さ(脆弱性)を突いて、「このファイルを取り込んで見せて!」と、通常ではアクセスできないはずのファイル(例えば、設定ファイルや個人情報リストなど)を指定します。ウェブサイトがその要求を鵜呑みにしてしまうと、情報漏洩につながってしまうのです。

😵 簡単に言うと、ウェブサイトに「秘密のメモを見せて!」と頼んだら、うっかり見せてしまうような状態です。

LFIが起こると、どんなに怖いことが起きるの? 😱

LFI脆弱性があると、様々な問題が発生する可能性があります。

被害の種類具体的にどうなる?
機密情報の漏洩ウェブサイトの設定情報、パスワードが保存されているファイル、プログラムの設計図(ソースコード)など、外部に見せてはいけない情報が盗まれてしまいます。
ユーザー情報の漏洩会員サイトなどの場合、登録されているユーザーの名前、メールアドレス、住所などの個人情報がリストごと盗まれる可能性があります。
サーバー乗っ取りの足がかり盗んだ情報を元に、さらに別の攻撃を仕掛けられ、最終的にサーバーを乗っ取られてしまう危険性があります。乗っ取られると、ウェブサイトを改ざんされたり、他の人を攻撃するための踏み台にされたりします。
サービス停止重要なファイルを読み込ませることで、サーバーに大きな負荷をかけたり、動作をおかしくさせたりして、ウェブサイトが利用できなくなることがあります。

このように、LFIはウェブサイトやその利用者にとって非常に深刻な被害をもたらす可能性があるのです。

どうしてLFIが起きちゃうの? 🤔

LFIが起こる主な原因は、ウェブサイトの作り方、特にユーザー(サイトを見る人)からの入力を安全かどうかチェックせずに使ってしまうことにあります。

例えば、ウェブサイトのURLの一部を使って、表示する内容を指定している場合があります。
例: http://example.com/show_page.php?page=about.html

この例では、URLの `?page=about.html` の部分で、「about.html」というファイルを表示するように指示しています。

ここで問題なのが、もしウェブサイトがこの `page=` の部分に入力された値をしっかりチェックしていない場合です。攻撃者は、この部分を書き換えて、サーバー内部のファイルへの道筋(パス)を指定することができます。
例: http://example.com/show_page.php?page=../../../../etc/passwd

`../../` は、「一つ上のフォルダへ移動する」という意味です。これを繰り返すことで、本来アクセスできないはずのシステムファイル(例: `/etc/passwd` – Linuxシステムでのユーザー情報ファイル)にたどり着き、その中身を盗み見ることができてしまうのです。

💡 要するに、「見せるファイルの名前は、ユーザーが指定したものをそのまま使う」という単純な作りになっていると、悪用されやすいということです。

実際にあったLFIの事件・事例はあるの? 😨

はい、LFI脆弱性は多くのウェブサイトやソフトウェアで発見されており、実際に被害も発生しています。

  • TimThumb (2011年): WordPressというブログ作成ツールで広く使われていた画像編集用のアドオン(追加機能)「TimThumb」にLFI脆弱性が見つかりました。この脆弱性を悪用され、2011年だけで120万以上のウェブサイトが改ざんなどの被害を受けたと報告されています。
  • weather.gov (2012年): アメリカ合衆国の国立気象局 (National Weather Service) のウェブサイトがLFI攻撃を受け、機密情報が盗まれました。
  • RedHatのウェブサイト (2013年): 有名なLinux関連企業であるRedHat社のウェブサイトで、LFIを含む複数の脆弱性が発見されました。
  • Whatsappのメディアサーバー (2013年): 人気メッセージアプリWhatsappの画像などを扱うサーバーにLFI脆弱性があり、ユーザー情報を含むファイルがアクセス可能になっていました。

これらはほんの一例です。LFIは、ウェブサイトを作る際に使われるプログラミング言語(特にPHP)や、様々なソフトウェア(CMSのプラグインなど)で見つかることがある、比較的一般的な脆弱性なのです。

開発者の人はどう対策すればいいの? 🛡️

ウェブサイトを作る開発者の皆さんは、LFIを防ぐために以下の点に気をつける必要があります。

  • ユーザーからの入力を信用しない: これが基本原則です!ユーザーが入力する値(URLパラメータ、フォームの入力など)は、常に悪意のあるものである可能性を考えて扱います。
  • ファイル名を直接指定させない: ユーザーの入力に基づいてファイル名を決定する場合、ファイル名そのものではなく、安全な識別子(IDなど)を使うように設計します。データベースなどにファイル名とIDの対応を保存しておく方法があります。
  • 許可リスト(ホワイトリスト)を使う: どうしてもファイル名を指定する必要がある場合は、「このファイル名だけは安全だから許可する」というリストを作り、リストにあるファイル以外は読み込めないようにします。
  • 入力値を無害化(サニタイズ)する: ユーザーの入力に含まれる `../` のような危険な文字列をチェックし、除去したり、エラーにしたりします。ただし、これだけに頼るのは危険です。攻撃者は様々な方法でチェックをすり抜けようとします。
  • 適切なアクセス権限を設定する: ウェブサーバーの実行ユーザーが必要最小限のファイルにしかアクセスできないように、権限を適切に設定します。
  • WAF(Web Application Firewall)を導入する: WAFは、怪しい通信パターンを検知してブロックしてくれる盾のようなものです。LFI攻撃のパターンを検知して防ぐのに役立ちます。
  • 脆弱性診断を定期的に行う: 専門家やツールを使って、ウェブサイトにLFIなどの脆弱性がないか定期的にチェックします。
  • ソフトウェアを最新に保つ: 使用しているOS、ウェブサーバーソフトウェア、プログラミング言語、フレームワーク、CMSなどを常に最新の状態に保ち、既知の脆弱性を修正します。
✅ 複数の対策を組み合わせることが、より安全なウェブサイトを作る鍵となります。

まとめ ✨

ローカルファイルインクルージョン(LFI)は、ウェブサイトの内部ファイルを不正に覗き見られたり、悪用されたりする危険な脆弱性です。

非エンジニアの方も、「自分の使っているウェブサイトは大丈夫かな?」と少しだけ意識してみると良いかもしれません。そして、ウェブサイトを作る開発者の皆さんは、ユーザーからの入力を慎重に扱い、適切な対策を講じることが非常に重要です。

安全なインターネット利用のために、みんなでセキュリティ意識を高めていきましょう! 💪

コメント

タイトルとURLをコピーしました