Skip to content

Commit 2561ba8

Browse files
authored
Merge pull request github#3215 from aibaars/validating-object-input
Java: teach UnsafeDeserialization about ValidatingObjectInputStream
2 parents 964b847 + 39e652b commit 2561ba8

File tree

4 files changed

+27
-1
lines changed

4 files changed

+27
-1
lines changed

java/ql/src/semmle/code/java/security/UnsafeDeserialization.qll

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,14 @@ class SafeKryo extends DataFlow2::Configuration {
5151
predicate unsafeDeserialization(MethodAccess ma, Expr sink) {
5252
exists(Method m | m = ma.getMethod() |
5353
m instanceof ObjectInputStreamReadObjectMethod and
54-
sink = ma.getQualifier()
54+
sink = ma.getQualifier() and
55+
not exists(DataFlow::ExprNode node |
56+
node.getExpr() = sink and
57+
node
58+
.getTypeBound()
59+
.(RefType)
60+
.hasQualifiedName("org.apache.commons.io.serialization", "ValidatingObjectInputStream")
61+
)
5562
or
5663
m instanceof XMLDecoderReadObjectMethod and
5764
sink = ma.getQualifier()
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import java.io.IOException;
2+
import java.io.ObjectInputStream;
3+
import org.apache.commons.io.serialization.ValidatingObjectInputStream;
4+
5+
class Test {
6+
public void test() throws IOException, ClassNotFoundException {
7+
ObjectInputStream objectStream = new ObjectInputStream(null);
8+
ObjectInputStream validating = new ValidatingObjectInputStream(null);
9+
objectStream.readObject();
10+
validating.readObject();
11+
}
12+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| Test.java:9:3:9:27 | readObject(...) | ObjectInputStream |
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import default
2+
import semmle.code.java.security.UnsafeDeserialization
3+
4+
from Method m, MethodAccess ma
5+
where ma.getMethod() = m and unsafeDeserialization(ma, _)
6+
select ma, m.getDeclaringType().getName()

0 commit comments

Comments
 (0)