Improper Validation of Certificate with Host Mismatch in Java-WebSocket
WebSocketClient Does Not Perform SSL Hostname Validation
WebSocketClient Does Not Perform SSL Hostname ValidationTitle: Improper Validation of Certificate with Host Mismatch in Java-WebSocket
Versions: <= 1.4.1
Fixed in: 1.5.0
Package URL: Java-WebSocket
Common Weakness Enumeration: CWE-297
Vulnerability Description
In Java-WebSocket versions less than or equal to 1.4.1, the WebSocketClient does not perform SSL hostname validation. This vulnerability allows an attacker to perform a man-in-the-middle (MITM) attack by intercepting the WebSocket connection and presenting a valid certificate from another host. The lack of proper hostname validation means that as long as the certificate is trusted, the connection will be established.
Example Scenario: Man-in-the-Middle Attack
Setup the Vulnerable Application:
import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; import java.net.URI; import java.net.URISyntaxException; public class VulnerableWebSocketClient { public static void main(String[] args) throws URISyntaxException { WebSocketClient client = new WebSocketClient(new URI("wss://example.com")) { @Override public void onOpen(ServerHandshake handshake) { System.out.println("Opened connection"); } @Override public void onMessage(String message) { System.out.println("Received: " + message); } @Override public void onClose(int code, String reason, boolean remote) { System.out.println("Closed connection"); } @Override public void onError(Exception ex) { ex.printStackTrace(); } }; client.connect(); } }Exploit the Vulnerability:
An attacker intercepts the WebSocket connection using a MITM tool (e.g.,
mitmproxyorettercap).The attacker presents a certificate for a different host that is trusted by the client.
Since the client does not validate the hostname, the connection is established, and the attacker can read or modify the data.
Payload Example:
The attacker can use a tool like
mitmproxyto intercept and present a certificate formalicious.comwhile the client tries to connect toexample.com.mitmproxy --mode transparent --certs '*.example.com=malicious.pem'
Issue Replication
To replicate the issue, follow these steps:
Setup a proxy to intercept WebSocket connections:
Use a tool like
mitmproxyconfigured to intercept and alter SSL traffic.
Intercept the WebSocket handshake:
Run the vulnerable client application.
Observe that the connection is established despite the hostname mismatch in the certificate.
Fix
Upgrading to Java-WebSocket version 1.5.0 fixes this issue by enabling hostname validation.
Recommendations
Upgrade to Java-WebSocket version 1.5.0 or later.
Ensure that hostname verification is enabled by default or configure it explicitly in your application.
Remediation Code Example
To ensure SSL hostname validation, configure the WebSocketClient with the appropriate SSL parameters:
Further Information
For further background information on this issue, please see:
Vulnerability Disclosure Timeline
The vulnerability was responsibly disclosed, and a fix was implemented in version 1.5.0, which enables hostname validation by default.
Last updated