CVE-2026-59102
MediumCVSS 5.4Exploitation Probability (EPSS)
Low risk10th percentile - higher than 10% of all known CVEs
Summary
Forgejo before version 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.
Risk Assessment
The risk involves potential session theft, account takeover, or leakage of sensitive data within the organization, as an attacker can execute arbitrary scripts in the context of a victim's browser that has access to Forgejo.
Recommendation
Immediately upgrade Forgejo to version 15.0.3 or later. Additionally, if possible, disable the DEFAULT_SHOW_FULL_NAME option until the upgrade is applied.
Other vulnerabilities in Forgejo
See all- CVE-2026-82556Medium
Vulnerability in Forgejo up to 15.0.4 in the net.LookupIP function of is_migrate_allowed.go allows remote server-side request forgery (SSRF). The attack can be initiated remotely, and the exploit is public.
- CVE-2025-68937Critical
Forgejo before 13.0.2 allows attackers to write to unintended files, and possibly obtain server shell access, because of mishandling of out-of-repository symlink destinations for template repositories. This is also fixed for 11 LTS in 11.0.7 and later.
Original NVD description (English source)
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.

