PD-287 — Acceptabilité (step 7)¶
Prérequis acceptabilité¶
- Lint : 0 erreurs ESLint sur src/sharing/
- TypeScript : 0 nouvelles erreurs (1 pré-existante hors périmètre)
- TODO non tracés : 1 TODO tracé (PD-287 Merkle worker stub)
- Code DEV ONLY : stubs PRE crypto documentés (STUB: PD-287)
- Tests CI : pas de tests unitaires/intégration dans ce périmètre (code agents)
- Coverage : N/A (pas de tests)
- Sonar : Docker indisponible (capability degraded), scan différé au pipeline
Analyse Sonar¶
- Quality Gate : SKIP (Docker unavailable, sonar-scanner non installé)
- Différé au pipeline CI post-merge
Review Code (Codex — développeur senior)¶
Résultat : 5 BLOQUANT, 11 MAJEUR, 3 MINEUR
Bloquants code¶
- Ownership preuve :
createShareLinkne vérifie pasproofId∈ownerUserIdavant création - Anti-enum guard :
ShareProofGuardrelance les NotFoundException internes avec messages différents (INV-SEC-8) - Hash-chain race :
audit-journal.service.tslit le dernier hash sans verrou — fork possible en concurrence - Consultation race : contrôle
maxConsultationshors verrou, dépassement possible - Idempotence purge : clé expirée traitée comme absente sans nettoyage → unicité cassée
Majeurs code¶
- Session
createSessionhors transaction avec audit - Retention
purgeLinkhors transaction atomique - Reconciliation
expireOrphanLinksupdate+audit hors transaction - OTP blocage ne transitionne pas
shareLink.state → OTP_BLOCKED - Trust-store
TRUST_STORE_CONFIGprovider non visible dans les modules - Export ZIP
archive.pipe()vers mauvais type de stream 12-16. Divers (OTP_SENT dupliqué, N+1 réconciliation, retention chargement mémoire)
Review Sécurité (Codex — pentester adversarial)¶
Résultat : 3 CRITIQUE, 5 HAUTE, 4 MOYENNE
Critiques sécurité¶
- CVSS 9.1 — Session non liée au shareLinkId : une session d'un lien A peut accéder au lien B
- CVSS 9.0 —
reEncrypt()ne fait pasverifyCertificateChain(), seulementisReady() - CVSS 9.8 — PRE en mode STUB (pas de crypto réelle) — attendu, documenté STUB: PD-287
Hautes sécurité¶
- TOCTOU révocation (state check hors TX)
maybeExpireLink()fail-open (catch/warn)- Journal audit modifiable + Merkle no-op
- Race append hash-chain (doublon avec code #3)
- recipientSessionId exposé en audit events → fuite bearer
Verdict acceptabilité¶
NON_CONFORME — 5 bloquants code + 2 critiques sécurité actionnables (hors #3 STUB documenté).
Les écarts sont cohérents avec un code produit par agents isolés sans intégration cross-module. Les corrections prioritaires : 1. Lier session au shareLinkId (critique sécurité #1) 2. Appeler verifyCertificateChain dans reEncrypt (critique sécurité #2)
3. Transaction atomique audit+business pour tous les services 4. Verrou serializable pour hash-chain audit 5. Anti-enum uniforme dans le guard
Ces corrections seront validées par Gate 8.