
-----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-----
@cyntler/react-doc-viewer パッケージ (v1.17.1) において、保存型クロスサイトスクリプティング (Stored XSS) の脆弱性が特定されました。この脆弱性は TXTRenderer コンポーネントに存在し、.txt ファイルの生のファイル内容を事前のサニタイズやエンティティエスケープなしで ReactNode として明示的にキャストしてレンダリングします。
src/renderers/txt/index.tsx 内:
{currentDocument?.fileData as ReactNode}
脆弱性を再現するには、以下の明示的なスクリプトペイロードを含む exploit.txt ファイルを作成し、それをドキュメントビューアコンポーネントに読み込みます:
<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')">
攻撃者は被害者のブラウザコンテキスト内で任意のJavaScriptを実行できます。これにより以下の影響が発生します:
動的なテキスト入力をレンダリングする前に、DOMPurify のようなHTMLサニタイズライブラリを使用してサニタイズするか、または生の文字列入力を ReactNode オブジェクトに安全でないキャストを行わないようにします:
import DOMPurify from 'dompurify';
const sanitizedHTML = DOMPurify.sanitize(currentDocument?.fileData);
return <div dangerouslySetInnerHTML={{ __html: sanitizedHTML }} />;
本勧告は Walid Riouah (サイバーセキュリティ研究者 & レッドチームメンバー) によって作成されました