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

6.8 KiB
Raw Permalink Blame History

SEC-07 — Les logs contiennent mots de passe et invitations

Mise à jour du 17 septembre 2026 : voir le compte rendu de correction. 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.

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 :

    // 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 :

Preuve actuelle complémentaire : 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 :

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 ; 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.