
Un parche drop-in para CVE-2023-29689 - SSTI en PyroCMS, mediante una implementación personalizada de Twig Sandbox.
Solución de seguridad de integración directa para CVE-2023-29689 - Inyección de plantillas del lado del servidor que conduce a ejecución remota de código en PyroCMS 3.9.
PyroCMS permite a los usuarios administradores editar plantillas almacenadas en la base de datos. Sin sandboxing, los atacantes con acceso de administrador pueden inyectar código Twig malicioso:
{{['id']|map('system')|join}}
Esto ejecuta comandos arbitrarios del sistema. Los mantenedores upstream consideran que esto «funciona según lo previsto» ya que los usuarios administradores son de confianza, pero en entornos multiinquilino o empresariales, «admin» ≠ «confiable con acceso al shell».
Este paquete aplica automáticamente sandbox a las plantillas editables por el usuario, mientras deja sin restricciones las plantillas legítimas de temas/complementos. Utiliza SourcePolicyInterface de Twig (contribuido upstream por el autor de este paquete) para aplicar restricciones de forma selectiva.
composer require ysaxon/pyrocms-ssti-fix
Desafortunadamente, debido a que PyroCMS deshabilita el autodescubrimiento, tendrás que añadir el serviceProvider manualmente.
Puedes hacerlo con:
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) │
└─────────────────────────────────────────────────────────────┘
La configuración predeterminada es segura y funciona en la mayoría de las instalaciones. Para personalizarla:
php artisan vendor:publish --tag=pyrocms-ssti-fix-config
Esto crea 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
],
];
La política de seguridad predeterminada bloquea estas características peligrosas en las plantillas en sandbox:
map - {{['cmd']|map('system')}} ejecuta comandos del shellfilter - Puede llamar funciones PHP arbitrariasreduce - Puede llamar funciones PHP arbitrariasinclude, extends, block, macro, import, embed, usesource - Lee el contenido de archivos arbitrariosinclude - Incluye otras plantillastemplate_from_string - Crea plantillas a partir de cadenasLas operaciones seguras siguen disponibles en las plantillas en sandbox:
{# 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']) }}
Si tus plantillas de administración necesitan legítimamente características adicionales:
// 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'],
],
],
Después de la instalación, verifica que el exploit esté bloqueado:
{{['id']|map('system')|join}}Antes de la corrección: Muestra la salida del comando id (o falla)
Después de la corrección: Muestra un error o [rendering failed: Filter "map" is not allowed.]
El paquete no pudo encontrar Twig. Esto normalmente significa:
Habilita el modo de depuración para ver los detalles:
PYROCMS_SSTI_FIX_DEBUG=true
Si las plantillas editables por el administrador usan características que ahora están bloqueadas:
El paquete almacena en caché todas las comprobaciones de rutas y las búsquedas de métodos/propiedades. En el modo auto, solo las plantillas de la ruta de almacenamiento incurren en la sobrecarga del sandbox.
SourcePolicyInterface a TwigLicencia MIT: consulta el archivo LICENSE.