Skip to main content

Monkeytype EUVDEUVD-2025-201320

| CVE-2025-66563 HIGH
Cross-site Scripting (XSS) (CWE-79)
2025-12-04 security-advisories@github.com
7.1
CVSS 4.0 · Vendor: github
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Create/submit malicious quote with HTML payload
  2. Delivery
    Store script in quote.text/source
  3. Exploit
    Moderator opens approval modal
  4. Execution
    Payload renders and executes JS
  5. Impact
    Steal session or act as victim

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK

2 techniques across 2 tactics: Initial Access, Execution

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires the attacker to submit a quote whose quote.text or quote.source fields contain HTML/script, and requires a victim (a quote approver/moderator, since the vulnerable sink is the quote-approve.ts approval modal) to actually view the pending submission - this passive user interaction (UI:P) is the primary limiting factor. The flaw affects Monkeytype 25.49.0 and earlier where these fields are inserted into the DOM with only partial escaping (quotes/textarea boundaries); it is fully remediated in the patched build that wraps both fields in escapeHTML(). Realistic exploitation also depends on the attacker being able to submit quotes, which typically requires an authenticated Monkeytype account, narrowing it from purely anonymous abuse.

Impact

Signals converge on a genuine but low-urgency stored XSS (CWE-79) in Monkeytype. The vendor CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:P/VC:H) yields 7.1 (High), reflecting network reachability, low complexity, and high confidentiality impact once triggered, but it is tempered by required passive user interaction (UI:P) - a victim must view the malicious quote submission. EPSS is only 0.05% (16th percentile), indicating very low probability of broad opportunistic exploitation, and the CVE is NOT on CISA KEV, so there is no evidence of active exploitation. A public exploit reference exists via the GitHub Security Advisory (GHSA-mfjh-9552-8g27), and the fix is confirmed by the vendor patch commit, so the technical pathway is fully documented and verifiable from source. CONFLICT/CAVEAT: the vendor vector uses PR:N (unauthenticated), but the vulnerable code path is the quote-approval modal (quote-approve.ts) and submitting a quote on Monkeytype realistically requires an authenticated account, so true exploitation likely needs attacker-side authentication (PR:L) - verify account/submission requirements with the vendor. Net: a legitimate client-side security bug worth patching, but not an emergency given low EPSS, no KEV, required interaction, and a narrow victim population (quote approvers/moderators).

Exploit ScenarioDerived

An attacker submits a quote to Monkeytype with HTML/JavaScript payloads embedded in the quote.text or quote.source fields, which are inserted directly into the DOM of the quote-approval interface. When a moderator or user viewing pending quote submissions opens the approval modal, the injected script executes in their browser session, enabling session/token theft or actions on their behalf. A public advisory (GHSA-mfjh-9552-8g27) documents the issue and the fixing commit demonstrates the exact unescaped sinks.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.1% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv2 – Oct 18, 2026

Monkeytype 25.49.0 and earlier renders attacker-controlled quote submission fields (quote.text and quote.source) directly into the DOM inside the quote-approval modal, so HTML/script payloads survive the partial quote/textarea escaping and execute in the browser of the moderator reviewing the pending quote. This is a stored cross-site scripting (CWE-79) issue in a client-side TypeScript frontend, and publicly available exploit code exists, though exploitation requires a victim moderator to open the approval view (UI:P) and, per the assessed vector, an attacker account able to submit quotes (PR:L). Risk is real but low-urgency: EPSS is 0.05% (16th percentile) and the flaw is not listed in CISA KEV.

Earlier versions of this analysis (1)
v1 Mar 15, 2026 - 16:35 CVSS 6.1

RemediationAI

Upgrade Monkeytype past 25.49.0 to a build containing commit d6d062a77132ba7d6ba3b482d46ae329d3b8d695, which routes quote.text and quote.source through escapeHTML() before DOM insertion; confirm the deployed frontend bundle actually includes the escapeHTML import in the quote-approve module, since the fix is a frontend asset that can be cached. If immediate upgrade is not possible, disable or gate the quote-submission and quote-approval workflow so untrusted users cannot place content into the moderation queue, and have moderators review pending quotes only after such content is sanitized or rendered as plain text - trade-off is loss of the community quote pipeline. As defense in depth, deploy a Content-Security-Policy with script-src 'self' and no 'unsafe-inline' on the moderation surface to limit payload execution, accepting that any inline scripts in the app must be refactored first. Details and patch linkage are in the vendor advisory https://github.com/monkeytypegame/monkeytype/security/advisories/GHSA-mfjh-9552-8g27 and the fix commit https://github.com/monkeytypegame/monkeytype/commit/d6d062a77132ba7d6ba3b482d46ae329d3b8d695.

Affected VersionsENISA

monkeytype ≤ 25.49.0

Affected Packages

euvd monkeytype no fix

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

Monkeytype's frontend builds the quote-approval list by interpolating server-stored quote records into HTML template literals (frontend/src/ts/modals/quote-approve.ts), placing quote.text inside a <textarea> body and quote.source inside an input value="..." attribute. The original code relied on the surrounding quotes and textarea tags as a form of escaping, which is not valid output encoding: a payload containing a closing quote or </textarea> breaks out of the intended context and yields arbitrary HTML/JavaScript in the DOM - the classic CWE-79 failure to neutralize user-controlled input before web page generation. Because the sink is the moderation/approval UI rather than the public typing page, the exploit is a stored, privilege-crossing XSS (S:C in the assessed CVSS:3.1 vector) that targets quote approvers. The upstream fix imports escapeHTML from frontend/src/utils/misc and applies it to both quote.text and quote.source, establishing proper contextual output encoding at the sink. CPE data (cpe:2.3:a:monkeytype:monkeytype:*:*:*:*:*:*:*:*) with the EUVD range "monkeytype ≤ 25.49.0" confirms the entire release line through 25.49.0 is affected.

Know when Monkeytype gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (github) PRIMARY 7.1 HIGH
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N
vuln.today AI 7.6 HIGH

Network stored XSS with low complexity; PR:L because submitting a quote requires an account, UI:R because an approver must view the submission, S:C and C:H for script execution in the victim's browser context.

3.1 AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:L/A:N
4.0 AV:N/AC:L/AT:N/PR:L/UI:P/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (github).

CVSS VectorVendor: github

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
Passive
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
Low
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

6
Severity Changed
Oct 18, 2026 - 15:22 NVD
MEDIUM HIGH
CVSS changed
Oct 18, 2026 - 15:22 NVD
6.1 (MEDIUM) 7.1 (HIGH)
Patch released
Mar 15, 2026 - 16:35 nvd
Patch available
PoC Detected
Dec 17, 2025 - 16:12 vuln.today
Public exploit code
CVE Published
Dec 04, 2025 - 23:15 cve.org
HIGH 7.1
CVE Published
Dec 04, 2025 - 23:15 nvd
MEDIUM 6.1

DescriptionCVE.org

Monkeytype is a minimalistic and customizable typing test. In 25.49.0 and earlier, there is improper handling of user input which allows an attacker to execute malicious javascript on anyone viewing a malicious quote submission. quote.text and quote.source are user input, and they're inserted straight into the DOM. If they contain HTML tags, they will be rendered (after some escaping using quotes and textarea tags).

Executive ViewAI

Why It Matters

Organizations using Monkeytype should be aware of moderate risk from CVE-2025-66563, a cross-site scripting vulnerability rated CVSS 6.1. Attackers could inject scripts to steal sessions or perform actions as authenticated users. Proof-of-concept code is publicly available. A patch is available and should be applied during regular vulnerability management.

Business Impact: Low
Compensating Controls

Apply vendor patch. If patching is delayed: implement CSP headers, enable HttpOnly cookies, deploy WAF XSS rules.

Threat Intelligence Overview

EPSS Score
0.1%
Top 84% exploitable
Prevalence
Low
single community typing-test web app, minimal self-hosted production footprint
Exploit
POC
Public exploit code exists
Data Quality
5 sources
Confidence: Medium

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity HIGH
CISA KEV No
Public POC Yes
EPSS 0.1%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
Poc
System Exposure· derived
Open
Automatable· derived
No
Human Impact
Low

Priority Score

56
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +36
PoC: +20
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy