Skip to content

Commit 5442cdb

Browse files
authored
Merge pull request #14610 from atorralba/atorralba/java/jms-deserialization
Java: Add JMS sink to java/unsafe-deserialization
2 parents f643fd7 + 45cf50c commit 5442cdb

File tree

6 files changed

+42
-2
lines changed

6 files changed

+42
-2
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/** Provides definitions for working with the JMS library. */
2+
3+
import java
4+
5+
/** The method `ObjectMessage.getObject`. */
6+
class ObjectMessageGetObjectMethod extends Method {
7+
ObjectMessageGetObjectMethod() {
8+
this.hasQualifiedName(["javax", "jakarta"] + ".jms", "ObjectMessage", "getObject")
9+
}
10+
}

java/ql/lib/semmle/code/java/security/UnsafeDeserializationQuery.qll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import semmle.code.java.dataflow.FlowSources
66
private import semmle.code.java.dataflow.TaintTracking2
7+
private import semmle.code.java.dispatch.VirtualDispatch
78
private import semmle.code.java.frameworks.Kryo
89
private import semmle.code.java.frameworks.XStream
910
private import semmle.code.java.frameworks.SnakeYaml
@@ -15,6 +16,7 @@ private import semmle.code.java.frameworks.HessianBurlap
1516
private import semmle.code.java.frameworks.Castor
1617
private import semmle.code.java.frameworks.Jackson
1718
private import semmle.code.java.frameworks.Jabsorb
19+
private import semmle.code.java.frameworks.Jms
1820
private import semmle.code.java.frameworks.JoddJson
1921
private import semmle.code.java.frameworks.Flexjson
2022
private import semmle.code.java.frameworks.google.Gson
@@ -224,6 +226,11 @@ predicate unsafeDeserialization(MethodCall ma, Expr sink) {
224226
m instanceof GsonDeserializeMethod and
225227
sink = ma.getArgument(0) and
226228
UnsafeTypeFlow::flowToExpr(ma.getArgument(1))
229+
or
230+
m.getASourceOverriddenMethod*() instanceof ObjectMessageGetObjectMethod and
231+
sink = ma.getQualifier().getUnderlyingExpr() and
232+
// If we can see an implementation, we trust dataflow to find a path to the other sinks instead
233+
not exists(viableCallable(ma))
227234
)
228235
}
229236

java/ql/src/Security/CWE/CWE-502/UnsafeDeserialization.qhelp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ may have unforeseen effects, such as the execution of arbitrary code.
1515
<p>
1616
There are many different serialization frameworks. This query currently
1717
supports Kryo, XmlDecoder, XStream, SnakeYaml, JYaml, JsonIO, YAMLBeans, HessianBurlap, Castor, Burlap,
18-
Jackson, Jabsorb, Jodd JSON, Flexjson, Gson and Java IO serialization through
18+
Jackson, Jabsorb, Jodd JSON, Flexjson, Gson, JMS, and Java IO serialization through
1919
<code>ObjectInputStream</code>/<code>ObjectOutputStream</code>.
2020
</p>
2121
</overview>
@@ -74,6 +74,12 @@ Recommendations specific to particular frameworks supported by this query:
7474
<li><b>Recommendation</b>: Do not use with untrusted user input.</li>
7575
</ul>
7676
<p></p>
77+
<p><b>ObjectMesssage</b> - <code>Java EE/Jakarta EE</code></p>
78+
<ul>
79+
<li><b>Secure by Default</b>: Depends on the JMS implementation.</li>
80+
<li><b>Recommendation</b>: Do not use with untrusted user input.</li>
81+
</ul>
82+
<p></p>
7783
</recommendation>
7884

7985
<example>
@@ -158,6 +164,10 @@ RCE in Flexjson:
158164
Android Intent deserialization vulnerabilities with GSON parser:
159165
<a href="https://blog.oversecured.com/Exploiting-memory-corruption-vulnerabilities-on-Android/#insecure-use-of-json-parsers">Insecure use of JSON parsers</a>.
160166
</li>
167+
<li>
168+
Research by Matthias Kaiser:
169+
<a href="https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf">Pwning Your Java Messaging With Deserialization Vulnerabilities</a>.
170+
</li>
161171
</references>
162172

163173
</qhelp>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* The query `java/unsafe-deserialization` has been improved to detect insecure calls to `ObjectMessage.getObject` in JMS.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import javax.jms.Message;
2+
import javax.jms.MessageListener;
3+
import javax.jms.ObjectMessage;
4+
5+
public class ObjectMessageTest implements MessageListener {
6+
public void onMessage(Message message) {
7+
((ObjectMessage) message).getObject(); // $ unsafeDeserialization
8+
}
9+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/snakeyaml-1.21:${testdir}/../../../stubs/xstream-1.4.10:${testdir}/../../../stubs/kryo-4.0.2:${testdir}/../../../stubs/jsr311-api-1.1.1:${testdir}/../../../stubs/fastjson-1.2.74:${testdir}/../../../stubs/springframework-5.3.8:${testdir}/../../../stubs/servlet-api-2.4:${testdir}/../../../stubs/jyaml-1.3:${testdir}/../../../stubs/json-io-4.10.0:${testdir}/../../../stubs/yamlbeans-1.09:${testdir}/../../../stubs/hessian-4.0.38:${testdir}/../../../stubs/castor-1.4.1:${testdir}/../../../stubs/jackson-databind-2.12:${testdir}/../../../stubs/jackson-core-2.12:${testdir}/../../../stubs/jabsorb-1.3.2:${testdir}/../../../stubs/json-java-20210307:${testdir}/../../../stubs/joddjson-6.0.3:${testdir}/../../../stubs/flexjson-2.1:${testdir}/../../../stubs/gson-2.8.6:${testdir}/../../../stubs/google-android-9.0.0:${testdir}/../../../stubs/serialkiller-4.0.0
1+
//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/snakeyaml-1.21:${testdir}/../../../stubs/xstream-1.4.10:${testdir}/../../../stubs/kryo-4.0.2:${testdir}/../../../stubs/jsr311-api-1.1.1:${testdir}/../../../stubs/fastjson-1.2.74:${testdir}/../../../stubs/springframework-5.3.8:${testdir}/../../../stubs/servlet-api-2.4:${testdir}/../../../stubs/jyaml-1.3:${testdir}/../../../stubs/json-io-4.10.0:${testdir}/../../../stubs/yamlbeans-1.09:${testdir}/../../../stubs/hessian-4.0.38:${testdir}/../../../stubs/castor-1.4.1:${testdir}/../../../stubs/jackson-databind-2.12:${testdir}/../../../stubs/jackson-core-2.12:${testdir}/../../../stubs/jabsorb-1.3.2:${testdir}/../../../stubs/json-java-20210307:${testdir}/../../../stubs/joddjson-6.0.3:${testdir}/../../../stubs/flexjson-2.1:${testdir}/../../../stubs/gson-2.8.6:${testdir}/../../../stubs/google-android-9.0.0:${testdir}/../../../stubs/serialkiller-4.0.0:${testdir}/../../../stubs/jms-api-1

0 commit comments

Comments
 (0)