Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessEnroll as student with org repo
-
DeliveryCommit result.json as symlink to .git/hooks/*
-
ExploitTeacher runs `gh teacher download`
-
ExecutionWrite follows symlink, drops malicious hook
-
Persistgit executes hook as teacher
-
ImpactAbuse admin:org token for org-wide compromise
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V5 - File Handling Path canonicalization, traversal prevention
MITRE ATT&CK
2 techniques across 2 tactics: Discovery, Collection The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires: (1) the attacker to be an enrolled student with a writable assignment repository in the classroom GitHub organization; (2) the student to commit result.json or results.json as a symlink, hardlink, or special file (git materializes it verbatim on clone); and (3) the teacher to run the vulnerable |
| Impact | This is a genuine high-priority vulnerability, not a CVSS-inflated one. The vendor CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H plus subsequent-system SC:H/SI:H/SA:H = 9.4 Critical) is well-supported by the description and the patch diff: a symlink/hardlink planted at result.json or results.json redirects an attacker-controlled write out of the clone into host files the teacher owns (~/.ssh/authorized_keys, ~/.zshrc, cron, or an in-clone .git/hooks/* that git then executes), yielding code execution as the teacher. The impact is amplified because the teacher's gh token carries admin:org, repo, and workflow across the whole classroom organization, so a single teacher victim equals full org compromise - this justifies the scope-change (SC/SI/SA:H). Tempering the raw score: exploitation is NOT zero-click. It requires UI:P (the teacher must run |
| Exploit ScenarioDerived | A student enrolled in the classroom commits result.json (or results.json) into their assignment repository not as a file but as a symlink pointing to .git/hooks/post-checkout (or an escaping path like ../victim or ~/.ssh/authorized_keys). When the teacher runs |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 01, 2026
Arbitrary file write as the grading teacher in Classroom 50 (the gh teacher CLI) before 1.11.0 lets an enrolled student escalate from a writable assignment repository to code execution in the teacher's session: because gh teacher download writes autograde artifacts (result.json and results.json) into the just-cloned student working tree without guarding pre-existing entries, a student who commits either name as a symlink, hardlink, FIFO or directory redirects that write to any path the teacher can reach - ~/.ssh/authorized_keys, ~/.zshrc, a cron file, or an in-clone .git/hooks/* script that git then executes. The written bytes are attacker-controlled (the student's uploaded release asset for result.json, or student-chosen submit-tag names for results.json), and the compromised gh token carries admin:org, repo and workflow across the whole classroom organization. Rated 9.4 under CVSS 4.0 and high priority by our independent review, exploitation is not anonymous and not zero-click: it requires classroom enrollment, a planted malicious entry, and the teacher running the vulnerable command against that untrusted repository (UI:P); no public exploit code was identified at time of analysis, no CISA KEV listing is present, and no EPSS score was supplied. Version 1.11.0 contains the patch.
RemediationAI
Vendor-released patch: upgrade Classroom 50 / the gh teacher extension to 1.11.0, which replaces the raw os.WriteFile sink with os.OpenRoot plus a writeGuarded helper (O_CREATE|O_EXCL after Remove) so writes never follow a planted symlink, hardlink or special file; see the vendor advisory at https://github.com/foundation50/classroom50/security/advisories/GHSA-qx2g-vpwq-466c and the fixing commit https://github.com/foundation50/classroom50/commit/79112f33932d1b5c398a8801d97a8813d52d55ce (extension updates via gh extension upgrade, and pin the version in any CI usage). If upgrading is not immediately possible, apply the documented workarounds with their trade-offs: stop running gh teacher download against untrusted or student-controlled repositories entirely (loses the automated artifact-refresh workflow but removes the attack surface), or run the command inside a disposable container/sandbox with no mount of host home directories, SSH keys or credentials and with a scoped-down token - a container escape or an over-broad token mount re-opens the risk that a written ~/.ssh/authorized_keys or .git/hooks script yields code execution as the teacher, and network access to GitHub is still required so the sandbox must be egress-restricted rather than fully offline. Before the artifact-refresh step, inspect each cloned tree for result.json/results.json entries that are symlinks, hardlinks (non-1 link count) or FIFOs/devices and abort or delete them; that check is manual and does not cover entries planted after inspection, so it should be treated as a stopgap rather than a fix. Rotate the instructor's gh token with admin:org/repo/workflow scopes if a vulnerable run has already occurred against untrusted content.
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-22 (path traversal) expressed through unsafe symlink-following file creation in Go. refreshResultJSON in cli/gh-teacher/internal/download/download.go assembled the sink path with filepath.Join(target, name) and then called os.WriteFile, which follows whatever node already occupies that path. Because git clone materializes committed symlinks verbatim, a student's repo can hand the teacher a result.json/results.json symlink pointing outside the clone or into .git/hooks/*; the follow-up write then lands on the victim path. The same primitive covers hardlinks (a shared inode that Lstat cannot distinguish from a regular file, again reaching .git/hooks/* for code execution) and special files such as a FIFO or socket whose open() blocks a naive writer indefinitely, giving a denial-of-service wedge in addition to arbitrary write. The upstream fix (commit 79112f33932d1b5c398a8801d97a8813d52d55ce) opens the clone directory with os.OpenRoot so writes cannot escape the tree, and adds a writeGuarded helper that first root.Removes any pre-existing entry and then creates the file with O_WRONLY|O_CREATE|O_EXCL, guaranteeing the sink ends as a fresh regular file rather than being written through an attacker-planted node. Affected code is the Foundation 50 Classroom 50 project (CPE cpe:2.3:a:foundation50:classroom50:*:*:*:*:*:*:*:*), distributed as the gh teacher CLI extension; the underlying technology is the GitHub CLI plus GitHub Classroom-style per-student repositories and release assets.
Know when Classroom50 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:H/VA:H/SC:H/SI:H/SA:H
Student acts over the network as an untrusted classroom participant (PR:N); teacher must run the download (UI:R); the write escapes the clone to the teacher's host (S:C) yielding full code execution (C/I/A:H).
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Classroom 50 is a free and open-source tool for managing and grading programming assignments via GitHub. Prior to version 1.11.0, gh teacher download clones each student's assignment repository and then writes autograde artifacts (result.json and results.json) into the just-cloned working tree. The write followed symlinks, so a student who committed result.json or results.json as a symlink (materialized verbatim by git clone) could redirect the teacher's write to an arbitrary path - e.g. ~/.zshrc, ~/.ssh/authorized_keys, a cron file, or an in-clone .git/hooks/* file that git subsequently executes. The written bytes are attacker-controlled (the student's uploaded release asset for result.json; student-chosen submit-tag names for results.json). This is an arbitrary file write leading to code execution as the teacher, whose gh token carries admin:org, repo, and workflow across the entire classroom organization. Version 1.11.0 contains a patch. Some workarounds are available. Avoid running gh teacher download against untrusted student repositories, or run it inside a disposable sandbox / container with no access to sensitive host files or credentials. Inspect cloned trees for symlinked, hardlinked, or special (result.json/results.json) entries before allowing the artifact-refresh step to run.
Technical POC Analysis
Bug class: CWE-22, Improper Limitation of a Pathname to a Restricted Directory.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Classroom 50's gh teacher CLI before version 1.11.0 can allow an enrolled student to execute arbitrary code in an instructor's grading session, turning a routine assignment workflow into a potential compromise of the classroom's GitHub organization. Because the instructor's gh token may carry admin:org, repo, and workflow scopes across the entire classroom organization, this could expose or modify course repositories, CI pipelines, and organization settings. No public exploit identified at time of analysis; however, no vendor-released patch identified at time of analysis and a critical CVSS score mean academic IT and security leaders should restrict or isolate use of this tool until mitigations are in place.
No vendor patch identified; run gh teacher download only in a disposable, low-privilege sandbox with no access to instructor home directories, SSH keys, shell profiles, cron, or .git/hooks; sanitize student repositories so result.json and results.json cannot be symlinks, hardlinks, FIFOs, or directories; use narrowly scoped grading tokens without admin:org, repo, or workflow; monitor and audit grading hosts for unauthorized file writes.
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
Path traversal exploits occur when applications use user-controlled input to construct file system paths without proper validation.
Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.
EUVD-2026-90884
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB