
CVE-2026-30691: Cross-Site Scripting stocké (XSS) dans @cyntler/react-doc-viewer
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
[Suggested description]
Cross-Site Scripting (XSS) vulnerability in @cyntler/react-doc-viewer v1.17.1 allows remote attackers to execute arbitrary JavaScript via a crafted .txt file. The TXTRenderer component fails to sanitize file content and explicitly casts raw data as a ReactNode.
[Additional Information]
"The TXTRenderer is used by default for any text-based files. Since the library is widely used in React applications to preview user-uploaded content, this vulnerability poses a significant risk for applications that do not strictly validate file contents before passing them to the viewer."
[Vulnerability Type] Cross Site Scripting (XSS)
[Vendor of Product] cyntler
[Affected Product Code Base] @cyntler/react-doc-viewer - 1.17.1
[Affected Component] src/renderers/txt/index.tsx
[Attack Type] Remote
[Impact Code execution] true
[Impact Information Disclosure] true
[Attack Vectors]
"An attacker must provide a specially crafted .txt file containing malicious HTML or JavaScript code. When the victim opens this file using the DocViewer component, the script executes in their browser."
[Reference] https://github.com/cyntler/react-doc-viewer/issues/317
[Discoverer] Walid Riouah
Use CVE-2026-30691.
-----BEGIN PGP SIGNATURE-----
-----END PGP SIGNATURE-----
Une vulnérabilité de type Cross-Site Scripting (XSS) stocké a été identifiée dans le paquet @cyntler/react-doc-viewer (v1.17.1). La vulnérabilité se situe dans le composant TXTRenderer, qui rend le contenu brut des fichiers .txt en le convertissant explicitement en ReactNode sans aucune désinfection préalable ni échappement des entités.
Dans src/renderers/txt/index.tsx :
{currentDocument?.fileData as ReactNode}
Pour reproduire la vulnérabilité, créez un fichier nommé exploit.txt contenant la charge utile de script explicite suivante, puis chargez-le dans le composant de visionneuse de documents :
<h1 style="color: red;">Vulnerable!</h1>
<script>alert('XSS_SUCCESS'); document.body.style.background='red';</script>
<img src=x onerror="console.log('XSS_Executed_Successfully')">
Un attaquant peut exécuter du JavaScript arbitraire dans le contexte du navigateur de la victime. Cela peut entraîner :
Désinfectez l'entrée de texte dynamique à l'aide d'une bibliothèque de désinfection HTML comme DOMPurify avant le rendu, ou évitez la conversion non sécurisée d'entrées de chaînes brutes en objets ReactNode :
import DOMPurify from 'dompurify';
const sanitizedHTML = DOMPurify.sanitize(currentDocument?.fileData);
return <div dangerouslySetInnerHTML={{ __html: sanitizedHTML }} />;
Avis de sécurité préparé par Walid Riouah (Chercheur en cybersécurité & Red Teamer)