Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessOpen malicious fork PR with substituted oxfmt dependency
-
DeliveryMaintainer applies 'format' label triggering workflow
-
ExploitWorkflow installs and invokes fork-controlled oxfmt binary
-
ExecutionAttacker code runs in CI job
-
PersistRead GITHUB_TOKEN from git config
-
ImpactPush 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
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
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
AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N
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).
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.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
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.
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
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
Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.
More in Monkeytype
View allMonkeytype is a minimalistic and customizable typing test. Rated critical severity (CVSS 9.6), this vulnerability is rem
Monkeytype 25.49.0 and earlier renders attacker-controlled quote submission fields (quote.text and quote.source) directl
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-2026-113222
NVD
CVE.org
EPSS
GitHub
Exploit-DB