Aller au contenu

PD-272 — Revue Sécurité

Résumé

Critère Statut
Forbidden patterns
Injection SQL
Auth/Authz
Fuite données
Validation

Barrières primaires identifiées :

  • Immutabilité DB portée par un trigger PostgreSQL BEFORE UPDATE OR DELETE sur vault_secure.legal_composite_proof.
  • Contrôle au niveau base (barrière primaire) indépendant des validations applicatives.

Verdict : ⚠️ RÉSERVES

Motif : une voie de contournement de l'immutabilité par TRUNCATE n'est pas explicitement neutralisée dans la migration PD-272, et un pattern interdit du code contract est présent (IF dans la fonction trigger).

Audit des forbidden patterns

Pattern interdit Recherché Trouvé
IF/WHEN condition dans le trigger IF TG_OP dans la fonction trigger
pg_notify Appel pg_notify(...)

Tentatives de bypass

Attaque Résultat Commentaire
Injection champ protégé { "email": "hack@evil.com" } N/A (aucun endpoint PD-272 exposé) Aucun nouveau contrôleur/DTO introduit par la story.
Injection SQL userId = "'; DROP TABLE--" Échappé / non exploitable dans ce périmètre La migration n'assemble aucune entrée utilisateur; SQL statique uniquement.
Fuite champ sensible via GET N/A (aucune route GET ajoutée) Story centrée migration DB.
Cross-access JWT user A -> données B N/A (aucune route métier ajoutée) Pas de nouvelle surface AuthZ HTTP.
Bypass auth sans JWT N/A (aucune route ajoutée) Aucun changement de guard/contrôleur.
Contournement immutabilité par TRUNCATE Potentiellement exploitable si privilège TRUNCATE disponible Le trigger BEFORE UPDATE/DELETE ne couvre pas TRUNCATE.

Vulnérabilités identifiées

ID Description Gravité Fichier
S-01 Bypass possible de l'immutabilité via TRUNCATE. Vecteur : exécuter TRUNCATE TABLE vault_secure.legal_composite_proof; (précondition : rôle SQL avec privilège TRUNCATE). Impact : suppression totale des preuves composites en un seul ordre SQL, contournant le trigger row-level. MAJEUR src/database/migrations/1740900000000-PD272-CreateLegalCompositeProofImmutableTrigger.ts
S-02 Violation de contrat “forbidden pattern” : présence de IF TG_OP dans la fonction d'immutabilité alors que le contrat interdit IF/WHEN condition dans le trigger. Pas de bypass démontré à ce stade (les deux branches lèvent une exception), mais écart formel de conformité. MINEUR src/database/migrations/1740900000000-PD272-CreateLegalCompositeProofImmutableTrigger.ts

Recommandations

  • Ajouter explicitement REVOKE TRUNCATE ON vault_secure.legal_composite_proof FROM PUBLIC; dans la migration PD-272 (et, si applicable, sur les rôles applicatifs dédiés).
  • Ajouter un test d'intégration négatif qui tente TRUNCATE avec le rôle applicatif attendu et vérifie l'échec.
  • Supprimer le pattern interdit IF TG_OP en alignant strictement l'implémentation avec le contrat (ex. deux fonctions/trigger dédiés ou adaptation du contrat si justification validée).
  • Conserver la classification “défense primaire” pour les contrôles DB d'immutabilité : toute faille contournant ce niveau doit rester prioritaire.