Applications, sites et API

Particuliers et entreprises

Injection dans un modèle côté serveur

Server-side template injection / SSTI

Un texte reçu devient une instruction pour le moteur qui fabrique une page ou un document.

Révision éditoriale : Comprendre : 2 min · Cas technique et détails : 4 min
Je pense être concerné : que faire ?
Illustration pédagogique : injection dans un modèle côté serveur.

Comprendre et agir

Découvrez le piège à partir d’un exemple, puis les gestes que vous pouvez faire. Vous pouvez suivre cette lecture sans connaissances en informatique.

Une situation concrète

Un outil prépare une attestation à partir d’un modèle et du nom saisi par un client. Il ajoute ce nom au texte du modèle avant de l’interpréter. Une saisie piégée peut ainsi modifier les calculs réalisés par le serveur.

Comment cela fonctionne

Un moteur de modèles assemble des données et une mise en page pour produire une page, un courriel ou un document. Une injection SSTI survient lorsqu’une entrée non fiable devient une instruction de ce moteur. Selon les fonctions accessibles, l’attaquant peut lire des informations du serveur ou faire exécuter du code. Le traitement se déroule côté serveur ; une protection contre les scripts du navigateur ne suffit donc pas.

Comment le piège fonctionne
  1. Un champ est saisi

    Un nom ou un texte doit compléter un document.

  2. Il rejoint les instructions du modèle

    Le serveur interprète une partie de la saisie.

  3. Le rendu est détourné

    Calcul, lecture ou action selon les droits disponibles.

Ce que vous pouvez faire

Vos premiers réflexes

Signalez un aperçu qui remplace votre saisie par un résultat inattendu. Conservez son contexte sans chercher à faire calculer d’autres expressions au service.

Si vous êtes responsable du service ou de l’organisation

Faites vérifier comment sont fabriqués les modèles d’aperçu, de courriel et d’export. Les saisies doivent rester des paramètres, et les processus de rendu doivent disposer de droits limités.

Un point à vérifierUne idée reçue à corriger

Échapper le HTML du résultat protège certains affichages, mais n’empêche pas le serveur d’avoir déjà interprété une instruction de modèle.

À vous de décider

Une attestation est fabriquée sur le serveur avant d’être téléchargée. Bloquer les scripts dans votre navigateur protège-t-il ce traitement ?

Prenez un moment pour répondre et expliquer votre choix, puis ouvrez la correction.

Voir la réponse expliquée

Non. Le serveur a déjà exécuté le moteur qui produit l’attestation. La correction doit empêcher qu’une saisie devienne une instruction dans ce moteur, même si aucun script ne s’exécute dans votre navigateur.

Analyser un cas technique

Ce cas s’adresse aux personnes qui développent, administrent ou analysent ces systèmes. Si vous découvrez le sujet, commencez par « Comprendre et agir ».

Étude de cas fictive

Un champ d’attestation est interprété pendant le rendu

Le nom destiné à l’attestation est ajouté au texte du modèle avant son interprétation. Dans la reproduction isolée, une valeur de test est évaluée par le moteur. La frontière entre données et instructions a donc été franchie. Le champ os_command_observed=false précise qu’aucune commande système n’a été observée dans ce test ; il ne garantit pas l’absence de toute possibilité d’exécution.

L’analyse suit la construction du modèle, les objets transmis au moteur et les éventuels rendus successifs. Elle distingue une évaluation de modèle d’un script exécuté dans le navigateur. L’encodage HTML du résultat intervient trop tard pour empêcher l’interprétation déjà réalisée côté serveur.

Le second traitement conserve un modèle de confiance et fournit le nom comme paramètre. Le texte reste une donnée. Le cas Confluence CVE-2023-22527, référencé par Rapid7, montre qu’un moteur et son environnement peuvent offrir un chemin jusqu’à des commandes système ; cette conséquence doit être établie pour l’application étudiée.

Le déroulement en schéma

Qui échange avec quiLisez les échanges de haut en bas. Le point marque le départ et la flèche l’arrivée. Les vérifications après correction ne sont pas la suite de l’attaque.

Faites défiler le diagramme pour suivre les échanges ; les noms des acteurs restent en haut. Sur petit écran, faites aussi défiler de gauche à droite.

Étape
DemandeurChamp non fiable
Service d’aperçuConstruction du document
Moteur de modèlesÉvaluation serveur
SupervisionActivité du processus de traitement
  1. Action

    Saisie du champ

    Demandeur vers Service d’aperçu

    Trace nom du client

  2. Action

    Modèle construit avec la saisie

    Service d’aperçu vers Moteur de modèles

    Trace template_source

  3. Action sur place

    Évaluation du contenu injecté

    Moteur de modèles

    Trace constat en laboratoire

  4. Réponse

    Résultat du rendu

    Moteur de modèles vers Service d’aperçu

    Trace expression évaluée

  5. Réponse

    Aperçu livré

    Service d’aperçu vers Demandeur

    Trace résultat visible

  6. Action

    Recherche des effets du traitement

    Moteur de modèles vers Supervision

    Trace fichiers, processus, réseau

  7. Action

    Rendu corrigé avec paramètres

    Service d’aperçu vers Moteur de modèles

    Trace modèle de confiance

Comment repérer cette attaque

Indices à rechercher

  • Le rendu produit un résultat calculé à partir d’un champ censé rester du texte.
  • Des erreurs du moteur de modèles apparaissent autour d’un aperçu ou d’un export.
  • Le service de rendu accède à des ressources ou lance des processus inattendus.

Rechercher les aperçus qui déclenchent des erreurs ou évaluations inattendues, puis suivre la tâche jusqu’au processus de traitement. Examiner les accès aux fichiers, les processus enfants et les destinations réseau dans le contexte des fonctions normalement offertes par le rendu.

Quelles informations comparer

Suivre la valeur saisie jusqu’au texte du modèle ou à son paramètre, puis relier la tâche aux effets du processus de traitement. Comparer un rendu normal et la reproduction isolée pour identifier l’étape qui change son interprétation.

Ce que ces indices ne permettent pas de conclure

Une erreur de modèle peut provenir d’un simple défaut de format. Une expression évaluée prouve une interprétation, sans établir toutes les capacités du moteur ni les actions possibles avec les objets exposés.

Comment réagir

Fermer le chemin de construction vulnérable et séparer les paramètres du texte de modèle. Préserver les versions et demandes utiles. Examiner les aperçus, les exports et les tâches différées qui partagent le moteur, puis traiter les effets établis avec les droits du processus de traitement.

Vérifier la correction

L’équipe responsable du système peut utiliser ces contrôles dans un environnement de test autorisé. Vous pouvez lire et comprendre le cas sans effectuer ces manipulations.

  1. Les champs utilisateur restent des données dans l’aperçu, l’export et les traitements différés.
  2. Les objets disponibles au moteur correspondent aux besoins du rendu, sans accès privilégié inutile.
  3. Les essais de régression vérifient les rendus successifs et le bon fonctionnement des modèles légitimes.

À vous de raisonner

Une valeur de test est évaluée pendant l’aperçu, mais aucun processus enfant n’est observé. Quelle conclusion et quelle correction sont justifiées ?

Quelle décision prendriez-vous, et sur quel indice vous appuieriez-vous ? Répondez avant d’ouvrir la correction.

Comparer avec le raisonnement expliqué

L’interprétation de la valeur confirme la séparation défectueuse entre modèle et données. Elle ne démontre pas l’exécution d’une commande système. Il faut conserver un modèle de confiance, passer la saisie comme paramètre et vérifier les capacités du moteur ainsi que les autres chemins de rendu.

Consulter les détails techniques

Les extraits permettent de s’exercer à lire les traces du cas. Si vous disposez des outils et des accès nécessaires, le guide de collecte vous aide aussi à rechercher ces informations.

Lire les extraits commentés (reconstitution fictive)

Ces extraits contiennent des valeurs fictives. Certains champs correspondent à ceux des outils documentés ; d’autres réunissent plusieurs sources pour faciliter l’explication. Vos propres exports pourront donc avoir une autre forme. Lisez d’abord les explications des champs, puis repérez-les dans les extraits.

template_source
Origine du texte de modèle ajoutée pour l’exercice ; elle ne se déduit pas du seul statut de la réponse HTTP.
os_command_observed
Observation limitée au test décrit : false n’affirme pas que le moteur est incapable d’exécuter une commande.

Suivi fictif de l’aperçu et d’un test de rendu

JSONL

Instrumentation pédagogique ajoutée pour expliquer le cas. Les champs sur l’origine du modèle et l’évaluation ne sont pas présents par défaut dans les journaux d’un moteur de modèles.

{"job":"preview-12","environment":"isolated_test","template_source":"assembled_with_input","input_role":"customer_name","expression_evaluated":true,"os_command_observed":false}
{"job":"preview-13","environment":"isolated_test","template_source":"trusted_static","input_role":"data_parameter","expression_evaluated":false,"render":"success"}
Préparer une collecte dans votre environnement

Utilisez les sources disponibles dans vos outils et auxquelles vous êtes autorisé à accéder. Vous pouvez comprendre la fiche sans posséder ces outils. Vérifiez que les journaux étaient activés pendant la période étudiée. Gardez l’export original avec son fuseau horaire et sa provenance dans un espace à accès restreint. Pour l’analyse, travaillez sur une copie dont vous avez retiré les secrets.

  1. Service concerné — audit et historique à vérifier

    Où les trouver
    Dans l’outil d’administration ou les journaux du service concerné. Demander à son mainteneur où sont enregistrées les décisions d’autorisation et les opérations métier.
    Quoi relever
    Rapprocher la tâche d’aperçu, la version du modèle, les paramètres et les compilations successives. Les champs expliquant l’origine du modèle nécessitent une instrumentation propre à l’application.
    Accès et prérequis
    Il n’existe ni fichier ni vocabulaire universels. Les champs proposés ici doivent être instrumentés s’ils manquent ; ne pas enregistrer mots de passe, jetons ou contenu privé intégral.
    Documentation : Service concerné — audit et historique à vérifier
  2. Linux — auditd

    Où les trouver
    Sur le serveur concerné, dans le fichier log_file d’auditd, généralement /var/log/audit/audit.log. Les enregistrements SYSCALL, EXECVE et PATH d’un même événement partagent le numéro dans msg=audit(...).
    Quoi relever
    Examiner les exécutions du processus de traitement et leur filiation lorsque l’audit est disponible. L’absence de processus enfant n’exclut ni l’évaluation d’une expression ni une lecture réalisée dans le processus existant.
    Accès et prérequis
    Service actif et règles d’audit adaptées avant les faits. Linux n’enregistre pas automatiquement toutes les exécutions et lectures ; les arguments et chemins collectés peuvent être sensibles.
    Documentation : Linux — auditd

Si vous pensez être concerné

Si vous utilisez le service

Signalez un aperçu qui remplace votre saisie par un résultat inattendu. Conservez son contexte sans chercher à faire calculer d’autres expressions au service.

Pour l’équipe qui exploite le service

  1. Conservez la demande et le résultat anormal dans un espace réservé à l’enquête.
  2. Suspendez le chemin de rendu exposé et faites corriger la séparation entre modèle et données.
  3. Vérifiez les données lues et les actions réalisées par le service de rendu.

Pour comprendre votre situation et trouver de l’aide : obtenir une assistance sur 17Cyber. Dans une organisation, prévenez aussi le responsable ou prestataire chargé de la sécurité.

Sources et repères pour approfondir