Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessCreate/submit malicious quote with HTML payload
-
DeliveryStore script in quote.text/source
-
ExploitModerator opens approval modal
-
ExecutionPayload renders and executes JS
-
ImpactSteal 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv2 – 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)
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
Affected Packages
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
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
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.
Primary rating from Vendor (github).
CVSS VectorVendor: github
Lifecycle Timeline
6DescriptionCVE.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
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.
Apply vendor patch. If patching is delayed: implement CSP headers, enable HttpOnly cookies, deploy WAF XSS rules.
Threat Intelligence Overview
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.
More in Monkeytype
View allMonkeytype is a minimalistic and customizable typing test. Rated critical severity (CVSS 9.6), this vulnerability is rem
Arbitrary code execution inside Monkeytype's 'fix-formatting' GitHub Actions workflow (versions prior to 26.43.0) lets a
Rate-limit bypass in Monkeytype ≤ 26.26.0 allows unauthenticated remote attackers to neutralize all request throttling p
Monkeytype is a minimalistic and customizable typing test. Rated low severity (CVSS 2.4), this vulnerability is low atta
EUVD-2025-201320
NVD
CVE.org
EPSS
GitHub
Exploit-DB