
Un correctif prêt à l'emploi pour CVE-2023-29689 - SSTI dans PyroCMS, via une implémentation personnalisée de Twig Sandbox
Correctif de sécurité immédiat pour CVE-2023-29689 - Injection de modèles côté serveur conduisant à l'exécution de code à distance dans PyroCMS 3.9.
PyroCMS permet aux utilisateurs administrateurs de modifier les modèles stockés dans la base de données. Sans bac à sable, les attaquants disposant d'un accès administrateur peuvent injecter du code Twig malveillant :
{{['id']|map('system')|join}}
Cela exécute des commandes système arbitraires. Les mainteneurs en amont considèrent cela comme « fonctionnant comme prévu » puisque les administrateurs sont considérés comme fiables – mais dans des environnements multi-locataires ou d'entreprise, « administrateur » ne signifie pas « digne de confiance avec un accès shell ».
Ce paquet met automatiquement en bac à sable les modèles modifiables par l'utilisateur tout en laissant les modèles légitimes de thèmes/extensions sans restriction. Il utilise SourcePolicyInterface de Twig (contribution en amont de l'auteur de ce paquet) pour appliquer sélectivement des restrictions.
composer require ysaxon/pyrocms-ssti-fix
Malheureusement, en raison du désactiver l'auto-découverte de PyroCMS, vous devrez ajouter vous-même le serviceProvider.
Vous pouvez le faire avec
sed -i "/App\\\Providers\\\AppServiceProvider::class,/a \ YSaxon\\\PyroCmsSstiFix\\\SandboxServiceProvider::class," config/app.php
SourcePolicyInterface)┌─────────────────────────────────────────────────────────────┐
│ Requête de rendu Twig │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ StorageSourcePolicy │
│ │
│ Le modèle provient-il du chemin de stockage (base de │
│ données / modifiable par l'utilisateur) ? │
│ │
│ OUI ──────────────────► Activer le bac à sable │
│ │ - Bloquer : map, filter, reduce │
│ │ - Bloquer : balises dangereuses │
│ │ - Liste blanche opérations sûres│
│ │
│ NON ───────────────────► Pas de bac à sable │
│ (Les modèles thèmes/extensions │
│ fonctionnent normalement) │
└─────────────────────────────────────────────────────────────┘
Les paramètres par défaut sont sécurisés et fonctionnent pour la plupart des installations. Pour personnaliser :
php artisan vendor:publish --tag=pyrocms-ssti-fix-config
Ceci crée config/pyrocms-ssti-fix.php :
return [
// Interrupteur principal
'enabled' => env('PYROCMS_SSTI_FIX_ENABLED', true),
// Surcharger le chemin de stockage détecté automatiquement
'storage_path' => env('PYROCMS_SSTI_FIX_STORAGE_PATH', null),
// Personnaliser les balises/filtres/fonctions/méthodes/propriétés autorisés
'policy' => [
'tags' => [SecurityPolicyDefaults::INCLUDE_DEFAULTS],
'filters' => [SecurityPolicyDefaults::INCLUDE_DEFAULTS],
// ... voir le fichier de configuration pour toutes les options
],
];
La politique de sécurité par défaut bloque ces fonctionnalités dangereuses dans les modèles en bac à sable :
map - {{['cmd']|map('system')}} exécute des commandes shellfilter - Peut appeler des fonctions PHP arbitrairesreduce - Peut appeler des fonctions PHP arbitrairesinclude, extends, block, macro, import, embed, usesource - Lit le contenu de fichiers arbitrairesinclude - Inclut d'autres modèlestemplate_from_string - Crée des modèles à partir de chaînesLes opérations sûres restent disponibles dans les modèles en bac à sable :
{# Variables #}
{{ entry.title }}
{{ user.name|upper }}
{# Boucles et conditions #}
{% for item in items %}
{% if item.active %}
{{ item.name }}
{% endif %}
{% endfor %}
{# Filtres sûrs #}
{{ text|escape }}
{{ date|date('Y-m-d') }}
{{ items|length }}
{{ name|lower|trim }}
{# Fonctions sûres #}
{{ max(a, b) }}
{{ random(['red', 'blue', 'green']) }}
Si vos modèles d'administration ont légitimement besoin de fonctionnalités supplémentaires :
// config/pyrocms-ssti-fix.php
'policy' => [
'filters' => [
SecurityPolicyDefaults::INCLUDE_DEFAULTS,
'mon_filtre_personnalisé', // Ajouter un filtre spécifique
],
'methods' => [
SecurityPolicyDefaults::INCLUDE_DEFAULTS,
'App\Models\Post' => ['getTitle', 'getSummary'],
],
],
Après installation, vérifiez que l'exploit est bloqué :
{{['id']|map('system')|join}}Avant le correctif : Affiche la sortie de la commande id (ou plante)
Après le correctif : Affiche une erreur ou [rendering failed: Filter "map" is not allowed.]
Le paquet n'a pas trouvé Twig. Cela signifie généralement que :
Activez le mode débogage pour voir les détails :
PYROCMS_SSTI_FIX_DEBUG=true
Si des modèles modifiables par l'administrateur utilisent des fonctionnalités désormais bloquées :
Le paquet met en cache toutes les vérifications de chemin et les recherches de méthodes/propriétés. En mode auto, seuls les modèles du chemin de stockage subissent la surcharge du bac à sable.
SourcePolicyInterface à TwigLicence MIT - voir le fichier LICENSE.