xpeditis2.0/audit_security/secrets-dans-les-journaux/secrets-dans-les-journaux.md

72 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SEC-07 — Les logs contiennent mots de passe et invitations
> **Mise à jour du 17 septembre 2026 :** voir le [compte rendu de correction](../CORRECTIONS-2026-09-17.md). Le texte ci-dessous conserve le constat avant cette passe. Les chemins de fuite décrits sont corrigés localement ; les anciennes copies de secrets restent à traiter.
**Gravité historique : Moyenne.** Classification : CWE-532.
**État au 14 septembre 2026 :** PARTIELLEMENT CORRIGÉ. Les traces de mot de passe et d'invitation ciblées ont été retirées dans le code suivi ; les interpolations de tokens transporteur restent présentes. Aucun nouveau correctif n'est effectué pendant cette passe documentaire. La rotation des secrets historiquement exposés et le traitement des copies de logs restent à confirmer.
## Executive Summary
Le lecteur des journaux applicatifs n'est pas nécessairement autorisé à se connecter sous l'identité d'un utilisateur ni à décider à la place d'un transporteur. L'attaquant doit déjà obtenir l'accès aux logs ; aucune exposition publique des journaux de production n'est démontrée.
Cette fiche repose sur la relecture du code historique accessible et du correctif courant, ainsi que des preuves documentées lors des passes précédentes. Elle ne constate aucun incident réel. La plus ancienne version ici vérifiée est le snapshot `8446f87` ; les corrections historiques figurent dans `c09b8be`. Aucun tag local ni version déployée n'a permis d'établir une première release vulnérable ou corrigée. Voir [METHODOLOGIE.md](../METHODOLOGIE.md).
## Background
Les logs sont destinés à l’exploitation et peuvent avoir une rétention ou des lecteurs différents des données métier. Les filtres sur champs structurés n’inspectent pas nécessairement les valeurs incorporées à une chaîne libre.
## Vulnerability Details
Historiquement, `UsersController.createUser` inscrivait le mot de passe temporaire en clair avec l'adresse email après stockage du hash Argon2. `InvitationService.sendInvitationEmail` inscrivait l'URL contenant le token d'inscription. La redaction Pino des champs structurés `req.body.password` ne supprime pas une valeur interpolée dans le texte d'un message. La relecture actuelle montre une autre occurrence de la même cause : `CsvBookingService.getDocumentsForCarrier` journalise `${token}` avant vérification du statut et du mot de passe ; `acceptBooking` et `rejectBooking` le journalisent avant résolution. Un accès documentaire tenté trop tôt peut donc inscrire un token d'une réservation encore PENDING ; si un lecteur récupère ce token valide, les routes publiques de décision peuvent l'accepter. Un appel normal après acceptation peut aussi journaliser un token déjà inutilisable pour une seconde décision : l'exploitation n'est pas automatique.
Extrait historique vérifié, `apps/backend/src/application/controllers/users.controller.ts`, lignes 163–166 du snapshot préaudit :
```typescript
// TODO: Send invitation email with temporary password
this.logger.warn(
`TODO: Send invitation email to ${dto.email} with temp password: ${tempPassword}`
);
```
Les numéros ci-dessus décrivent le snapshot ancien ; les liens suivants ouvrent les fichiers courants, où les lignes peuvent avoir changé.
Sources à examiner ensemble :
- [apps/backend/src/application/controllers/users.controller.ts](../../apps/backend/src/application/controllers/users.controller.ts)
- [apps/backend/src/application/services/invitation.service.ts](../../apps/backend/src/application/services/invitation.service.ts)
- [apps/backend/src/app.module.ts](../../apps/backend/src/app.module.ts)
**Preuve actuelle complémentaire :** [apps/backend/src/application/services/csv-booking.service.ts](../../apps/backend/src/application/services/csv-booking.service.ts), `getDocumentsForCarrier` ligne 717, `acceptBooking` ligne 887 et `rejectBooking` ligne 961 contiennent encore des messages interpolant le token. Ces lignes sont celles de l'état local du 14 septembre. Cette observation élargit le constat historique au risque résiduel, sans prétendre que les tests mot de passe/invitation couvrent ces trois méthodes.
## Exploitability Analysis
Les anciens mots de passe ou invitations valides donnaient une autorité de connexion. Les tokens transporteur résiduels donnent uniquement l'autorité associée au token, sous les contraintes du domaine. Ni la collecte effective des logs, ni leur rétention, ni un détournement réel n'ont été observés. La fuite vers le logger est présente dans le code actuel ; la fenêtre d'usage abusive dépend d'un token encore valide et de l'accès du lecteur aux journaux.
Le code applicatif établit le chemin décrit, mais ne renseigne pas les protections effectives d'un déploiement donné, sa version en ligne ou les accès déjà exercés par un attaquant. La gravité ci-dessus est celle du mécanisme vulnérable avant correction ; elle n'est pas un score de risque résiduel calculé pour la production.
## Proof of Concept
Tests de non-régression existants, inspectables dans le dépôt :
- [apps/backend/src/application/controllers/users.security.spec.ts](../../apps/backend/src/application/controllers/users.security.spec.ts)
- [apps/backend/src/application/services/invitation.security.spec.ts](../../apps/backend/src/application/services/invitation.security.spec.ts)
Ils testent les refus et les usages autorisés avec des données locales. Ils ne prouvent pas qu'une ancienne exploitation a eu lieu en production. Les commandes et résultats consolidés sont dans [VALIDATION.md](../VALIDATION.md) ; aucun nouvel exploit n'a été exécuté pendant la rédaction.
## Remediation
PARTIELLEMENT CORRIGÉ. Les traces de mot de passe et d'invitation ciblées ont été retirées dans le code suivi ; les interpolations de tokens transporteur restent présentes. Aucun nouveau correctif n'est effectué pendant cette passe documentaire. La rotation des secrets historiquement exposés et le traitement des copies de logs restent à confirmer.
Pour solder le constat en exploitation, vérifier le comportement sur la version effectivement déployée et conserver les contrôles légitimes décrits. La présente passe ajoute uniquement de la documentation ; les correctifs mentionnés existaient avant sa rédaction.
## Summary
Les logs contiennent mots de passe et invitations est un constat historique de l'audit, à lire avec son état courant ci-dessus. La preuve porte sur le mécanisme et les contrôles cités ; elle ne constitue ni une attestation d'exploitation réelle ni une certification exhaustive du projet.
## Complément — 22 septembre 2026
Les runners startup.js et run-migrations.js utilisent également SafeDatabaseLogger et ne recopient plus les erreurs SQL brutes, afin de protéger notamment les hashes de rotation lors des migrations. Compilation et tests database-startup réussis.