Skip to content

Commit bcf9ed5

Browse files
committed
Add the sanitizer of Flexjson
1 parent ce94c86 commit bcf9ed5

File tree

3 files changed

+34
-3
lines changed

3 files changed

+34
-3
lines changed

java/ql/src/semmle/code/java/frameworks/Flexjson.qll

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,15 @@ class FlexjsonSerializeMethod extends Method {
3737
this.hasName(["serialize", "deepSerialize"])
3838
}
3939
}
40+
41+
/** The method `use` to configure allowed class type. */
42+
class DeserializerUseMethod extends Method {
43+
DeserializerUseMethod() {
44+
(
45+
this.getDeclaringType().(ParameterizedType).getGenericType() instanceof FlexjsonDeserializer or
46+
this.getDeclaringType().getSourceDeclaration().getASourceSupertype*() instanceof
47+
FlexjsonDeserializer
48+
) and
49+
this.hasName("use")
50+
}
51+
}

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,9 +264,18 @@ predicate unsafeDeserialization(MethodAccess ma, Expr sink) {
264264
or
265265
m instanceof FlexjsonDeserializeMethod and
266266
sink = ma.getArgument(0) and
267-
not exists(TypeLiteral tl |
268-
ma.getArgument(1) = tl and
269-
tl.getType().(ParameterizedType).getATypeArgument().(Class).isFinal()
267+
(
268+
not exists(TypeLiteral tl |
269+
ma.getArgument(1) = tl and
270+
tl.getType().(ParameterizedType).getATypeArgument().(Class).isFinal()
271+
) and
272+
not exists(MethodAccess dma |
273+
dma.getMethod() instanceof DeserializerUseMethod and
274+
(
275+
ma.getQualifier() = dma or
276+
ma.getQualifier().(VarAccess).getVariable().getAnAccess() = dma.getQualifier()
277+
)
278+
)
270279
)
271280
or
272281
m instanceof JoddJsonParseMethod and

java/ql/test/query-tests/security/CWE-502/FlexjsonServlet.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,14 @@ public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOExc
5050
JSONDeserializer deserializer = new JSONDeserializer();
5151
User user = (User) deserializer.deserialize(req.getReader(), Object.class);
5252
}
53+
54+
private Person fromJsonToPerson(String json) {
55+
return new JSONDeserializer<Person>().use(null, Person.class).deserialize(json);
56+
}
57+
58+
// GOOD: Specify the class to deserialize with `use`
59+
public void doPut2(HttpServletRequest req, HttpServletResponse resp) throws IOException {
60+
String json = req.getParameter("json");
61+
Person person = fromJsonToPerson(json);
62+
}
5363
}

0 commit comments

Comments
 (0)