Skip to main content
CVE Vulnerability Database
Vulnerability Database/CVE-2026-23630

CVE-2026-23630: Docmost Mermaid Stored XSS Vulnerability

CVE-2026-23630 is a stored Cross-Site Scripting flaw in Docmost that exploits Mermaid diagram rendering to execute arbitrary code. This post covers the technical details, affected versions 0.3.0-0.23.2, and mitigation.

Published:

CVE-2026-23630 Overview

CVE-2026-23630 is a stored Cross-Site Scripting (XSS) vulnerability affecting Docmost, an open-source collaborative wiki and documentation software. The vulnerability exists in the Mermaid code block rendering functionality, where attacker-controlled Mermaid diagrams can be rendered using mermaid.render() and subsequently injected into the DOM via dangerouslySetInnerHTML without proper sanitization. This allows attackers to leverage Mermaid's per-diagram %%{init}%% directives to override the securityLevel configuration and enable htmlLabels, ultimately permitting arbitrary HTML and JavaScript execution for any user viewing the malicious content.

Critical Impact

Authenticated attackers can inject persistent malicious scripts that execute in the browsers of any user viewing the affected wiki page, potentially leading to session hijacking, credential theft, or further compromise of collaborative documentation environments.

Affected Products

  • Docmost versions 0.3.0 through 0.23.2

Discovery Timeline

  • 2026-01-21 - CVE CVE-2026-23630 published to NVD
  • 2026-01-21 - Last updated in NVD database

Technical Details for CVE-2026-23630

Vulnerability Analysis

This stored XSS vulnerability resides in the Mermaid diagram rendering pipeline within Docmost's frontend application. When users create or edit wiki pages containing Mermaid code blocks, the application processes these diagrams client-side using the Mermaid library's render() function. The resulting SVG/HTML output is then inserted directly into the page DOM using React's dangerouslySetInnerHTML property without any sanitization step.

The attack exploits Mermaid's directive system, which allows per-diagram configuration overrides through %%{init}%% blocks at the beginning of diagram definitions. An attacker can craft a malicious Mermaid diagram that sets securityLevel: 'loose' and htmlLabels: true, effectively disabling the library's built-in XSS protections. This configuration allows arbitrary HTML content within diagram labels, including <script> tags and event handlers that execute JavaScript when the diagram is rendered.

Because the malicious payload is stored in the wiki content, every user who views the affected page will have the malicious script executed in their browser context, making this a particularly dangerous vulnerability in collaborative environments.

Root Cause

The root cause is the absence of output sanitization when rendering user-controlled Mermaid diagrams. The application relies solely on Mermaid's internal security settings, which can be overridden by users through inline directives. The use of dangerouslySetInnerHTML without passing the content through a sanitization library like DOMPurify creates a direct path for XSS payloads to reach the DOM.

Attack Vector

The attack is network-based and requires low-privilege authenticated access to create or edit wiki content. An attacker creates a wiki page containing a specially crafted Mermaid diagram with malicious %%{init}%% directives that override security settings. When any authenticated user views this page, the unsanitized SVG/HTML output is rendered in their browser, executing the attacker's JavaScript payload with full access to the victim's session context.

The following patch demonstrates the fix implemented in version 0.24.0, which introduces DOMPurify sanitization:

text
 import classes from "./code-block.module.css";
 import { useTranslation } from "react-i18next";
 import { useComputedColorScheme } from "@mantine/core";
+import DOMPurify from "dompurify";
 
 interface MermaidViewProps {
   props: NodeViewProps;

Source: GitHub Commit cb9f27da9a8b4940760e37e5238a1eb91e427daf

Detection Methods for CVE-2026-23630

Indicators of Compromise

  • Wiki pages containing Mermaid code blocks with %%{init}%% directives that set securityLevel to loose or enable htmlLabels
  • Mermaid diagrams containing suspicious HTML elements such as <script>, <iframe>, or event handler attributes like onload, onerror, or onclick
  • Unusual JavaScript execution patterns or network requests originating from wiki page views

Detection Strategies

  • Implement content scanning rules to detect Mermaid diagrams containing %%{init}%% directives with security-weakening configurations
  • Monitor for JavaScript execution attempts within SVG elements rendered on wiki pages
  • Review web application firewall logs for requests containing potential XSS payloads in wiki content submissions
  • Audit user-generated content for patterns consistent with XSS injection attempts in Mermaid syntax

Monitoring Recommendations

  • Enable browser-based Content Security Policy (CSP) reporting to detect inline script execution attempts
  • Configure application logging to capture wiki content modifications, particularly those involving code blocks
  • Implement real-time alerting for wiki pages containing known malicious patterns in Mermaid diagrams

How to Mitigate CVE-2026-23630

Immediate Actions Required

  • Upgrade Docmost to version 0.24.0 or later immediately
  • Audit existing wiki content for potentially malicious Mermaid diagrams containing %%{init}%% directives
  • Consider temporarily disabling Mermaid rendering if immediate upgrade is not possible
  • Review access logs to identify any suspicious content modifications prior to patching

Patch Information

The vulnerability has been addressed in Docmost version 0.24.0. The fix introduces DOMPurify sanitization of Mermaid-rendered output before DOM insertion, preventing malicious HTML and JavaScript from executing. Organizations should upgrade to version 0.24.0 or later as documented in the GitHub Release v0.24.0 and the GitHub Security Advisory GHSA-r4hj-mc62-jmwj.

Workarounds

  • Implement a Content Security Policy (CSP) header that restricts inline script execution using script-src 'self' to limit XSS impact
  • Restrict wiki edit permissions to trusted users until the patch can be applied
  • Deploy a web application firewall rule to block submissions containing Mermaid %%{init}%% directives with securityLevel or htmlLabels modifications
  • Consider using a reverse proxy to sanitize HTML content before delivery to end users
bash
# Example Content Security Policy header configuration for Nginx
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; object-src 'none';" always;

Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

Default Legacy - Prefooter | Experience the World’s Most Advanced Cybersecurity Platform

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.