CVE-2020-27223 is a medium-severity (CVSS 5.3) CWE-407 vulnerability in org.eclipse.jetty:jetty-server. 2 public exploit references exist, so weaponization risk is real. A fix is available for org.eclipse.jetty:jetty-server — see the affected versions and patch details below.
DOS vulnerability for Quoted Quality CSV headers
EPSS Exploitation Probability
Probability of exploitation in the next 30 days, from FIRST.org EPSS.
How urgent is this, really
CVE-2020-27223 by exploitation likelihood (EPSS) against impact (CVSS). Outside the shaded patch-first corner.
Where this sits among everything scored
Of 385,738 CVEs with a current EPSS score, this one falls in the 50–90% band (highlighted). Counts from FIRST.org, log-scaled.
Real-World Exposure
org.eclipse.jetty:jetty-server☕org.eclipse.jetty:jetty-server☕org.eclipse.jetty:jetty-serverReal-time download stats are indexed for npm and PyPI packages. This vulnerability affects Maven packages — download data is not available via public APIs for these ecosystems.
Description
Impact
When Jetty handles a request containing request headers with a large number of “quality” (i.e. q) parameters (such as what are seen on the Accept, Accept-Encoding, and Accept-Language request headers), the server may enter a denial of service (DoS) state due to high CPU usage while sorting the list of values based on their quality values. A single request can easily consume minutes of CPU time before it is even dispatched to the application.
The only features within Jetty that can trigger this behavior are:
- Default Error Handling - the
Acceptrequest header with theQuotedQualityCSVis used to determine what kind of content to send back to the client (html, text, json, xml, etc) StatisticsServlet- uses theAcceptrequest header with theQuotedQualityCSVto determine what kind of content to send back to the client (xml, json, text, html, etc)HttpServletRequest.getLocale()- uses theAccept-Languagerequest header with theQuotedQualityCSVto determine which “preferred” language is returned on this call.HttpservletRequest.getLocales()- is similar to the above, but returns an ordered list of locales based on the quality values on theAccept-Languagerequest header.DefaultServlet- uses theAccept-Encodingrequest header with theQuotedQualityCSVto determine which kind of pre-compressed content should be sent back for static content (content that is not matched against a url-pattern in your web app)
Versions
QuotedQualityCSV was introduced to Jetty 9.3.9.v20160517 and the bug that introduced the vulnerability was in 9.4.6.v20170531.
Currently, known vulnerable versions include:
- 9.4.6.v20170531 thru to 9.4.36.v20210114
- 10.0.0
- 11.0.0
Workarounds
Quality ordered values are used infrequently by jetty so they can be avoided by:
- Do not use the default error page/handler.
- Do not deploy the
StatisticsServletexposed to the network - Do not call
getLocaleAPI - Do not enable precompressed static content in the
DefaultServlet
Patches
All patches are available for download from the Eclipse Jetty website at https://www.eclipse.org/jetty/download.php
- 9.4.37.v20210219 and greater
- 10.0.1 and greater
- 11.0.1 and greater
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| ☕Maven | org.eclipse.jetty:jetty-server | ≥ 9.4.6&&< 9.4.37 | 9.4.37org.eclipse.jetty:jetty-server:9.4.37 |
| ☕Maven | org.eclipse.jetty:jetty-server | ≥ 10.0.0&&< 10.0.1 | 10.0.1org.eclipse.jetty:jetty-server:10.0.1 |
| ☕Maven | org.eclipse.jetty:jetty-server | ≥ 11.0.0&&< 11.0.1 | 11.0.1org.eclipse.jetty:jetty-server:11.0.1 |
Affected Products
nifiapachesolrapachesparkapachedebian linuxdebianjettyeclipsee-series santricity os controllernetappResearch use only. For defensive security, authorized penetration testing, and academic research only. Never execute exploit code against systems without explicit written authorization.
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for org.eclipse.jetty:jetty-server, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update org.eclipse.jetty:jetty-server to 9.4.37 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2020-27223 is resolved across your whole dependency graph.
Workarounds
Cap what an attacker can consume: apply request size, rate and timeout limits in front of the affected component, and run it with memory and CPU limits so exhaustion degrades one worker rather than the whole service.
Fixing This On Your OS
If you run this on a Linux distribution, patch through your package manager against the distro's own security advisory below — it tracks the exact backported fix for your release, which can ship on a different timeline (and sometimes a different severity) than the upstream project.
In OpenShift Container Platform (OCP), the Hive/Presto/Hadoop components that comprise the OCP Metering stack, ship the vulnerable version of jetty. Since the release of OCP 4.6, the Metering product has been deprecated [1], hence the affected components are marked as wontfix. This may be fixed in the future. [1]…
| Product | Fixed in | Advisory |
|---|---|---|
| Red Hat AMQ 7.8.2 | jetty | RHSA-2021:2689 |
| Red Hat AMQ 7.9.0 | see advisory | RHSA-2021:3700 |
| Red Hat Fuse 7.10 | jetty | RHSA-2021:5134 |
| Red Hat Integration Camel Quarkus 2 | see advisory | RHSA-2021:4767 |
| Red Hat Migration Toolkit for Containers 1.4 | rhmtc/openshift-migration-controller-rhel8:v1.4.6-4 | RHBA-2021:2854 |
| Red Hat OpenShift Container Platform 3.11 | jenkins-0:2.289.1.1624365627-1.el7 | RHSA-2021:2517 |
| Red Hat OpenShift Container Platform 4.5 | jenkins-0:2.277.3.1623846768-1.el7 | RHSA-2021:2431 |
| Red Hat OpenShift Container Platform 4.6 | jenkins-0:2.277.3.1623853726-1.el8 | RHSA-2021:2499 |
Frequently Asked Questions
Is CVE-2020-27223 in your dependencies?
Find it across Maven, including transitive dependencies.