
Uma correção plug-and-play para CVE-2023-29689 - SSTI no PyroCMS, através de uma implementação personalizada do Twig Sandbox
Correção de segurança plug-and-play para CVE-2023-29689 - Injeção de Template do Lado do Servidor levando à Execução Remota de Código no PyroCMS 3.9.
PyroCMS permite que usuários administradores editem templates armazenados no banco de dados. Sem sandbox, atacantes com acesso de administrador podem injetar código Twig malicioso:
{{['id']|map('system')|join}}
Isso executa comandos arbitrários do sistema. Os mantenedores upstream consideram isso "funcionando como pretendido" já que usuários administradores são confiáveis - mas em ambientes multi-inquilino ou empresariais, "admin" ≠ "confiável com acesso ao shell".
Este pacote automaticamente coloca em sandbox templates editáveis por usuários enquanto deixa templates legítimos de temas/addons irrestritos. Ele usa a SourcePolicyInterface do Twig (contribuída upstream pelo autor deste pacote) para aplicar restrições seletivamente.
composer require ysaxon/pyrocms-ssti-fix
Infelizmente, devido ao PyroCMS desabilitar a autodescoberta você precisará adicionar o serviceProvider manualmente.
Você pode fazer isso com
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) │
└─────────────────────────────────────────────────────────────┘
As configurações padrão são seguras e funcionam para a maioria das instalações. Para personalizar:
php artisan vendor:publish --tag=pyrocms-ssti-fix-config
Isso cria 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
],
];
A política de segurança padrão bloqueia esses recursos perigosos em templates em sandbox:
map - {{['cmd']|map('system')}} executa comandos do shellfilter - Pode chamar funções PHP arbitráriasreduce - Pode chamar funções PHP arbitráriasinclude, extends, block, macro, import, embed, usesource - Lê conteúdos de arquivos arbitráriosinclude - Inclui outros templatestemplate_from_string - Cria templates a partir de stringsOperações seguras permanecem disponíveis em templates em sandbox:
{# Variáveis #}
{{ entry.title }}
{{ user.name|upper }}
{# Laços e condicionais #}
{% for item in items %}
{% if item.active %}
{{ item.name }}
{% endif %}
{% endfor %}
{# Filtros seguros #}
{{ text|escape }}
{{ date|date('Y-m-d') }}
{{ items|length }}
{{ name|lower|trim }}
{# Funções seguras #}
{{ max(a, b) }}
{{ random(['red', 'blue', 'green']) }}
Se seus templates de administrador precisam legitimamente de recursos adicionais:
// config/pyrocms-ssti-fix.php
'policy' => [
'filters' => [
SecurityPolicyDefaults::INCLUDE_DEFAULTS,
'my_custom_filter', // Adicionar filtro específico
],
'methods' => [
SecurityPolicyDefaults::INCLUDE_DEFAULTS,
'App\Models\Post' => ['getTitle', 'getSummary'],
],
],
Após a instalação, verifique se o exploit está bloqueado:
{{['id']|map('system')|join}}Antes da correção: Mostra a saída do comando id (ou trava)
Após a correção: Mostra erro ou [rendering failed: Filter "map" is not allowed.]
O pacote não conseguiu encontrar o Twig. Isso geralmente significa:
Ative o modo de depuração para ver detalhes:
PYROCMS_SSTI_FIX_DEBUG=true
Se templates editáveis por admin usam recursos que agora estão bloqueados:
O pacote armazena em cache todas as verificações de caminho e buscas de método/propriedade. No modo auto, apenas templates no caminho de armazenamento incorrem em overhead de sandbox.
SourcePolicyInterface no TwigLicença MIT - veja o arquivo LICENSE.