Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-34828 — Persistance de session de listmonk après réinitialisation du mot de passe et changement de mot de passe | Kitploit
Outils/GitHubGitHub/0xmrma/cve-2026-34828
Analyse des VulnérabilitésExploitationSécurité WebTests d'IntrusionAuthentification
GitHub0xmrma/cve-2026-34828

CVE-2026-34828

Persistance de session de listmonk après réinitialisation du mot de passe et changement de mot de passe

Voir le dépôt
15il y a 6 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-34828

Persistance de session dans listmonk après la réinitialisation et le changement de mot de passe

Introduction

J'ai trouvé ce problème en analysant listmonk, un gestionnaire open-source de lettres d'information et de listes de diffusion, en gardant à l'esprit une simple question de sécurité :

Lorsqu'un utilisateur change ou réinitialise son mot de passe, l'application met-elle réellement fin aux sessions déjà émises ?

Dans ce cas, la réponse était non.

Les sessions authentifiées précédemment émises restaient valides après :

  • la réinitialisation du mot de passe
  • le changement du mot de passe

Cela signifiait qu'un cookie de session volé pouvait survivre aux événements de sécurité mêmes sur lesquels les utilisateurs comptent pour récupérer leur compte.

Le problème a été accepté et s'est vu attribuer le CVE-2026-34828.

Projet : listmonk sur GitHub
CVE : CVE-2026-34828

Cela touchait listmonk, un projet largement adopté avec 5M+ téléchargements Docker.

photo0

Chaîne d'attaque

stolen authenticated session → victim resets or changes password → old session remains valid → attacker retains account access after credential recovery


Ce que fait listmonk

listmonk est un gestionnaire auto-hébergé de listes de diffusion et de lettres d'information.

Il fournit :

  • l'authentification des administrateurs
  • la gestion des utilisateurs
  • la création de campagnes
  • la gestion des abonnés
  • les paramètres SMTP et opérationnels
  • l'administration via navigateur

Cela signifie que son modèle de session constitue une véritable frontière de sécurité.

La question importante ici n'était pas de savoir si listmonk prend en charge la réinitialisation du mot de passe.

La vraie question était :

La réinitialisation ou le changement de mot de passe révoque-t-il réellement la persistance de l'attaquant si une session a déjà été volée ?

Dans ce cas, non.


Pourquoi ce bug méritait d'être examiné

Beaucoup de revues de sécurité se concentrent de manière trop étroite sur les contournements de connexion et les escalades de privilèges évidentes.

Elles passent à côté d'une classe importante de faiblesses :

les échecs de récupération

Si un utilisateur change ou réinitialise son mot de passe, cette action est censée avoir un sens.
Elle est censée réduire la confiance accordée aux anciens identifiants et à l'ancien état d'authentification.

Si un attaquant dispose déjà d'une session valide et que cette session survit à l'événement de récupération, alors la victime n'a pas réellement récupéré son compte en totalité.

C'était le problème ici.

Ce n'était pas un bug de validation de connexion. Ce n'était pas un problème cryptographique. Ce n'était pas une défaillance du hachage des mots de passe.

C'était une défaillance du cycle de vie des sessions :

  • l'état du mot de passe a changé,
  • la récupération du compte a eu lieu,
  • mais les anciennes sessions étaient toujours considérées comme fiables.

C'est suffisant pour créer une véritable vulnérabilité.


La frontière sur laquelle je me suis concentré

Je n'ai pas abordé listmonk en frappant des points de terminaison au hasard en espérant que l'un d'eux cède.

La voie la plus solide consistait à identifier d'abord la frontière de confiance à plus haute valeur.

Pour les logiciels fortement orientés authentification, l'une des meilleures frontières à tester est celle-ci :

Les modifications de compte sensibles à la sécurité révoquent-elles les sessions précédemment approuvées ?

Cette question devient généralement intéressante autour de :

  • la réinitialisation du mot de passe
  • le changement de mot de passe
  • les modifications de 2FA
  • les flux de récupération de compte

Dans listmonk, le signal le plus fort provenait des deux premiers.

C'est là que le problème est devenu clair.


Cause racine

Le bug n'était pas que les changements de mot de passe échouaient.

Le bug était que les sessions leur survivaient.

D'après la revue du code source, le flux de réinitialisation du mot de passe :

  • générait et validait un jeton de réinitialisation à usage unique,
  • mettait à jour le mot de passe,
  • créait une nouvelle session,

mais aucune révocation visible des sessions plus anciennes n'était effectuée.

Le même schéma apparaissait dans le flux de changement de mot de passe authentifié :

  • le mot de passe était mis à jour,
  • mais les sessions plus anciennes déjà émises n'étaient pas invalidées.

Ce comportement correspondait exactement aux résultats constatés en conditions réelles.

Les portions de code pertinentes que j'ai examinées étaient :

  • cmd/auth.go pour le comportement lié à l'oubli et à la réinitialisation du mot de passe
  • cmd/users.go pour les mises à jour de profil authentifiées
  • internal/core/users.go pour la gestion de la mise à jour du mot de passe

Pourquoi c'est exploitable

Parce que le vol de session est une condition d'attaque réelle.

Dès qu'un attaquant obtient un cookie de session authentifié valide par quelque moyen que ce soit, tel que :

  • compromission du navigateur
  • logiciel malveillant
  • accès à un poste de travail partagé
  • XSS dans un autre composant
  • fuite via proxy ou débogage
  • exposition accidentelle du cookie

la victime devrait pouvoir mettre fin à cette persistance de l'attaquant en changeant ou en réinitialisant son mot de passe.

Ici, elle ne le pouvait pas.

La chaîne d'attaque était simple :

  • l'attaquant dispose d'un cookie de session valide
  • la victime effectue une réinitialisation ou un changement de mot de passe
  • l'ancien mot de passe devient invalide
  • le nouveau mot de passe fonctionne
  • l'ancienne session de l'attaquant s'authentifie toujours avec succès

C'est là toute la vulnérabilité.


Pourquoi c'est un problème de sécurité, et pas seulement un comportement applicatif

La distinction importante est la persistance après la récupération.

Beaucoup d'applications traitent le changement de mot de passe comme un événement purement lié aux identifiants. Ce n'est pas suffisant.

La vraie question n'est pas :

« La valeur du mot de passe a-t-elle changé en stockage ? »

La vraie question est :

« La relation de confiance attachée aux sessions plus anciennes a-t-elle été révoquée ? »

Dans listmonk, non.

Cela transforme ce qui aurait pu être une maintenance de compte ordinaire en une récupération de sécurité incomplète.

C'est la différence entre :

  • la continuité de session ordinaire
  • et une véritable faiblesse de sécurité

Preuve de concept

J'ai validé le problème dans deux flux distincts.

Cas 1 : La réinitialisation du mot de passe ne révoque pas les sessions existantes

Tout d'abord, j'ai créé un utilisateur de test normal et je me suis connecté, en enregistrant le cookie de session authentifié.

Ensuite, j'ai déclenché le flux mot de passe oublié, capturé le lien de réinitialisation et réinitialisé le mot de passe.

Après la réinitialisation :

  • l'ancien mot de passe ne fonctionnait plus
  • le nouveau mot de passe fonctionnait
  • mais l'ancien cookie de session d'avant la réinitialisation s'authentifiait toujours avec succès

Une requête de validation représentative ressemblait à ceci :

GET /api/profile HTTP/1.1
Host: 127.0.0.1:9000
Cookie: session=<old_pre_reset_session>

Et le serveur renvoyait toujours :

HTTP/1.1 200 OK
Content-Type: application/json

avec le profil authentifié.

Cela établissait l'affirmation centrale :

  • la récupération était terminée,
  • les identifiants avaient changé,
  • mais la confiance accordée à la session existante restait intacte.

Cas 2 : Le changement de mot de passe ne révoque pas les sessions actives parallèles

Télécharger l’outil