脆弱性基本情報
脆弱性情報公開日
2024 / 01 / 22
パッチ情報
修正バージョン 7.2.2 が 2024/01/18 にリリース
プラグイン File Manager について(執筆時点)
有効インストール数
100万ダウンロード
累計ダウンロード数
2,100万ダウンロード
どのようなプラグイン?
WordPress管理画面から直接ファイルやフォルダーを編集、削除、アップロード、ダウンロード、圧縮、コピー&ペーストが出来るようになる。付随する機能としてバックアップ&復元がある。
脆弱性詳細
脆弱性発生原因
PHP の rand 関数の不適切なランダム値生成範囲指定
0~9999の値をランダムに生成し、バックアップファイル名の一部に使用している。
そのため、生成されるバックアップファイル名は
backup_[年]_[月]_[日]_[時]_[分]_[秒]_[0-9999ランダム]-[バックアップファイルタイプ]
となる。
この仕様により、攻撃者がバックアップを作成した日時が推測できる場合、バックアップファイルを取得できる可能性が高くなる。
原因コード
$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 の実行環境に依存しているプラグインが多く存在しているため、ユーザー側は以下の通りの対策を行うことで、対策が可能であると考える。
セキュリティー系プラグインの導入
大抵のセキュリティープラグインは連続した不審なアクセスをブロックする機能がある。
無料版でもインストールすることで対策になり得ると考える。
.htaccess が利用可能なウェブサーバーの利用
.htaccess の利用は他のプラグインでも必須条件になっている事が多いため、 .htaccess が利用可能な Apache サーバーを利用する事をお勧めする。
脆弱性対策(ベンダー側)
rand 関数のランダム値の生成範囲を広げれば脆弱性になりづらいが、 rand 関数は仕様上完全にランダムに生成されているとは言えない。
そのため、ベンダー側は以下のような仕様に変更するべきだと勧告した。
openssl_random_pseudo_bytes 関数の利用 [推奨案]
暗号学的にセキュアな値を生成する openssl_random_pseudo_bytes 関数を利用し、予測困難なファイル名を生成する。
使用例
bin2hex(openssl_random_pseudo_bytes(1)) # Ex. 9f
bin2hex(openssl_random_pseudo_bytes(4)) # Ex. 305a867d
md5 関数 + rand 関数
rand 関数を使用するよりかは安全だが、上記案の openssl_random_pseudo_bytes 関数よりかは安全ではない。しかし、PHPのバージョン互換性を維持するためには、この案を採用する事も視野に入れるべきであると考える。
使用例
substr(md5(rand()), 24) # Ex. 28b24c84
また、ベンダー側には勧告していないが以下の対策もよりセキュアにするうえで有効であると考える。
実行環境の判定
.htaccess が利用可能であるかどうかをプラグイン内で判定し、利用可能でない場合は
- Apache サーバーの利用を推奨
- nginx サーバーを利用している場合に nginx.conf に対してアクセス制限用の記述を追加するよう警告
- .htaccess の利用が必須な機能を無効化
などを行う機能を追加する。
バックアップファイルをPHPに
バックアップファイルを .php にすることで、 ログイン無し・権限無しでダウンロードする事が出来なくなるのではないかと考える。
(未検証)
修正パッチ
修正バージョン 7.2.2 にて以下の通り修正された。
修正前
$file_number = 'backup_'.date('Y_m_d_H_i_s-').rand(0,9999);
修正後
$file_number = 'backup_'.date('Y_m_d_H_i_s-').bin2hex(openssl_random_pseudo_bytes(4));