{"id":"CVE-2025-25296","aliases":["GHSA-wpq5-3366-mqw4","PYSEC-2026-1504"],"title":"Label Studio allows Cross-Site Scripting (XSS) via GET request to `/projects/upload-example` endpoint","summary":"Label Studio allows Cross-Site Scripting (XSS) via GET request to `/projects/upload-example` endpoint","severity":"medium","cvss":6.1,"cvssVector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N","vendor":"label-studio","product":"label-studio","ecosystem":"pip","affected":["label-studio < 1.16.0"],"patched":["label-studio 1.16.0"],"published":"2025-02-14","updated":"2026-07-07","source":"OSV","sourceUrl":"https://osv.dev/vulnerability/GHSA-wpq5-3366-mqw4","references":[{"url":"https://github.com/HumanSignal/label-studio/security/advisories/GHSA-wpq5-3366-mqw4"},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2025-25296"},{"url":"https://github.com/HumanSignal/label-studio/commit/8cf6958e1e27ef6a03ed287e674470975d340885"},{"url":"https://github.com/HumanSignal/label-studio"}],"tags":["osv","pip","exploit-available"],"epss":0.01898,"epssPercentile":0.78746,"ingestedAt":"2026-07-08T18:25:53.868Z","exploits":{"github":1,"githubRepos":["https://github.com/math-x-io/CVE-2025-25296"],"nuclei":["CVE-2025-25296"],"checkedAt":"2026-09-23T07:13:35.218Z"},"exploitAvailable":true,"slug":"CVE-2025-25296","body":"## Overview\n\n## Description\nLabel Studio's `/projects/upload-example` endpoint allows injection of arbitrary HTML through a `GET` request with an appropriately crafted `label_config` query parameter. By crafting a specially formatted XML label config with inline task data containing malicious HTML/JavaScript, an attacker can achieve Cross-Site Scripting (XSS). While the application has a Content Security Policy (CSP), it is only set in report-only mode, making it ineffective at preventing script execution.\n\nThe vulnerability exists because the upload-example endpoint renders user-provided HTML content without proper sanitization on a GET request. This allows attackers to inject and execute arbitrary JavaScript in victims' browsers by getting them to visit a maliciously crafted URL.\n\nThis is considered vulnerable because it enables attackers to execute JavaScript in victims' contexts, potentially allowing theft of sensitive data, session hijacking, or other malicious actions.\n\n## Steps to reproduce\n1. Create a malicious label config that includes an XSS payload in embedded task data:\n\n```xml\n<View><!-- {\"data\": {\"text\": \"<div><img src=x\nonerror=eval(atob(`YWxlcnQoIlhTUyIp`))></div>\"}} --><HyperText name=\"text\"\nvalue=\"$text\"/></View>\n```\n\n\n2. URL encode the payload and access the following URL:\n\n- http://app/projects/upload-example/?label_config=%3CView%3E%3C!--%20{%22data%22:%20{%22text%22:%20%22%3Cdiv%3E%3Cimg%20src=x%20onerror=eval(atob(`YWxlcnQoIlhTUyIp`))%3E%3C/div%3E%22}}%20--%3E%3CHyperText%20name=%22text%22%20value=%22$text%22/%3E%3C/View%3E\n\nWhen executed, the payload causes the application to render an HTML page containing an img tag that fails to load, triggering the onerror event handler which executes base64-decoded JavaScript, demonstrating successful XSS execution in the victim's browser.\n   \n## Mitigations\n- Enable the Content Security Policy in enforcement mode instead of report-only mode to actively block unauthorized script execution\n- Deprecate the `GET` behavior at the `example-config` endpoint since it's not used \n\n## Impact\nThe vulnerability requires no special privileges and can be exploited by getting a victim to visit a crafted URL. The impact is high as it allows arbitrary JavaScript execution in victims' browsers, potentially exposing sensitive data or enabling account takeover through session theft.\n\n## Affected packages\n\n- `label-studio < 1.16.0`\n\n## Remediation\n\nUpgrade to a patched release:\n\n- `label-studio 1.16.0`","depth":"twilight","depthScore":46,"depthScoreParts":{"impact":33.6,"likelihood":0.4,"exploitation":12,"ransomware":0},"changes":[{"seq":4799,"id":"CVE-2025-25296","ts":1788887207726,"field":"exploit_available","old":"false","new":"true"},{"seq":3682,"id":"CVE-2025-25296","ts":1788886324342,"field":"exploit_available","old":"true","new":"false"},{"seq":2529,"id":"CVE-2025-25296","ts":1788883003470,"field":"exploit_available","old":"false","new":"true"},{"seq":1558,"id":"CVE-2025-25296","ts":1788882405529,"field":"exploit_available","old":"true","new":"false"},{"seq":672,"id":"CVE-2025-25296","ts":1788881843315,"field":"exploit_available","old":"false","new":"true"}]}