Aller au contenu

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

  1. Ownership preuve : createShareLink ne vérifie pas proofIdownerUserId avant création
  2. Anti-enum guard : ShareProofGuard relance les NotFoundException internes avec messages différents (INV-SEC-8)
  3. Hash-chain race : audit-journal.service.ts lit le dernier hash sans verrou — fork possible en concurrence
  4. Consultation race : contrôle maxConsultations hors verrou, dépassement possible
  5. Idempotence purge : clé expirée traitée comme absente sans nettoyage → unicité cassée

Majeurs code

  1. Session createSession hors transaction avec audit
  2. Retention purgeLink hors transaction atomique
  3. Reconciliation expireOrphanLinks update+audit hors transaction
  4. OTP blocage ne transitionne pas shareLink.state → OTP_BLOCKED
  5. Trust-store TRUST_STORE_CONFIG provider non visible dans les modules
  6. 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é

  1. CVSS 9.1 — Session non liée au shareLinkId : une session d'un lien A peut accéder au lien B
  2. CVSS 9.0reEncrypt() ne fait pas verifyCertificateChain(), seulement isReady()
  3. CVSS 9.8 — PRE en mode STUB (pas de crypto réelle) — attendu, documenté STUB: PD-287

Hautes sécurité

  1. TOCTOU révocation (state check hors TX)
  2. maybeExpireLink() fail-open (catch/warn)
  3. Journal audit modifiable + Merkle no-op
  4. Race append hash-chain (doublon avec code #3)
  5. 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.