
CVE-2023-29689 向けドロップインセキュリティ修正 - PyroCMS 3.9 におけるリモートコード実行につながるサーバーサイドテンプレートインジェクション。
PyroCMS では、管理者ユーザーがデータベースに保存されたテンプレートを編集できます。サンドボックス化されていない場合、管理者アクセス権を持つ攻撃者は悪意のある Twig コードを注入できます。
{{['id']|map('system')|join}}
これにより任意のシステムコマンドが実行されます。上流のメンテナーは管理者ユーザーを信頼しているため、これを「仕様通り」とみなしています。しかし、マルチテナント環境やエンタープライズ環境では、「管理者」≠「シェルアクセスを信頼できる」です。
このパッケージは、正当なテーマ/アドオンテンプレートは制限しないまま、ユーザーが編集可能なテンプレートを自動的にサンドボックス化します。Twig の SourcePolicyInterface(このパッケージの作者が上流にコントリビュートしたもの)を使用して、選択的に制限を適用します。
composer require ysaxon/pyrocms-ssti-fix
残念ながら、PyroCMS が 自動検出を無効化している ため、serviceProvider を自分で追加する必要があります。
これは次のようにして行えます。
sed -i "/App\\\Providers\\\AppServiceProvider::class,/a \ YSaxon\\\PyroCmsSstiFix\\\SandboxServiceProvider::class," config/app.php
SourcePolicyInterface サポート用)┌─────────────────────────────────────────────────────────────┐
│ Twig Render Request │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ StorageSourcePolicy │
│ │
│ Is template from storage path (database/user-editable)? │
│ │
│ YES ──────────────────► Enable Sandbox │
│ │ - Block: map, filter, reduce │
│ │ - Block: dangerous tags │
│ │ - Whitelist safe operations │
│ │
│ NO ───────────────────► No Sandbox │
│ (Theme/addon templates work │
│ normally) │
└─────────────────────────────────────────────────────────────┘
デフォルト設定は安全で、ほとんどのインストール環境で機能します。カスタマイズするには:
php artisan vendor:publish --tag=pyrocms-ssti-fix-config
これにより config/pyrocms-ssti-fix.php が作成されます:
return [
// Master switch
'enabled' => env('PYROCMS_SSTI_FIX_ENABLED', true),
// Override auto-detected storage path
'storage_path' => env('PYROCMS_SSTI_FIX_STORAGE_PATH', null),
// Customize allowed tags/filters/functions/methods/properties
'policy' => [
'tags' => [SecurityPolicyDefaults::INCLUDE_DEFAULTS],
'filters' => [SecurityPolicyDefaults::INCLUDE_DEFAULTS],
// ... see config file for full options
],
];
デフォルトのセキュリティポリシーは、サンドボックス化されたテンプレート内で次の危険な機能をブロックします。
map - {{['cmd']|map('system')}} はシェルコマンドを実行します。filter - 任意の PHP 関数を呼び出せます。reduce - 任意の PHP 関数を呼び出せます。include, extends, block, macro, import, embed, usesource - 任意のファイルの内容を読み取ります。include - 他のテンプレートをインクルードします。template_from_string - 文字列からテンプレートを作成します。安全な操作はサンドボックス化されたテンプレートでも引き続き利用できます。
{# Variables #}
{{ entry.title }}
{{ user.name|upper }}
{# Loops and conditionals #}
{% for item in items %}
{% if item.active %}
{{ item.name }}
{% endif %}
{% endfor %}
{# Safe filters #}
{{ text|escape }}
{{ date|date('Y-m-d') }}
{{ items|length }}
{{ name|lower|trim }}
{# Safe functions #}
{{ max(a, b) }}
{{ random(['red', 'blue', 'green']) }}
管理テンプレートが正当に追加機能を必要とする場合:
// config/pyrocms-ssti-fix.php
'policy' => [
'filters' => [
SecurityPolicyDefaults::INCLUDE_DEFAULTS,
'my_custom_filter', // Add specific filter
],
'methods' => [
SecurityPolicyDefaults::INCLUDE_DEFAULTS,
'App\Models\Post' => ['getTitle', 'getSummary'],
],
],
インストール後、エクスプロイトがブロックされることを確認します:
{{['id']|map('system')|join}}修正前: id コマンドの出力が表示される(またはクラッシュする)
修正後: エラーまたは [rendering failed: Filter "map" is not allowed.] が表示される
パッケージが Twig を見つけられませんでした。これは通常、次のことを意味します:
詳細を確認するにはデバッグモードを有効にします:
PYROCMS_SSTI_FIX_DEBUG=true
管理者が編集可能なテンプレートが、現在ブロックされている機能を使用している場合:
このパッケージは、すべてのパスチェックとメソッド/プロパティのルックアップをキャッシュします。auto モードでは、ストレージパス内のテンプレートのみにサンドボックスのオーバーヘッドが発生します。
SourcePolicyInterface コントリビューターMIT ライセンス - LICENSE ファイルを参照してください。