Skip to main content

Classroom 50 EUVDEUVD-2026-90884

| CVE-2026-94620 CRITICAL
Path Traversal (CWE-22)
2026-10-01 GitHub_M
9.4
CVSS 4.0 · Vendor: GitHub_M
View

Attack ChainAIDerived

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

  1. Access
    Enroll as student with org repo
  2. Delivery
    Commit result.json as symlink to .git/hooks/*
  3. Exploit
    Teacher runs `gh teacher download`
  4. Execution
    Write follows symlink, drops malicious hook
  5. Persist
    git executes hook as teacher
  6. Impact
    Abuse 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 gh teacher download (version prior to 1.11.0) against that untrusted repository - this is the UI:P requirement and the primary limiting factor. The write bytes are attacker-controlled via the student's uploaded release asset (result.json) or chosen submit-tag names (results.json). Limiting factors: the attack is not anonymous (requires classroom enrollment), is not zero-click (requires the teacher to execute the download), and is fully mitigated by upgrading to 1.11.0 or by the documented workarounds (run in a disposable sandbox/container without host credential access, or inspect cloned trees for symlinked/hardlinked/special result.json/results.json entries before the artifact-refresh step).

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 gh teacher download against the attacker's repo) and an attacker who is an enrolled student with a writable repo in the org - a trust-boundary that exists in every classroom by design, so PR:N is defensible even though the actor is not anonymous. No EPSS score, KEV listing, or public POC was provided in the intelligence, so there is no evidence of active exploitation; this is a pre-exploitation patch-and-advisory situation. Note, however, that the published commit ships a detailed regression test (TestRefreshResultJSON_SymlinkGuard) that enumerates the exact escaping-symlink, in-clone-symlink-to-.git/hooks, hardlink, and FIFO vectors, effectively documenting a working exploit recipe and lowering the barrier to weaponization.

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 gh teacher download, the tool clones the repo, materializes the symlink verbatim, then writes attacker-controlled bytes (the student's uploaded release asset or chosen submit-tag content) through it, dropping a malicious git hook that git executes - running code as the teacher with an admin:org/repo/workflow token over the entire organization. No public exploit was provided, though the patch's test suite documents the precise vectors.

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

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

Alert me

AnalysisAIv1 – 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

classroom50 < 1.11.0

Affected Packages

euvd classroom50 fix: 1.11.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-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

Vendor (GitHub_M) PRIMARY 9.4 CRITICAL
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
vuln.today AI 9.6 CRITICAL

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).

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

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

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

Lifecycle Timeline

2
Patch available
Oct 01, 2026 - 17:17 EUVD
CVE Published
Oct 01, 2026 - 15:38 cve.org
CRITICAL 9.4

DescriptionCVE.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

Why It Matters

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.

Business Impact: Severe
Compensating Controls

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

EPSS Score
0.4%
Top 66% exploitable
Prevalence
Low
niche free open-source educational tool for GitHub-based assignment grading
Data Quality
6 sources
Confidence: High

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.4%
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
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact
Very High
Technical Impact
Total

Priority Score

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

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.

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