xpeditis2.0/audit_security/injection-formules-csv/injection-formules-csv.md

5.3 KiB
Raw Permalink Blame History

SEC-14 — Les exports CSV conservent les formules injectées

Gravité historique : Faible. Classification : CWE-1236.

État au 14 septembre 2026 : Corrigé dans le code suivi par csvCell, utilisé pour valeurs formatées et en-têtes des deux exports CSV. Les préfixes de formule, y compris derrière des espaces/caractères de contrôle, sont forcés au texte. La compatibilité avec chaque version de tableur n'a pas été testée.

Executive Summary

Un manager peut modifier un nom d'utilisateur de son organisation, puis un autre utilisateur habilité exporte la liste en CSV et ouvre ce fichier dans un tableur. Le déclencheur n'est pas la simple consultation de la page web.

Cette fiche repose sur la relecture du code historique accessible et du correctif courant, ainsi que des preuves documentées lors des passes précédentes. Elle ne constate aucun incident réel. La plus ancienne version ici vérifiée est le snapshot 8446f87 ; les corrections historiques figurent dans c09b8be. Aucun tag local ni version déployée n'a permis d'établir une première release vulnérable ou corrigée. Voir METHODOLOGIE.md.

Background

Échapper les séparateurs et guillemets préserve la syntaxe CSV. Forcer une cellule à rester du texte préserve son interprétation ; les deux propriétés sont distinctes.

Vulnerability Details

Le nom est une chaîne métier acceptée par l'API puis passée à ExportButton sur la page de gestion des utilisateurs. L'ancien générateur entourait les cellules de guillemets et doublait les guillemets internes, ce qui produit un CSV syntaxiquement valide mais ne neutralise pas les expressions commençant par =, +, - ou @. Un exemple inoffensif est =1+1 : le tableur peut calculer une expression au lieu d'afficher le texte. Le même principe concerne l'export utilitaire CSV ; les cellules explicitement typées texte dans l'export Excel XML ne doivent pas être assimilées à ce cas.

Extrait historique vérifié, apps/frontend/src/components/ExportButton.tsx, lignes 65–80 du snapshot préaudit :

  const generateCSV = (): string => {
    const headers = columns.map(col => `"${col.label.replace(/"/g, '""')}"`).join(';');

    const rows = data.map(row => {
      return columns
        .map(col => {
          const value = getNestedValue(row, col.key as string);
          const formattedValue = col.format ? col.format(value, row) : formatValue(value);
          return `"${formattedValue.replace(/"/g, '""')}"`;
        })
        .join(';');
    });

    return [headers, ...rows].join('\n');
  };

Les numéros ci-dessus décrivent le snapshot ancien ; les liens suivants ouvrent les fichiers courants, où les lignes peuvent avoir changé.

Sources à examiner ensemble :

Exploitability Analysis

Interprétation de données contrôlées comme formules dans le contexte du tableur du destinataire. Les effets dépendent du logiciel et de ses protections. Aucune exécution système ni exfiltration automatique n'a été démontrée. Le besoin d'un export puis d'une ouverture manuelle et le périmètre intra-organisation limitent la gravité historique à faible.

Le code applicatif établit le chemin décrit, mais ne renseigne pas les protections effectives d'un déploiement donné, sa version en ligne ou les accès déjà exercés par un attaquant. La gravité ci-dessus est celle du mécanisme vulnérable avant correction ; elle n'est pas un score de risque résiduel calculé pour la production.

Proof of Concept

Tests de non-régression existants, inspectables dans le dépôt :

Ils testent les refus et les usages autorisés avec des données locales. Ils ne prouvent pas qu'une ancienne exploitation a eu lieu en production. Les commandes et résultats consolidés sont dans VALIDATION.md ; aucun nouvel exploit n'a été exécuté pendant la rédaction.

Remediation

Corrigé dans le code suivi par csvCell, utilisé pour valeurs formatées et en-têtes des deux exports CSV. Les préfixes de formule, y compris derrière des espaces/caractères de contrôle, sont forcés au texte. La compatibilité avec chaque version de tableur n'a pas été testée.

Pour solder le constat en exploitation, vérifier le comportement sur la version effectivement déployée et conserver les contrôles légitimes décrits. La présente passe ajoute uniquement de la documentation ; les correctifs mentionnés existaient avant sa rédaction.

Summary

Les exports CSV conservent les formules injectées est un constat historique de l'audit, à lire avec son état courant ci-dessus. La preuve porte sur le mécanisme et les contrôles cités ; elle ne constitue ni une attestation d'exploitation réelle ni une certification exhaustive du projet.