Skip to content

Self-XSS and Preview window as a Proxy

Moderate
scopsy published GHSA-w8vm-jx29-52fr Jun 3, 2025

Package

novu (Web)

Affected versions

<=v2.0.0

Patched versions

Dashboard >2.0.0

Description

Summary

Two issues - Self-XSS (how about "Invited Members" feature? So possible without prefix "Self-") and opportunity to make "a Proxy" from Novu. I decided to let you know about both of these issues with single report, because it's connected.
I hope it will be useful and valuable for you.

The issue described is a Self-XSS (Cross-Site Scripting) vulnerability that occurs in the Preview window within the Novu platform. The issue can allow malicious payloads (JavaScript) to execute in the context of the user's browser.

Details

Self-XSS typically refers to scenarios where users are tricked into executing malicious JavaScript in their own browser (e.g., through developer tools or form inputs). However, the described issue is not purely "Self-XSS", as the malicious payloads can be entered by an attacker with the intention of exploiting the system’s lack of input validation.

Novu allows unvalidated custom JavaScript <script> tags) in the Edit window, which are then executed when switched to the Preview window.

Repro steps:

  1. As logged in user go to https://web.novu.co/workflows ; Select some workflow, ie. "digest-workflow-example" ; click Email button/rectangle/element there https://web.novu.co/workflows/edit/[chars]/email/[chars]
  2. See window for Edit, add there payloads:
    Hi {{subscriber.firstName}}! 👋 You've sent {{step.total_count}} <script>alert(window.origin)</script> <script>alert(document.domain)</script> <script>location.href = 'https://www.wikipedia.org/';</script> events!
  3. From Edit tab change to Preview tab - payloads will be executed

PoC

Result - screenshots:
poc1
and
poc2

POC - payloads examples:
<script>alert(window.origin)</script> <script>alert(document.domain)</script> <script>location.href = 'https://www.wikipedia.org/';</script>

Quick notes:

<script>alert(document.cookie)</script> will show 4x cookies
<script>location.href = 'https://www.wikipedia.org/';</script>   - "proxy effect"

Proposed remediation:
Sanitize/purify there. I'm not sure that payloads like presented in POC are there necessary for proper Novu service.

Impact

This is a Cross-Site Scripting (XSS) vulnerability, specifically falling under:

  • Persistent/Stored XSS: The malicious payload is saved in the system (in the "Edit" window) and then executed later in the "Preview" window.
  • Potential Proxy Effect: Due to the ability to execute JavaScript (e.g., location.href), the vulnerability could be abused to redirect users to untrusted/malicious websites or exfiltrate sensitive information.

Who is impacted:

  • Authenticated Users (Low-Privilege Users):
    The attacker can exploit this issue using their own account to inject malicious payloads.
    If the system allows multiple users to collaborate on workflows (e.g., "Invited Members"), the payload could be triggered when another user previews the workflow, broadening the impact.
  • Potential Escalation to High-Privilege Users:
    If higher-privilege users (e.g., admins) interact with compromised workflows, attackers could exfiltrate sensitive data such as cookies or session tokens tied to those accounts.

Similar case like this one, described here:
"Send a malicious SVG file to the target and ask them to test it on any Replicate model that accepts images as input.
Upon uploading, the user will immediately see a fake error message prompting them to click for more information.
The user clicks the “error” message.
Our XSS payload executes, exfiltrating the user’s account API key" source https://www.imperva.com/blog/lessons-learned-from-exposing-unusual-xss-vulnerabilities/

Additional information:
I followed your recommendations VDP. On the site https://github.com/novuhq/novu/security there is info "Reporting Instructions:
Email your findings to [email protected]." - I did that. (2023-08)

References:
https://cwe.mitre.org/data/definitions/79.html
https://capec.mitre.org/data/definitions/63.html
https://owasp.org/www-community/attacks/xss/
https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html
https://portswigger.net/web-security/cross-site-scripting
https://en.wikipedia.org/wiki/Proxy_server

Severity

Moderate

CVSS overall score

This score calculates overall vulnerability severity from 0 to 10 and is based on the Common Vulnerability Scoring System (CVSS).
/ 10

CVSS v3 base metrics

Attack vector
Network
Attack complexity
Low
Privileges required
Low
User interaction
Required
Scope
Unchanged
Confidentiality
Low
Integrity
Low
Availability
Low

CVSS v3 base metrics

Attack vector: More severe the more the remote (logically and physically) an attacker can be in order to exploit the vulnerability.
Attack complexity: More severe for the least complex attacks.
Privileges required: More severe if no privileges are required.
User interaction: More severe when no user interaction is required.
Scope: More severe when a scope change occurs, e.g. one vulnerable component impacts resources in components beyond its security scope.
Confidentiality: More severe when loss of data confidentiality is highest, measuring the level of data access available to an unauthorized user.
Integrity: More severe when loss of data integrity is the highest, measuring the consequence of data modification possible by an unauthorized user.
Availability: More severe when the loss of impacted component availability is highest.
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:L/I:L/A:L

CVE ID

No known CVE

Weaknesses

Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

The product does not neutralize or incorrectly neutralizes user-controllable input before it is placed in output that is used as a web page that is served to other users. Learn more on MITRE.

URL Redirection to Untrusted Site ('Open Redirect')

A web application accepts a user-controlled input that specifies a link to an external site, and uses that link in a Redirect. This simplifies phishing attacks. Learn more on MITRE.

Credits