Skip to content

One-click Remote Code Execution via XSS and Custom URL Handling in Muffon v2.2.0

High
staniel359 published GHSA-gc3f-gqph-522q Jan 4, 2026

Package

npm muffon (npm)

Affected versions

2.2.0

Patched versions

2.3.0

Description

Summary

We discovered a one-click Remote Code Execution (RCE) vulnerability in Muffon v2.2.0. An attacker can exploit this issue by embedding a specially crafted muffon:// link on any website they control. When a victim visits the site or clicks the link, the browser triggers Muffon’s custom URL handler, causing the application to launch and process the URL. This leads to RCE on the victim's machine without further interaction.

Details

Multiple XSSes

Muffon uses the Vue directive v-html to render untrusted input in several components. According to Vue’s security recommendations, v-html should only be used on sanitized content. Otherwise, it introduces XSS vulnerabilities. In contrast, v-text is the safer alternative for untrusted values.

XSS in Search History
poc-xss-search

XSS in the Playlist Editor
poc-xss-playlist

These two are self-XSS since they require direct user input and interaction, making them not very practical for exploitation in real-world attacks.

XSS in the Artist Page

A more severe issue exists in the artist page. Muffon retrieves artist data from third-party sources like Bandcamp and injects it into the DOM without sanitization. We exploited this by registering a Bandcamp artist using the name: <img src=1 onerror=alert('band-tt-13337')>. In this case, when the user visit my artist page, it would directly get XSSed.

xss-artist-poc

When a user visits the corresponding artist page within Muffon, the payload is rendered and executed immediately.

Although this is a stored XSS, discovering the malicious page randomly is unlikely. However, when combined with the next issue, it becomes a powerful attack vector.

Custom Link Handling

Muffon registers a custom URL scheme (muffon://) that supports deep linking into internal pages. This allows an attacker to embed a crafted link on a website. Once a victim visits the site, the browser launches Muffon and loads the target internal page without even exposing the URL contents to the user.

This enables automatic navigation to an XSS payload without any further interaction from the user.

From XSS to RCE

The vulnerable renderer has access to privileged APIs such as openExternalLink from the preload script, which will be handled by Electron’s shell.openExternal in the main process. This API can be abused to execute arbitrary files on the victim’s machine.

mainProcess.openExternalLink('file:///tmp/calc')

PoC

Video PoC can be found at: https://drive.google.com/file/d/1eCPCQ6leuVM_vecfofFv04c0t9isCBqR/view?usp=sharing

Steps to reproduce:

  1. Open the browser and navigate to the following link: muffon://artists/%3Cimg%20src%3D1%20onerror%3DmainProcess.openExternalLink('file%3A%2F%2F%2Ftmp%2Fcalc')%3E/tracks/noscript-7331?source=bandcamp&track_id=3502361426&artist_id=2528590395
  2. Muffon will launch and immediately execute the payload. If /tmp/calc is an executable (e.g., Calculator), it will be launched.

Impact

This is a one-click Remote Code Execution vulnerability triggered by simply visiting a webpage. The attack works just like a typical reflected or DOM-based XSS, however, it leads to a much more severe consequence by allowing code execution on the victim’s machine.

Credits

Zhengyu Liu (jackfromeast), Jianjia Yu (suuuuuzy)

Severity

High

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
None
User interaction
Required
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High

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:N/UI:R/S:U/C:H/I:H/A:H

CVE ID

CVE-2025-55204

Weaknesses

Improper Control of Generation of Code ('Code Injection')

The product constructs all or part of a code segment using externally-influenced input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could modify the syntax or behavior of the intended code segment. Learn more on MITRE.

Credits