Skip to content

Commit c166fee

Browse files
authored
Merge pull request github#3894 from aibaars/util-arrays
Java: model taint for java.util.Arrays
2 parents 548fceb + 940fec5 commit c166fee

File tree

3 files changed

+67
-3
lines changed

3 files changed

+67
-3
lines changed

java/ql/src/semmle/code/java/dataflow/internal/ContainerFlow.qll

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,12 @@ private predicate taintPreservingArgumentToMethod(Method method, int arg) {
180180
or
181181
method.hasName(["nCopies", "singletonMap"]) and arg = 1
182182
)
183+
or
184+
method.getDeclaringType().hasQualifiedName("java.util", "Arrays") and
185+
(
186+
method.hasName(["copyOf", "copyOfRange", "spliterator", "stream"]) and
187+
arg = 0
188+
)
183189
}
184190

185191
/**
@@ -195,6 +201,13 @@ private predicate taintPreservingArgToArg(Method method, int input, int output)
195201
or
196202
method.hasName("replaceAll") and input = 2 and output = 0
197203
)
204+
or
205+
method.getDeclaringType().hasQualifiedName("java.util", "Arrays") and
206+
(
207+
method.hasName("fill") and
208+
output = 0 and
209+
input = method.getNumberOfParameters() - 1
210+
)
198211
}
199212

200213
private predicate argToQualifierStep(Expr tracked, Expr sink) {
@@ -208,10 +221,18 @@ private predicate argToQualifierStep(Expr tracked, Expr sink) {
208221

209222
/** Access to a method that passes taint from an argument. */
210223
private predicate argToMethodStep(Expr tracked, MethodAccess sink) {
211-
exists(Method m, int i |
224+
exists(Method m |
212225
m = sink.getMethod() and
213-
taintPreservingArgumentToMethod(m, i) and
214-
tracked = sink.getArgument(i)
226+
(
227+
exists(int i |
228+
taintPreservingArgumentToMethod(m, i) and
229+
tracked = sink.getArgument(i)
230+
)
231+
or
232+
m.getDeclaringType().hasQualifiedName("java.util", "Arrays") and
233+
m.hasName("asList") and
234+
tracked = sink.getAnArgument()
235+
)
215236
)
216237
}
217238

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import java.util.Arrays;
2+
import java.util.List;
3+
4+
class ArraysTest {
5+
public static void taintSteps(String[] source) {
6+
Arrays.asList();
7+
Arrays.asList("one");
8+
Arrays.asList("two", "three");
9+
Arrays.copyOf(source, 10);
10+
Arrays.copyOfRange(source, 0, 10);
11+
Arrays.deepToString(source);
12+
Arrays.spliterator(source);
13+
Arrays.stream(source);
14+
Arrays.toString(source);
15+
Arrays.fill(source, "value");
16+
Arrays.fill(source, 0, 10, "data");
17+
Arrays.parallelPrefix(source, (x, y) -> x + y);
18+
Arrays.parallelPrefix(source, 0, 10, (x, y) -> x + y);
19+
Arrays.parallelSetAll(source, x -> Integer.toString(x));
20+
Arrays.setAll(source, x -> Integer.toString(x));
21+
}
22+
}
23+

java/ql/test/library-tests/dataflow/local-additional-taint/localAdditionalTaintStep.expected

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,23 @@
1+
| ArraysTest.java:7:17:7:21 | "one" | ArraysTest.java:7:3:7:22 | asList(...) |
2+
| ArraysTest.java:7:17:7:21 | "one" | ArraysTest.java:7:3:7:22 | new ..[] { .. } |
3+
| ArraysTest.java:8:17:8:21 | "two" | ArraysTest.java:8:3:8:31 | asList(...) |
4+
| ArraysTest.java:8:17:8:21 | "two" | ArraysTest.java:8:3:8:31 | new ..[] { .. } |
5+
| ArraysTest.java:8:24:8:30 | "three" | ArraysTest.java:8:3:8:31 | asList(...) |
6+
| ArraysTest.java:8:24:8:30 | "three" | ArraysTest.java:8:3:8:31 | new ..[] { .. } |
7+
| ArraysTest.java:9:17:9:22 | source | ArraysTest.java:9:3:9:27 | copyOf(...) |
8+
| ArraysTest.java:10:22:10:27 | source | ArraysTest.java:10:3:10:35 | copyOfRange(...) |
9+
| ArraysTest.java:12:22:12:27 | source | ArraysTest.java:12:3:12:28 | spliterator(...) |
10+
| ArraysTest.java:13:17:13:22 | source | ArraysTest.java:13:3:13:23 | stream(...) |
11+
| ArraysTest.java:15:23:15:29 | "value" | ArraysTest.java:15:15:15:20 | source [post update] |
12+
| ArraysTest.java:16:30:16:35 | "data" | ArraysTest.java:16:15:16:20 | source [post update] |
13+
| ArraysTest.java:17:43:17:43 | x | ArraysTest.java:17:43:17:47 | ... + ... |
14+
| ArraysTest.java:17:47:17:47 | y | ArraysTest.java:17:43:17:47 | ... + ... |
15+
| ArraysTest.java:18:50:18:50 | x | ArraysTest.java:18:50:18:54 | ... + ... |
16+
| ArraysTest.java:18:54:18:54 | y | ArraysTest.java:18:50:18:54 | ... + ... |
17+
| ArraysTest.java:19:38:19:44 | Integer | ArraysTest.java:19:38:19:56 | toString(...) |
18+
| ArraysTest.java:19:55:19:55 | x | ArraysTest.java:19:38:19:56 | toString(...) |
19+
| ArraysTest.java:20:30:20:36 | Integer | ArraysTest.java:20:30:20:48 | toString(...) |
20+
| ArraysTest.java:20:47:20:47 | x | ArraysTest.java:20:30:20:48 | toString(...) |
121
| CollectionsTest.java:8:28:8:32 | "one" | CollectionsTest.java:8:3:8:33 | new ..[] { .. } |
222
| CollectionsTest.java:8:28:8:32 | "one" | CollectionsTest.java:8:22:8:25 | list [post update] |
323
| CollectionsTest.java:9:28:9:32 | "two" | CollectionsTest.java:9:3:9:42 | new ..[] { .. } |

0 commit comments

Comments
 (0)