CVE-2021-28165: High severity Eclipse Jetty vulnerability
Impact When using SSL/TLS with Jetty, either with HTTP/1.1, HTTP/2, or WebSocket, the server may receive an invalid large (greater than 17408) TLS frame that is incorrectly handled, causing CPU resources to eventually reach 100% usage.
Workarounds
The problem can be worked around by compiling the following class: java package org.eclipse.jetty.server.ssl.fix6072;
import java.nio.ByteBuffer; import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLEngineResult; import javax.net.ssl.SSLException; import javax.net.ssl.SSLHandshakeException;
import org.eclipse.jetty.io.EndPoint; import org.eclipse.jetty.io.ssl.SslConnection; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.SslConnectionFactory; import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.annotation.Name; import org.eclipse.jetty.util.ssl.SslContextFactory;
public class SpaceCheckingSslConnectionFactory extends SslConnectionFactory { public SpaceCheckingSslConnectionFactory(@Name("sslContextFactory") SslContextFactory factory, @Name("next") String nextProtocol) { super(factory, nextProtocol); }
@Override protected SslConnection newSslConnection(Connector connector, EndPoint endPoint, SSLEngine engine) { return new SslConnection(connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()) { @Override protected SSLEngineResult unwrap(SSLEngine sslEngine, ByteBuffer input, ByteBuffer output) throws SSLException { SSLEngineResult results = super.unwrap(sslEngine, input, output);
if ((results.getStatus() == SSLEngineResult.Status.BUFFERUNDERFLOW || results.getStatus() == SSLEngineResult.Status.OK && results.bytesConsumed() == 0 && results.bytesProduced() == 0) && BufferUtil.space(input) == 0) { BufferUtil.clear(input); throw new SSLHandshakeException("Encrypted buffer max length exceeded"); } return results; } }; } } This class can be deployed by: + The resulting class file should be put into a jar file (eg sslfix6072.jar) + The jar file should be made available to the server. For a normal distribution this can be done by putting the file into ${jetty.base}/lib + Copy the file ${jetty.home}/modules/ssl.mod to ${jetty.base}/modules + Edit the ${jetty.base}/modules/ssl.mod file to have the following section:
[lib] lib/sslfix6072.jar
+ Copy the file ${jetty.home}/etc/jetty-https.xml and${jetty.home}/etc/jetty-http2.xml to ${jetty.base}/etc + Edit files ${jetty.base}/etc/jetty-https.xml and ${jetty.base}/etc/jetty-http2.xml, changing any reference of org.eclipse.jetty.server.SslConnectionFactory to org.eclipse.jetty.server.ssl.fix6072.SpaceCheckingSslConnectionFactory. For example: xml <Call name="addIfAbsentConnectionFactory"> <Arg> <New class="org.eclipse.jetty.server.ssl.fix6072.SpaceCheckingSslConnectionFactory"> <Arg name="next">http/1.1</Arg> <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg> </New> </Arg> </Call> + Restart Jetty
Other sources
Eclipse Jetty is vulnerable to a denial of service, caused by improper input valistion. By sending a specially-crafted TLS frame, a remote attacker could exploit this vulnerability to cause CPU resources to reach to 100% usage.
— IBM
In Eclipse Jetty 7.2.2 to 9.4.38, 10.0.0.alpha0 to 10.0.1, and 11.0.0.alpha0 to 11.0.1, CPU usage can reach 100% upon receiving a large invalid TLS frame.
When using SSL/TLS with Jetty, either with HTTP/1.1, HTTP/2, or WebSocket, the server may receive an invalid large (greater than 17408) TLS frame that is incorrectly handled, causing high CPU resources utilization. The highest threat from this vulnerability is to service availability.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
maven/org.eclipse.jetty:jetty-serverto a version that resolves this vulnerability.Fixed in 11.0.2 - Upgrade
Upgrade
maven/org.eclipse.jetty:jetty-serverto a version that resolves this vulnerability.Fixed in 10.0.2 - Upgrade
Upgrade
maven/org.eclipse.jetty:jetty-serverto a version that resolves this vulnerability.Fixed in 9.4.39 - Upgrade
Upgrade
redhat/rh-eclipse-jettyto a version that resolves this vulnerability.Fixed in 0:9.4.40-1.1.el7_9 - Upgrade
Upgrade
redhat/jenkinsto a version that resolves this vulnerability.Fixed in 0:2.277.3.1620393611-1.el8 - Upgrade
Upgrade
redhat/runcto a version that resolves this vulnerability.Fixed in 0:1.0.0-95.rhaos4.8.gitcd80260.el8 - Upgrade
Upgrade
debian/jetty9to a version that resolves this vulnerability.Fixed in 9.4.16-0+deb10u1Fixed in 9.4.50-4+deb10u1Fixed in 9.4.39-3+deb11u2Fixed in 9.4.50-4+deb11u1Fixed in 9.4.50-4+deb12u2Fixed in 9.4.53-1 - Upgrade
Upgrade
redhat/jettyto a version that resolves this vulnerability.Fixed in 9.4.39 - Upgrade
Upgrade
redhat/jettyto a version that resolves this vulnerability.Fixed in 10.0.2 - Upgrade
Upgrade
redhat/jettyto a version that resolves this vulnerability.Fixed in 11.0.2 - Configuration
Copy ${jetty.home}/etc/jetty-https.xml and ${jetty.home}/etc/jetty-http2.xml to ${jetty.base}/etc, then replace references to org.eclipse.jetty.server.SslConnectionFactory with org.eclipse.jetty.server.ssl.fix6072.SpaceCheckingSslConnectionFactory in both files.
Jetty SSL/TLS configuration SslConnectionFactory class references = org.eclipse.jetty.server.ssl.fix6072.SpaceCheckingSslConnectionFactory - Operational
Compile the SpaceCheckingSslConnectionFactory class, package the resulting class in sslfix6072.jar, and place it in ${jetty.base}/lib so it is available to Jetty.
- Operational
Copy ${jetty.home}/modules/ssl.mod to ${jetty.base}/modules, edit ${jetty.base}/modules/ssl.mod as specified by the workaround, and restart Jetty.
Event History
Parent advisories
This vulnerability appears in the following advisories.
Frequently Asked Questions
What is the vulnerability ID?
The vulnerability ID is CVE-2021-28165.
What is the severity of CVE-2021-28165?
The severity of CVE-2021-28165 is high (7.5).
Which software is affected by CVE-2021-28165?
Jetty server versions 7.2.2 to 9.4.38, 10.0.0.alpha0 to 10.0.1, and 11.0.0.alpha0 to 11.0.1 are affected by CVE-2021-28165.
How can I fix CVE-2021-28165?
To fix CVE-2021-28165, you should update Jetty server to version 9.4.39, 10.0.2, or 11.0.2.
Where can I find more information about CVE-2021-28165?
You can find more information about CVE-2021-28165 at the following references: - [GitHub Security Advisory](https://github.com/eclipse/jetty.project/security/advisories/GHSA-26vr-8j45-3r4w) - [NIST NVD](https://nvd.nist.gov/vuln/detail/CVE-2021-28165) - [Apache ZooKeeper Mailing List](https://lists.apache.org/thread.html/r002258611ed0c35b82b839d284b43db9dcdec120db8afc1c993137dc@%3Cnotifications.zookeeper.apache.org%3E)