
Встраиваемое исправление для CVE-2023-29689 - SSTI в PyroCMS, посредством реализации пользовательского Twig Sandbox
Готовое исправление безопасности для CVE-2023-29689 - Инъекция шаблонов на стороне сервера, приводящая к удаленному выполнению кода в PyroCMS 3.9.
PyroCMS позволяет пользователям-администраторам редактировать шаблоны, хранящиеся в базе данных. Без изоляции злоумышленники с правами администратора могут внедрить вредоносный код Twig:
{{['id']|map('system')|join}}
Это выполняет произвольные системные команды. Основные разработчики считают это «работой по замыслу», поскольку пользователи-администраторы являются доверенными, но в многотенантных или корпоративных средах «администратор» ≠ «доверенное лицо с доступом к оболочке».
Этот пакет автоматически изолирует шаблоны, редактируемые пользователями, оставляя при этом легитимные шаблоны тем/дополнений без ограничений. Он использует SourcePolicyInterface Twig (переданный вышестоящему проекту автором этого пакета) для выборочного применения ограничений.
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 - Может вызывать произвольные функции PHPreduce - Может вызывать произвольные функции PHPinclude, 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 для TwigЛицензия MIT - см. файл LICENSE.