Skip to content

Commit 3f6eef8

Browse files
author
Porcupiney Hairs
committed
Java: add websocket reads as remote flow source.
Currently, JAX-WS reads are considered as untrusted. However, `java.net.http.WebSocket` reads are not marked as such. This PR adds support for the same.
1 parent 768e519 commit 3f6eef8

File tree

3 files changed

+57
-0
lines changed

3 files changed

+57
-0
lines changed

java/ql/src/semmle/code/java/dataflow/FlowSources.qll

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import semmle.code.java.frameworks.ApacheHttp
1515
import semmle.code.java.frameworks.android.XmlParsing
1616
import semmle.code.java.frameworks.android.WebView
1717
import semmle.code.java.frameworks.JaxWS
18+
import semmle.code.java.frameworks.javase.WebSocket
1819
import semmle.code.java.frameworks.android.Intent
1920
import semmle.code.java.frameworks.spring.SpringWeb
2021
import semmle.code.java.frameworks.spring.SpringController
@@ -155,6 +156,14 @@ private class ThriftIfaceParameterSource extends RemoteFlowSource {
155156
override string getSourceType() { result = "Thrift Iface parameter" }
156157
}
157158

159+
private class WebSocketMessageParameterSource extends RemoteFlowSource {
160+
WebSocketMessageParameterSource() {
161+
exists(WebsocketOnText t | t.getParameter(1) = this.asParameter())
162+
}
163+
164+
override string getSourceType() { result = "Websocket onText parameter" }
165+
}
166+
158167
/** Class for `tainted` user input. */
159168
abstract class UserInput extends DataFlow::Node { }
160169

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* Provides classes for identifying methods called by the Java SE WebSocket package.
3+
*/
4+
5+
import java
6+
7+
/** The `java.net.http.Websocket.Listener` interface. */
8+
class WebsocketListener extends Interface {
9+
WebsocketListener() { this.hasQualifiedName("java.net.http", "WebSocket$Listener") }
10+
}
11+
12+
/** The method `onText` on a type that implements the `java.net.http.Websocket.Listener` interface. */
13+
class WebsocketOnText extends Method {
14+
WebsocketOnText() {
15+
exists(WebsocketListener l |
16+
this.getDeclaringType().extendsOrImplements(l) and
17+
// onText(WebSocket webSocket, CharSequence data, boolean last)
18+
this.hasName("onText")
19+
)
20+
}
21+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// package test.cwe079.cwe.examples;
2+
3+
// import java.net.http.HttpClient;
4+
// import java.net.http.WebSocket;
5+
// import java.net.URI;
6+
// import java.util.*;
7+
// import java.util.concurrent.*;
8+
9+
// public class WebsocketXss {
10+
// public static void main(String[] args) throws Exception {
11+
// WebSocket.Listener listener = new WebSocket.Listener() {
12+
// public CompletionStage<?> onText(WebSocket webSocket, CharSequence message, boolean last) {
13+
// try {
14+
// HttpClient client = HttpClient.newBuilder().build();
15+
// CompletableFuture<WebSocket> ws = client.newWebSocketBuilder()
16+
// .buildAsync(URI.create("ws://websocket.example.com"), null);
17+
// ws.get().sendText​(message, false);
18+
// } catch (Exception e) {
19+
// // TODO: handle exception
20+
// }
21+
22+
// return null;
23+
// };
24+
// };
25+
26+
// }
27+
// }

0 commit comments

Comments
 (0)