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.