id: VULN-01 severity: HIGH category: OWASP A02:2021 (Cryptographic Failures) description: "ReauthTokenGuard accepte un secret vide si la configuration 'auth.reauthSecret' est absente. Un secret vide réduit la sécurité du JWT et peut permettre une validation erronée selon l’implémentation/signature choisie. L’absence de contrôle explicite sur secret non vide est une faiblesse critique de configuration." recommendation: "Refuser l’activation du guard si le secret est vide (fail‑closed) et journaliser un événement de configuration invalide." exploitable: true
id: VULN-02 severity: MEDIUM category: OWASP A07:2021 (Identification and Authentication Failures) description: "Le guard valide le JWT de reauth via jwt.verify, mais ne vérifie pas explicitement les claims attendus (exp, iss, aud). L’acceptation implicite des defaults peut permettre des tokens valides hors audience/issuer." recommendation: "Contraindre iss/aud et vérifier exp/nbf explicitement conformément aux paramètres de sécurité du système." exploitable: true
id: VULN-03 severity: MEDIUM category: OWASP A01:2021 (Broken Access Control) description: "Le guard dépend de request.user injecté par un autre guard. Si l’ordre des guards est modifié ou si request.user n’est pas fiable, la vérification sub==user.sub peut être contournée (auth context confusion)." recommendation: "Assurer l’ordre des guards et valider la présence d’un JWT principal non falsifiable avant ReauthTokenGuard." exploitable: true
id: VULN-04 severity: MEDIUM category: OWASP A09:2021 (Security Logging and Monitoring Failures) description: "Le service PasswordChangeService loggue userId et erreurs, mais ne masque pas explicitement les données sensibles dans toutes les branches d’erreur (ex. verifyPassword catch silencieux). Risque faible mais nécessite audit log strict." recommendation: "Limiter les logs aux identifiants non sensibles et vérifier l’absence d’anciens/nouveaux mots de passe dans toute exception." exploitable: false
id: VULN-05 severity: LOW category: OWASP A07:2021 (Identification and Authentication Failures) description: "Absence de rate limiting obligatoire sur /user/password/change. Le plan mentionne une recommandation, mais aucune protection active n’est montrée dans le code partagé." recommendation: "Ajouter un rate limit effectif sur l’endpoint pour limiter le bruteforce de l’ancien mot de passe." exploitable: true commentaires: "La comparaison timingSafeEqual est correcte et réduit le risque de timing attacks. Le mapping des erreurs Keycloak est défini dans le service, mais la validation JWT reauth doit être renforcée (secret non vide, iss/aud). La journalisation structurée Keycloak est présente et ne loggue pas le mot de passe."