
# Laboratoire Docker pour la reproduction et la validation de CVE-2026-28496, une vulnérabilité d'injection de modèles côté serveur dans le rendu Twig de FOSSBilling, avec des cibles de comparaison vulnérables et corrigées.
Ce dépôt contient un laboratoire Docker local pour reproduire et valider CVE-2026-28496, une vulnérabilité d'injection de modèles côté serveur affectant le comportement de rendu des modèles Twig de FOSSBilling.
FOSSBilling est une plateforme gratuite et open-source de facturation et de gestion des clients. Les versions antérieures à 0.8.0 sont affectées par un comportement de rendu de modèles Twig non sécurisé pouvant évaluer des expressions de modèles fournies. FOSSBilling 0.8.0 est utilisé comme cible de comparaison corrigée dans ce laboratoire.
Ce laboratoire compare deux versions de FOSSBilling :
| Service | Version de FOSSBilling | Objectif | URL |
|---|---|---|---|
| vuln | 0.7.2 | Cible de comparaison vulnérable | http://localhost:8081 |
| patched | 0.8.0 | Cible de comparaison corrigée | http://localhost:8082 |
Le chemin de validation HTTP démontré dans ce laboratoire local est :```text Unauthenticated HTTP request in this local FOSSBilling 0.7.2 lab → POST /api/system/system/string_render → JSON body contains _tpl={{ 7*7 }} → vulnerable target renders the Twig expression → patched target does not expose the same tested API behavior
Dans la cible vulnérable, l'appel API renvoie :```json
{"result":"49","error":null}
Dans la cible corrigée, la même requête renvoie :```json {"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}
Ce laboratoire valide le comportement HTTP de la version vulnérable par rapport à la version corrigée, à l'aide de FOSSBilling 0.7.2 et FOSSBilling 0.8.0.
Le laboratoire est volontairement limité aux services Docker locaux. Il ne cible pas de systèmes externes et n'inclut pas de webshells, de malwares, de persistance, de rappels externes, de dump de base de données ni de charges utiles destructrices.
## Faits vérifiés
| Affirmation | Preuve | Comment vérifier dans ce laboratoire |
| ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------- |
| CVE-2026-28496 affecte les versions de FOSSBilling antérieures à 0.8.0. | Les métadonnées publiques du CVE et de l'avis de sécurité identifient FOSSBilling antérieur à 0.8.0 comme étant affecté par Twig SSTI. | Consultez la section Références et comparez les versions des cibles vulnérable et corrigée. |
| FOSSBilling 0.7.2 est utilisé comme cible de comparaison vulnérable. | Le service vulnérable est construit à partir de l'image Docker officielle `fossbilling/fossbilling:0.7.2`. | Inspectez `vuln/Dockerfile` et exécutez `docker compose ps -a`. |
| FOSSBilling 0.8.0 est utilisé comme cible de comparaison corrigée. | Le service corrigé est construit à partir de l'image Docker officielle `fossbilling/fossbilling:0.8.0`. | Inspectez `patched/Dockerfile` et exécutez `docker compose ps -a`. |
| Le chemin HTTP vulnérable est `/api/system/system/string_render`. | La cible vulnérable renvoie du JSON avec `result: "49"` pour `_tpl={{ 7*7 }}`. | Exécutez `python3 poc/poc.py --url http://localhost:8081`. |
| La cible corrigée n'expose pas le même comportement HTTP. | La cible corrigée renvoie `Unknown API call system/system/string_render`. | Exécutez `python3 poc/poc.py --url http://localhost:8082`. |
| Le PoC est exclusivement HTTP. | `poc/poc.py` envoie des requêtes HTTP POST et n'appelle ni Docker, ni Docker Compose, ni des commandes shell, ni les API de conteneurs. | Inspectez `poc/poc.py`. |
| Le laboratoire installe automatiquement les deux cibles FOSSBilling au démarrage de Docker Compose. | Les conteneurs sidecar d'installation à usage unique terminent la configuration et se terminent avec le statut 0. | Exécutez `docker compose ps -a` et `docker compose logs installer-vuln installer-patched`. |
| La cible vulnérable rend l'expression Twig inoffensive. | La réponse HTTP du port 8081 est `{"result":"49","error":null}`. | Exécutez la commande PoC pour la version vulnérable. |
| La cible corrigée ne rend pas la même expression via le chemin API testé. | La réponse HTTP du port 8082 est une erreur d'API JSON avec le code `879`. | Exécutez la commande PoC pour la version corrigée. |
## Hypothèses et inconnues
Ce laboratoire utilise FOSSBilling 0.7.2 comme cible de comparaison vulnérable car les recherches publiques sur les vulnérabilités identifient les versions de FOSSBilling antérieures à 0.8.0 comme étant affectées, et 0.7.2 est la dernière version vulnérable utilisée dans la chaîne testée.
Ce laboratoire utilise FOSSBilling 0.8.0 comme cible de comparaison corrigée car les métadonnées publiques de l'avis de sécurité identifient 0.8.0 comme la version corrigée.
Ce laboratoire se concentre sur le comportement HTTP observable de :```text
POST /api/system/system/string_render
avec ce corps JSON:```json {"_tpl":"{{ 7*7 }}"}
Le laboratoire démontre que FOSSBilling 0.7.2 rend l'expression Twig fournie via le chemin de l'API HTTP, tandis que FOSSBilling 0.8.0 n'expose pas le même appel API.
Ce laboratoire ne prétend pas tester toutes les fonctionnalités de rendu de templates de FOSSBilling. CVE-2026-28496 concerne également d'autres contextes de rendu Twig, tels que les fonctionnalités de rendu de templates disponibles dans l'application.
Ce laboratoire ne démontre pas la chaîne complète d'exécution de code à distance non authentifiée. Il valide le comportement HTTP non authentifié observé sur la cible locale FOSSBilling 0.7.2 et le compare avec FOSSBilling 0.8.0. La chaîne publique complète implique un comportement d'autorisation d'API supplémentaire au-delà de la validation sécurisée d'expression Twig présentée ici.
Le laboratoire ne démontre pas :
* l'exécution de commandes à distance,
* l'extraction d'identifiants,
* le dump de base de données,
* l'installation d'extensions,
* l'écriture arbitraire de fichiers,
* la persistance,
* le téléchargement de webshell,
* les rappels externes,
* les attaques contre des systèmes hors laboratoire,
* ou l'activité post-exploitation.
## Résumé de la cause racine
La cause racine de CVE-2026-28496 est un rendu de templates Twig non sécurisé.
FOSSBilling utilise Twig pour rendre les templates dynamiques. Dans les versions vulnérables, une chaîne de template fournie peut être transmise à la logique de rendu Twig sans restrictions de sandbox suffisantes.
Le comportement vulnérable peut être résumé comme suit :```text
Input template string
→ FOSSBilling API receives _tpl
→ System\Api\Admin::string_render() reads _tpl
→ System\Service::renderString() receives the template string
→ Twig creates a template from the supplied string
→ Twig evaluates the expression
→ rendered output is returned in the HTTP response
Pour cette expression de template inoffensive:```twig {{ 7*7 }}
la cible vulnérable évalue l'expression et renvoie :```text
49
Le problème de sécurité ne se limite pas à l'évaluation arithmétique. L'évaluation arithmétique n'est que le signal visible et sûr utilisé dans ce laboratoire.
Le problème le plus sensible en matière de sécurité est que les templates Twig non sandboxés peuvent accéder aux objets et méthodes exposés dans le contexte de template. Des recherches publiques décrivent un chemin d'impact plus élevé où l'exécution de templates Twig peut atteindre les composants internes de l'application, y compris le conteneur d'injection de dépendances, lorsque des objets de contexte de template adaptés sont disponibles.