Kunstmaan CMS: MediaBundle拡張機能におけるブラックリスト回避により、認証された管理者権限を持つユーザーが実行可能なPHPファイルをアップロードし、リモートコード実行が可能になる。
### 概要
MediaBundleは、危険な拡張子を持つファイルのアップロードをブラックリストによって防いでいますが、このブラックリストは、ファイル名が小文字に変換された後に適用されます。したがって、`webshell.pHp`という名前でアップロードされたファイルは、ブラックリストを回避し、ウェブサーバーからアクセス可能なアップロードディレクトリに`webshell.php`という名前で保存され、ウェブサーバーによって実行されます。メディアセクションへのアクセス権を持つ認証されたバックエンドユーザーであれば、誰でもリモートコード実行が可能になります。
### 詳細
`FileHandler::getFilePath()`は、大文字と小文字を区別する正規表現を使用して、ブラックリストに登録されている拡張子を`.txt`に変換します。その後、保存されるファイル名を作成する際に、拡張子を小文字に変換します。つまり、チェックは攻撃者が指定した大文字と小文字の状態で行われ、正規化はその後に行われます。
さらに、以下の2つの脆弱性が存在しました。
* デフォルトのブラックリストには、`php`と`htaccess`のみが含まれており、他のサーバーで実行可能な拡張子(`phtml`、`php5`、`phar`、`shtml`、`cgi`など)は大文字と小文字を区別せずにブロックされていません。
* 設定されたブラックリストの値は、エスケープ処理なしで正規表現に組み込まれていました。
### 影響
管理者権限を持つメディアセクションへのアクセス権を持つユーザーは、ウェブサーバーによってPHPとして実行されるファイルをアップロードできます。アップロードされたファイルは、認証なしでHTTP経由でアクセス可能であり、ウェブサーバーのユーザーとして任意のコードを実行できます。
### 修正
kunstmaan/media-bundle 7.3.2で修正されました。拡張子は、チェックおよび`in_array()`との比較が行われる前に正規化されるようになりました。デフォルトのブラックリストは、サーバーで実行可能なすべての拡張子を含むように拡張されました。また、新しいオプション`allowed_extensions`が追加され、プロジェクトは厳密な許可リストを適用できるようになりました。
ただし、この修正は、すでにディスクに保存されているファイルの名前を変更しません。サイト管理者は、メディアアップロードディレクトリに保存されている、実行可能な拡張子を持つ既存のファイルを調査する必要があります。
### 対策
もしアップグレードができない場合は、ウェブサーバーの設定を変更して、メディアファイルのアップロードディレクトリにあるスクリプトの実行を拒否するようにしてください(例えば、nginx の `location` ブロックや、Apache の `php_flag engine off` など)。
影響を受けるパッケージ:
- Composer (PHP) kunstmaan/media-bundle: 7.3.2 未満のバージョンが影響を受けます。7.3.2 で修正されました。
- Composer (PHP) kunstmaan/bundles-cms: 7.3.2 未満のバージョンが影響を受けます。7.3.2 で修正されました。