Skip to content

Commit b9a479d

Browse files
authored
Merge pull request github#5134 from pwntester/ArrayUtils
Add support for Apache Commons Lang ArrayUtils
2 parents 1c91d3d + 8128843 commit b9a479d

File tree

2 files changed

+48
-9
lines changed

2 files changed

+48
-9
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ module Frameworks {
1616
private import semmle.code.java.frameworks.Guice
1717
private import semmle.code.java.frameworks.Protobuf
1818
private import semmle.code.java.frameworks.guava.Guava
19+
private import semmle.code.java.frameworks.apache.Lang
1920
}
2021

2122
/**
Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,65 @@
11
/** Definitions related to the Apache Commons Lang library. */
22

33
import java
4+
private import semmle.code.java.dataflow.FlowSteps
45

5-
/*--- Types ---*/
6-
/** The class `org.apache.commons.lang.RandomStringUtils` or `org.apache.commons.lang3.RandomStringUtils`. */
6+
/**
7+
* The class `org.apache.commons.lang.RandomStringUtils` or `org.apache.commons.lang3.RandomStringUtils`.
8+
*/
79
class TypeApacheRandomStringUtils extends Class {
810
TypeApacheRandomStringUtils() {
9-
hasQualifiedName("org.apache.commons.lang", "RandomStringUtils") or
10-
hasQualifiedName("org.apache.commons.lang3", "RandomStringUtils")
11+
this.hasQualifiedName(["org.apache.commons.lang", "org.apache.commons.lang3"],
12+
"RandomStringUtils")
13+
}
14+
}
15+
16+
/**
17+
* The class `org.apache.commons.lang.ArrayUtils` or `org.apache.commons.lang3.ArrayUtils`.
18+
*/
19+
class TypeApacheArrayUtils extends Class {
20+
TypeApacheArrayUtils() {
21+
hasQualifiedName(["org.apache.commons.lang", "org.apache.commons.lang3"], "ArrayUtils")
1122
}
1223
}
1324

14-
/*--- Methods ---*/
1525
/**
1626
* The method `deserialize` in either `org.apache.commons.lang.SerializationUtils`
1727
* or `org.apache.commons.lang3.SerializationUtils`.
1828
*/
1929
class MethodApacheSerializationUtilsDeserialize extends Method {
2030
MethodApacheSerializationUtilsDeserialize() {
21-
(
22-
this.getDeclaringType().hasQualifiedName("org.apache.commons.lang", "SerializationUtils") or
23-
this.getDeclaringType().hasQualifiedName("org.apache.commons.lang3", "SerializationUtils")
24-
) and
31+
this.getDeclaringType()
32+
.hasQualifiedName(["org.apache.commons.lang", "org.apache.commons.lang3"],
33+
"SerializationUtils") and
2534
this.hasName("deserialize")
2635
}
2736
}
37+
38+
/**
39+
* A taint preserving method on `org.apache.commons.lang.ArrayUtils` or `org.apache.commons.lang3.ArrayUtils`
40+
*/
41+
private class ApacheLangArrayUtilsTaintPreservingMethod extends TaintPreservingCallable {
42+
ApacheLangArrayUtilsTaintPreservingMethod() {
43+
this.getDeclaringType() instanceof TypeApacheArrayUtils
44+
}
45+
46+
override predicate returnsTaintFrom(int src) {
47+
this.hasName(["addAll", "addFirst"]) and
48+
src = [0 .. getNumberOfParameters() - 1]
49+
or
50+
this.hasName([
51+
"clone", "nullToEmpty", "remove", "removeAll", "removeElement", "removeElements", "reverse",
52+
"shift", "shuffle", "subarray", "swap", "toArray", "toMap", "toObject", "toPrimitive",
53+
"toString", "toStringArray"
54+
]) and
55+
src = 0
56+
or
57+
this.hasName("add") and
58+
this.getNumberOfParameters() = 2 and
59+
src = [0, 1]
60+
or
61+
this.hasName("add") and
62+
this.getNumberOfParameters() = 3 and
63+
src = [0, 2]
64+
}
65+
}

0 commit comments

Comments
 (0)