【りもーとふぁいるいんくるーじょん】

リモートファイルインクルージョン とは?

最終更新:
💡 取り込み口の不備から、外部のファイルが紛れ込む

ファイル取り込み処理の入力検証の不備を突き、攻撃者が外部のファイルをアプリに取り込ませる脆弱性。コード実行につながるかは、取り込んだ内容や実行環境によって変わります。

📌 このページのポイント
外部ファイルが取り込み口へ 攻撃者 アプリ 外部 入力 要求 応答 入力を、そのまま取り込み先にしない 1 2 許可済みの対応表から選ぶ 一覧にない識別子は拒否 外部読込・コード実行の成立には条件がある
入力が外部URLなどの取り込み先へ不適切に使われると、外部の応答がアプリへ入る。許可済みの識別子とファイルをアプリ側で対応づけ、未知の識別子は拒否する。
ひよこ ひよこ
リモートファイルインクルージョンって何なの?
ペンギン先生 ペンギン先生
取り込み処理の不備を突いて、外部のファイルをアプリに取り込ませる脆弱性だよ。たとえば表示する部品を選ぶ入力が、外部URLの指定としても通ってしまう場合だね。
ひよこ ひよこ
URLを入力する欄があったら危ないの?
ペンギン先生 ペンギン先生
欄があるだけでは決まらないよ。その入力が不適切に取り込み先へ使われ、実行環境も外部ファイルの取り込みを許していることが前提なんだ。
ひよこ ひよこ
外部のファイルを取り込むと、必ずプログラムが動くの?
ペンギン先生 ペンギン先生
必ずではないよ。PHPのincludeは取り込んだ内容を評価するけれど、コードとして実行されるには対応するPHPタグなどが必要なんだ。内容や処理によって、表示の変化や情報漏えいなど影響が変わるよ。
ひよこ ひよこ
ペンギン先生 ペンギン先生
RCEは遠隔からコードを実行できるという結果だよ。この取り込みの不備が原因になる場合もあるんだ。ディレクトリトラバーサルはパス操作で意図した範囲の外へアクセスすることで、外部ファイルの取り込みとは別の着眼点だね。
ひよこ ひよこ
取り込むファイルを選ぶ機能はどう作ればいいの?
ペンギン先生 ペンギン先生
利用者の入力をそのままパスへ渡さない設計にしよう。たとえば許可済みの2種類を番号1・2に対応づけ、一覧にない番号は拒否するんだ。番号からファイルへの対応はアプリ側で管理するよ。
もっと詳しく知りたい人へ

外部サーバーがPHPを実行した結果でも、取り込み側で再び実行されるの?

取り込み側が受け取るのは外部サーバーの応答です。PHPのincludeではその応答が取り込み側でも処理されるため、応答中に有効なPHPコードがあれば評価され得ます。外部サーバーのソースコードを必ずそのまま受け取るわけではありません。URL経由の取り込みには、対応するURLラッパーが有効という前提もあります。

PHPではURLを読み込める設定ならincludeにも使える?

allow_url_fopenとallow_url_includeは別の設定です。URL経由でincludeやrequireを行う設定には、allow_url_fopenも必要になります。allow_url_includeの既定値は無効で、PHP 7.4以降は非推奨です。設定を無効にすることに加え、入力を直接ファイルパスへ渡さない設計も必要です。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「リモートファイルインクルージョン」って出てきたら「取り込み処理の不備で、外部のファイルを紛れ込ませる脆弱性」と思えばだいたいOK!
📖 おまけ:英語の意味
「Remote File Inclusion」 = 遠隔にあるファイルの取り込み
💬 Remoteは遠隔、Inclusionは取り込むことだよ。セキュリティでは、外部ファイルを取り込ませる脆弱性を指すんだよ。

参考資料

← 用語集にもどる