記事が古い場合や新しいバージョンの記事の公開を希望する場合はこのボタンを押してください。但し、記事の更新が行われるとは限りません。

    脆弱性基本情報


    影響を受けるバージョン


    <= 7.2.1

    プラグインスラッグ


    wp-file-manager

    共通脆弱性識別子


    CVE-2024-0761

    脆弱性情報公開日


    2024 / 01 / 22

    パッチ情報


    修正バージョン 7.2.2 が 2024/01/18 にリリース

    脆弱性発見者


    Yuki Haruma – このブログの管理者

    プラグイン File Manager について(執筆時点)


    有効インストール数


    100万ダウンロード

    累計ダウンロード数


    2,100万ダウンロード

    File Managerのプラグインカード
    File Managerのプラグインカード

    どのようなプラグイン?

    WordPress管理画面から直接ファイルやフォルダーを編集、削除、アップロード、ダウンロード、圧縮、コピー&ペーストが出来るようになる。付随する機能としてバックアップ&復元がある。

    脆弱性詳細


    脆弱性発生原因

    PHP の rand 関数の不適切なランダム値生成範囲指定

    0~9999の値をランダムに生成し、バックアップファイル名の一部に使用している。

    そのため、生成されるバックアップファイル名は
    backup_[年]_[月]_[日]_[時]_[分]_[秒]_[0-9999ランダム]-[バックアップファイルタイプ]
    となる。

    この仕様により、攻撃者がバックアップを作成した日時が推測できる場合、バックアップファイルを取得できる可能性が高くなる。

    原因コード

    PHP
    $file_number = 'backup_'.date('Y_m_d_H_i_s-').rand(0,9999);
    .htaccess の使用を前提とした設計

    バックアップファイルやログファイルへの URL を用いた直接アクセスに対して、バックアップディレクトリに .htaccess を生成する事で、アクセス制限を施している。

    しかし、 .htaccess が使用できない環境

    • nginx サーバー
    • Apache サーバー
      /var/www/html ディレクトリに対して、 httpd.conf で AllowOverride None のままになっている場合

    などを使用している場合、バックアップファイルやログファイルへの直接アクセスがログイン無し・権限不要でアクセスできてしまう。

    プラグイン有効化日時の推測が可能

    仕様上、プラグイン有効化時にバックアップディレクトリに index.html が自動生成される。

    このファイルは前述の通り、 .htaccess が機能していない場合に誰でもダウンロードが可能であり、ファイルのメタデータから最終更新日時を取得することで、プラグインの有効化日時の取得が出来る。

    これらの原因が組み合わさることにより、プラグインの有効化後数分以内に管理者がバックアップを実行した場合、バックアップファイルを簡単に取得できてしまう。

    脆弱性対策(ユーザー側)

    今回の脆弱性は .htaccess が実行可能な環境の用意や短期間での連続したアクセスが拒否できていれば、攻撃者の攻撃難易度が高くなり、現実的に悪用可能な脆弱性になり得ないと考える。

    また、他にも .htaccess の実行環境に依存しているプラグインが多く存在しているため、ユーザー側は以下の通りの対策を行うことで、対策が可能であると考える。

    セキュリティー系プラグインの導入

    大抵のセキュリティープラグインは連続した不審なアクセスをブロックする機能がある。
    無料版でもインストールすることで対策になり得ると考える。

    WordFence Security Plugin Card
    WordFence Security Plugin
    Solid Security Plugin Card
    Solid Security Plugin
    All-In-One Security Plugin Card
    All-In-One Security Plugin
    Jetpack Plugin Card
    Jetpack Plugin
    .htaccess が利用可能なウェブサーバーの利用

    .htaccess の利用は他のプラグインでも必須条件になっている事が多いため、 .htaccess が利用可能な Apache サーバーを利用する事をお勧めする。

    脆弱性対策(ベンダー側)

    rand 関数のランダム値の生成範囲を広げれば脆弱性になりづらいが、 rand 関数は仕様上完全にランダムに生成されているとは言えない。

    そのため、ベンダー側は以下のような仕様に変更するべきだと勧告した。

    openssl_random_pseudo_bytes 関数の利用 [推奨案]

    暗号学的にセキュアな値を生成する openssl_random_pseudo_bytes 関数を利用し、予測困難なファイル名を生成する。

    使用例

    PHP
    bin2hex(openssl_random_pseudo_bytes(1)) # Ex. 9f
    bin2hex(openssl_random_pseudo_bytes(4)) # Ex. 305a867d

    openssl_random_pseudo_bytes 関数について

    md5 関数 + rand 関数

    rand 関数を使用するよりかは安全だが、上記案の openssl_random_pseudo_bytes 関数よりかは安全ではない。しかし、PHPのバージョン互換性を維持するためには、この案を採用する事も視野に入れるべきであると考える。

    使用例

    PHP
    substr(md5(rand()), 24) # Ex. 28b24c84

    また、ベンダー側には勧告していないが以下の対策もよりセキュアにするうえで有効であると考える。

    実行環境の判定

    .htaccess が利用可能であるかどうかをプラグイン内で判定し、利用可能でない場合は

    • Apache サーバーの利用を推奨
    • nginx サーバーを利用している場合に nginx.conf に対してアクセス制限用の記述を追加するよう警告
    • .htaccess の利用が必須な機能を無効化

    などを行う機能を追加する。

    バックアップファイルをPHPに

    バックアップファイルを .php にすることで、 ログイン無し・権限無しでダウンロードする事が出来なくなるのではないかと考える。
    (未検証)

    修正パッチ


    修正バージョン 7.2.2 にて以下の通り修正された。

    修正前

    PHP
    $file_number = 'backup_'.date('Y_m_d_H_i_s-').rand(0,9999);

    修正後

    PHP
    $file_number = 'backup_'.date('Y_m_d_H_i_s-').bin2hex(openssl_random_pseudo_bytes(4));

    投稿者 Yuki H

    ウェブセキュリティーに関する記事を中心に、役に立ちそうな記事を執筆しています。 備忘録的な感じも兼ねて執筆しております。 ウェブセキュリティー以外の情報に関しても気まぐれに投稿していこうかと思います。

    Related

    コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です

    このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください