CodeIgniter4 PHPフレームワークに重大なセキュリティ脆弱性が発見されました。攻撃者はこの脆弱性を悪用してファイルアップロードの検証をバイパスし、影響を受けるWebアプリケーション上でリモートコード実行(RCE)を達成できる可能性があります。
この脆弱性はCVE-2026-48062として追跡されており、GitHubセキュリティアドバイザリ GHSA-2gr4-ppc7-7mhx として公開されています。ネットワーク経由での悪用が可能で、ユーザーの操作を一切必要としないことから、CVSS v3.1スコアは最高評価を記録しています。
脆弱性の根本原因は、CodeIgniter4のext_inバリデーションルールがアップロードファイルを評価する仕組みにあります。本来であればクライアントが送信したファイル名の拡張子を確認すべきところ、このルールはMIMEタイプから推測された拡張子を誤って参照していました。一見些細な違いですが、セキュリティ上は非常に危険な欠陥です。
具体的には、攻撃者がGIFに似たバイナリコンテンツを持つshell.phpというファイルを作成するケースが考えられます。このファイルをアップロードフォームから送信すると、フレームワークはMIMEタイプをimage/gifと判定し、推測された拡張子をgifにマッピングします。たとえば次のようなバリデーションルールがあった場合、
実際のファイル名が.php拡張子を持っていても、エラーなく通過してしまいます。サーバーが「受け取った」と認識するものと「実際に保存される」ものの間にあるこのミスマッチが、この脆弱性を突いた攻撃の核心です。
この脆弱性はCWE-434(危険なファイルタイプの無制限アップロード)に分類されており、OWASPのWebアプリケーションリスクとして継続的に上位にランクインする既知の脆弱性クラスです。
ただし、すべてのCodeIgniter4環境が脆弱なわけではありません。悪用には、複数の条件が同時に揃っている必要があります。まず、アプリケーションがユーザーによるファイルアップロードを受け付け、拡張子の検証にext_inを主要な手段として使用していることが前提です。
さらに、$file->move($path)を使ってクライアントが指定した元のファイル名でアップロードファイルを保存し、そのファイルをWebからアクセス可能なディレクトリに格納したうえで、そのディレクトリでPHPなどのサーバーサイドスクリプトの実行が許可されている必要があります。
これら5つの条件がすべて揃った場合、認証なしのリモート攻撃者が画像に偽装したPHPウェブシェルをアップロードし、ブラウザから直接アクセスすることで対象サーバー上で任意のコマンドを実行できます。
バージョン4.7.2以前のすべてのCodeIgniter4が影響を受けます。この脆弱性はメンテナーのPaulbalandanによってバージョン4.7.3で修正されました。開発者はリスクを完全に排除するため、直ちにv4.7.3以降へアップグレードしてください。
すぐにパッチを適用できないチームには、露出リスクを大幅に低減できるいくつかの暫定対策があります。最も効果的なのは、アップロードファイルをWebルートの外部——たとえばwritable/uploads配下——に保存することです。これにより、ウェブシェルのアップロードに成功されても、ブラウザからアクセスできなくなります。
また、$file->move($path)を$file->store()または$file->move($path, $file->getRandomName())に置き換えることで、攻撃者が制御するファイル名を完全に排除することもできます。
さらに、サーバーレベルの設定で公開アップロードディレクトリ内のPHPスクリプト実行を無効にすることも、強力な防御層となります。
最後の安全策として、ファイルを移動する前に$file->getClientExtension()が許可リストと一致し、かつ$file->guessExtension()と整合していることを手動で確認することで、検証の抜け穴を直接塞ぐことができます。
この脆弱性はセキュリティ研究者のz3mooによって責任ある開示の形で報告され、teebow1eも貢献しています。
ファイルアップロード機能にCodeIgniter4を利用している組織は、特権不要でネットワーク経由から攻撃可能であり、リモートコード実行への直接的な経路が存在するという点を踏まえ、本脆弱性への対応を優先的なパッチ適用として扱うべきです。
翻訳元: https://cyberpress.org/critical-codeigniter-file-upload-flaw/