Skip to main content

Monkeytype CVE-2026-118762

| EUVDEUVD-2026-113222 CRITICAL
Inclusion of Functionality from Untrusted Control Sphere (CWE-829)
2026-10-29 GitHub_M
9.3
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

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

  1. Access
    Open malicious fork PR with substituted oxfmt dependency
  2. Delivery
    Maintainer applies 'format' label triggering workflow
  3. Exploit
    Workflow installs and invokes fork-controlled oxfmt binary
  4. Execution
    Attacker code runs in CI job
  5. Persist
    Read GITHUB_TOKEN from git config
  6. Impact
    Push to repo or tamper with PRs/issues

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A08:2025 - Software or Data Integrity Failures
ASVS 5.0
V15 - Secure Coding and Architecture Trusted source inclusion only
Exploitation Conditions

Exploitation requires that the target repository run the vulnerable .github/workflows/fix-formatting.yml, which triggers on pull_request_target with contents:write and pull-requests:write permissions, checks out the fork PR's head, installs dependencies from the fork's package.json, and then invokes the fork-sourced 'oxfmt' binary while actions/checkout leaves persist-credentials at its default (true), embedding the GITHUB_TOKEN in .git/config. The decisive attacker prerequisite is control of their own fork's package.json (trivially satisfied). The key LIMITING factor is that a repository maintainer with triage/write access must apply the 'format' label to the attacker's PR (UI:R) - the workflow only runs on that labeled event - so the attack cannot proceed without that human action; note that --ignore-scripts does NOT mitigate it because it only suppresses npm/pnpm lifecycle hooks, not a package's declared bin entry invoked by name.

Impact

This is a genuine high-priority issue, not a CVSS-inflated one, but its risk is scoped to the Monkeytype GitHub repository and CI infrastructure - not the live monkeytype.com application, its database, or user accounts, which the advisory explicitly rules out. The CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N, 9.3) aligns well with the mechanism: a remote, unauthenticated external contributor (PR:N) triggers a classic GitHub Actions 'Pwn Request' with low complexity (AC:L), but exploitation requires a maintainer to apply the 'format' label (UI:R), and the compromise of the CI runner then affects a separate security authority - the repository and its write-scoped GITHUB_TOKEN - justifying the scope change (S:C). The vuln.today Decision label is act_now, and a vendor patch plus detailed GHSA advisory with reproduction steps are published. No EPSS score and no CISA KEV entry are present in the input, so there is no evidence of active exploitation in the wild; the act_now urgency rests on the high technical impact, the published mechanism/PoC, and the trivial attacker-side effort rather than on observed attacks. The one meaningful limiter is the UI:R dependency on a maintainer labeling the PR - exploitation is not fully autonomous.

Exploit ScenarioDerived

An external contributor opens a pull request against monkeytypegame/monkeytype whose fork contains a malicious package.json that replaces the 'oxfmt' devDependency with an attacker-controlled binary. When a maintainer applies the 'format' label, the pull_request_target workflow checks out the fork, installs its dependencies, and invokes 'pnpm oxfmt', executing the attacker's code inside a CI job that holds a contents:write + pull-requests:write GITHUB_TOKEN. The GHSA advisory includes working reproduction steps that demonstrate the bin-execution mechanism locally (with simulated token exfiltration); they are a proof-of-concept of the trigger rather than a packaged against-production exploit.

Act Now Prioritize within 24-48h. Why: CRITICAL severity.
Patch available 0.3% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Oct 29, 2026

Arbitrary code execution inside Monkeytype's 'fix-formatting' GitHub Actions workflow (versions prior to 26.43.0) lets an external contributor run attacker-controlled code in a CI job that holds a repository-scoped GITHUB_TOKEN with contents:write and pull-requests:write, allowing commits, tags, and pull-request or issue edits to be pushed to monkeytypegame/monkeytype. The workflow triggers on pull_request_target, checks out the fork's head commit, installs dependencies from the fork's package.json, and then invokes the fork-supplied oxfmt binary while actions/checkout leaves persist-credentials at its default true, so the token sits in .git/config and is readable or exfiltratable by that binary. The CVSS 3.1 vector is AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N (9.3), so no attacker account or privileges are required, but a maintainer must apply the 'format' label to the malicious PR before the job runs; a public PoC reference exists in the form of the advisory's reproduction steps, and it is not verified here as working exploit code. Impact is confined to the repository and CI infrastructure, not the live monkeytype.com application, its database, or user accounts, and the vendor has released 26.43.0 as the fix.

RemediationAI

Upgrade to Monkeytype 26.43.0 (release tag v26.43.0, commit 592ce1becb9b6824badc14a803bcd9268cbea382), which is the vendor-released patch referenced in GHSA-47v3-j88w-92f8. The fixed workflow follows the advisory's preferred design: untrusted install and format work runs under the read-only pull_request trigger, and a separate workflow_run job running the base branch's own definition applies the result with the elevated token; if pull_request_target is retained, nothing from the fork's package.json or lockfile is installed or executed, oxfmt is resolved at the base branch's pinned version and installed into RUNNER_TEMP, the base .oxfmtrc.json is passed explicitly with --disable-nested-config, symlinks and paths outside the PR checkout are skipped, and persist-credentials:false is set on both checkout steps with push credentials configured only after all PR-derived content is processed. If upgrading is not immediately possible, remove the 'format' label trigger or disable fix-formatting.yml entirely, because as long as the label exists a maintainer action can launch the vulnerable job; note that relying on pnpm install --ignore-scripts or on manually reviewing forks' package.json is not a sound mitigation, since a substituted bin entry still executes when invoked by name. Restricting who can apply the 'format' label reduces exposure but does not eliminate the risk from any maintainer who does so.

Affected VersionsENISA

monkeytype < 26.43.0

Affected Packages

euvd monkeytype fix: 26.43.0

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

The root cause is CWE-829, inclusion of functionality from an untrusted control sphere, realized as the well-known GitHub Actions 'pwn request' pattern. A pull_request_target workflow runs in the context of the base repository with a write-capable GITHUB_TOKEN and access to secrets, which is safe only if untrusted fork content is treated purely as data. Here fix-formatting.yml instead checked out github.event.pull_request.head.repo.full_name at github.event.pull_request.head.sha and ran pnpm install followed by pnpm oxfmt, so the fork's own package.json could redefine the oxfmt devDependency (for example as a link: entry with a bin mapping to an attacker script). The advisory notes that --ignore-scripts only suppresses npm/pnpm lifecycle hooks such as preinstall and postinstall; it does not stop a declared bin entry from executing when invoked by name, which is precisely how the malicious payload runs. Because actions/checkout persists credentials by default, the job token is embedded in the local git config under http.https://github.com/.extraheader and remains readable by any later process in the same job until the job ends, giving the payload both direct write access and an exfiltration path. The commit 592ce1becb9b6824badc14a803bcd9268cbea382 reworks the workflow to pin and install oxfmt from the base branch's package.json into RUNNER_TEMP, check out the base config sparsely, add persist-credentials:false to both checkouts, filter changed files to regular non-symlink paths inside the PR checkout, pass an explicit base --config with --disable-nested-config and a -- terminator, and only configure push credentials after all PR-derived content has been processed.

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_M) PRIMARY 9.3 CRITICAL
AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N
vuln.today AI 9.3 CRITICAL

Remote unauthenticated PR author (AV:N/PR:N) needs only a crafted fork, but a maintainer must apply the label (UI:R); CI compromise affects the separate repo/token authority (S:C) with token read/write impact (C:H/I:H, A:N).

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

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
Required
Scope
Changed
Confidentiality
High
Integrity
High
Availability
None

Lifecycle Timeline

2
Patch available
Oct 29, 2026 - 17:18 EUVD
CVE Published
Oct 29, 2026 - 16:50 cve.org
CRITICAL 9.3

DescriptionCVE.org

Monkeytype is a minimalistic and customizable typing test. Prior to 26.43.0, the .github/workflows/fix-formatting.yml workflow runs on pull_request_target with repository write permissions, checks out a fork pull request, installs dependencies from the fork's package.json, and invokes the fork-controlled oxfmt binary. Because actions/checkout persists the elevated GITHUB_TOKEN in Git configuration until after untrusted code executes, an external contributor whose pull request receives the format label can run arbitrary code, read or exfiltrate the token, and push repository content or modify pull requests and issues. The issue affects the repository CI workflow, not the Monkeytype application or user data. This issue is fixed in version 26.43.0.

Technical POC Analysis

The vulnerable file is .github/workflows/fix-formatting.yml in monkeytypegame/monkeytype.

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Executive ViewAI

Why It Matters

CVE-2026-118762 is a critical supply-chain flaw in Monkeytype's 'fix-formatting' GitHub Actions workflow (prior to 26.43.0), enabling external contributors to execute arbitrary code in a CI job holding a repo-scoped token with contents:write and pull-requests:write. Any organization relying on or contributing to this codebase risks unauthorized commits, tags, and PR/issue tampering to the monkeytypegame/monkeytype repository, undermining code integrity and release trust. Leadership should care because it threatens source-code integrity and the integrity of the software supply chain, with reputational and downstream distribution exposure.

Business Impact: High
Compensating Controls

Vendor-released patch: 26.43.0. Until fully upgraded, restrict the 'format' label to trusted maintainers, set persist-credentials to false, and avoid running fork-supplied binaries in token-bearing jobs.

Threat Intelligence Overview

EPSS Score
0.3%
Top 75% exploitable
Prevalence
Low
flaw confined to one project's CI workflow; Monkeytype deployed as a single site
Social Media
2
Sightings
Data Quality
4 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 CRITICAL
CISA KEV No
Public POC No
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
CRITICAL severity
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
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact
High

Priority Score

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

Attack Technique

Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.

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