2.2 KiB
SEC-20 — Écrasement et retrait de contributions wiki étrangères
Date : 22 septembre 2026. Gravité historique : Moyenne (CWE-639 / CWE-862). Statut : corrigé dans le code de ia, déploiement non vérifié.
Scénario et conditions
Un utilisateur authentifié pouvant proposer une contribution choisit le titre d’une page existante, appartenant à un autre auteur ou déjà publiée. La recherche globale par titre puis la révision remplaçaient le contenu et remettaient la page en attente, sans contrôler auteur, organisation ou statut.
Impact et limites
Le contenu partagé pouvait être détruit ou retiré de la recherche globale, avec conservation trompeuse de l’auteur initial. Ce chemin ne publiait pas directement un nouveau texte sans administrateur.
Preuves dans la version vulnérable
Révision immuable examinée : ef0d7d5f670638a2dcce21f6aea8e169513b91ec. Les numéros suivants désignent cette révision, pas les lignes du correctif :
apps/backend/src/application/mcp/capabilities/knowledge.capabilities.ts:106 ; apps/backend/src/domain/entities/wiki-contribution.entity.ts:114 ; apps/backend/src/infrastructure/persistence/typeorm/repositories/typeorm-wiki-contribution.repository.ts:56
Le traçage des entrées, contrôles et écritures a été complété par des régressions locales : six assertions de sécurité échouaient avant correction, couvrant les quatre constats de cette passe. Il ne s’agit pas d’une reproduction HTTP sur la production.
Correction
Le service impose auteur et organisation identiques et refuse toute modification d’une page publiée. Le dépôt répète les contrôles dans les prédicats SQL. La création utilise INSERT ON CONFLICT DO NOTHING ; une collision de titre ne remplace plus une page existante.
Vérification
Tests de refus des pages étrangères/en ligne, contrôle positif de sa propre proposition, collision simultanée de titres insensible à la casse et contrôle des prédicats sur PostgreSQL.
Voir le compte rendu et les limites de couverture. Aucun fichier .env n’a été lu, aucun service de production n’a été contacté, aucune migration n’a été appliquée à la base du projet pendant ces tests.