Skip to content

Commit 7e215a5

Browse files
author
Benjamin Muskalla
authored
Merge pull request #7599 from bmuskalla/modelWriter
Java: Model Appenable and Writer
2 parents 1893b9f + 365a8d9 commit 7e215a5

File tree

5 files changed

+69
-3
lines changed

5 files changed

+69
-3
lines changed

java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ private module Frameworks {
9191
private import semmle.code.java.frameworks.guava.Guava
9292
private import semmle.code.java.frameworks.jackson.JacksonSerializability
9393
private import semmle.code.java.frameworks.javaee.jsf.JSFRenderer
94+
private import semmle.code.java.frameworks.JavaIo
9495
private import semmle.code.java.frameworks.JavaxJson
9596
private import semmle.code.java.frameworks.JaxWS
9697
private import semmle.code.java.frameworks.JoddJson
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/** Definitions of taint steps in Objects class of the JDK */
2+
3+
import java
4+
private import semmle.code.java.dataflow.ExternalFlow
5+
6+
private class JavaIoSummaryCsv extends SummaryModelCsv {
7+
override predicate row(string row) {
8+
row =
9+
[
10+
//`namespace; type; subtypes; name; signature; ext; input; output; kind`
11+
"java.lang;Appendable;true;append;;;Argument[0];Argument[-1];taint",
12+
"java.lang;Appendable;true;append;;;Argument[-1];ReturnValue;value",
13+
"java.io;Writer;true;write;;;Argument[0];Argument[-1];taint",
14+
"java.io;Writer;true;toString;;;Argument[-1];ReturnValue;taint",
15+
"java.io;CharArrayWriter;true;toCharArray;;;Argument[-1];ReturnValue;taint",
16+
"java.nio.channels;ReadableByteChannel;true;read;(ByteBuffer);;Argument[-1];Argument[0];taint",
17+
"java.nio.channels;Channels;false;newChannel;(InputStream);;Argument[0];ReturnValue;taint"
18+
]
19+
}
20+
}

java/ql/lib/semmle/code/java/frameworks/Strings.qll

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,6 @@ private class StringSummaryCsv extends SummaryModelCsv {
4040
"java.lang;String;false;valueOf;(char);;Argument[0];ReturnValue;taint",
4141
"java.lang;String;false;valueOf;(char[],int,int);;Argument[0];ReturnValue;taint",
4242
"java.lang;String;false;valueOf;(char[]);;Argument[0];ReturnValue;taint",
43-
"java.io;StringWriter;true;append;;;Argument[0];Argument[-1];taint",
44-
"java.io;StringWriter;true;append;;;Argument[-1];ReturnValue;value",
45-
"java.io;StringWriter;true;write;;;Argument[0];Argument[-1];taint",
4643
"java.lang;AbstractStringBuilder;true;AbstractStringBuilder;(String);;Argument[0];Argument[-1];taint",
4744
"java.lang;AbstractStringBuilder;true;append;;;Argument[0];Argument[-1];taint",
4845
"java.lang;AbstractStringBuilder;true;append;;;Argument[-1];ReturnValue;value",
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import java.io.*;
2+
import java.nio.ByteBuffer;
3+
import java.nio.channels.Channels;
4+
import java.nio.channels.ReadableByteChannel;
5+
6+
public class JavaIo {
7+
public static String taint() { return "tainted"; }
8+
9+
public static void sink(Object o) { }
10+
11+
void testWritingChars() throws IOException {
12+
StringWriter w = new StringWriter();
13+
char[] chars = taint().toCharArray();
14+
sink(w.toString());
15+
w.write(chars);
16+
sink(w.toString());
17+
sink(w.getBuffer().toString());
18+
}
19+
20+
void testAppendingToWriter() throws IOException {
21+
Writer w = new StringWriter();
22+
CharSequence seq = taint();
23+
sink(w.toString());
24+
w.append("harmless").append(seq);
25+
sink(w.toString());
26+
}
27+
28+
void testCharArrayWriter() throws IOException {
29+
CharArrayWriter w = new CharArrayWriter();
30+
CharSequence seq = taint();
31+
sink(w.toCharArray());
32+
w.append("harmless").append(seq);
33+
sink(w.toCharArray());
34+
}
35+
36+
void testByteChannelToBuffer() throws IOException {
37+
ReadableByteChannel c = Channels.newChannel(new ByteArrayInputStream(taint().getBytes()));
38+
ByteBuffer buf = ByteBuffer.allocate(10);
39+
sink(buf);
40+
c.read(buf);
41+
sink(buf);
42+
}
43+
44+
}

java/ql/test/library-tests/dataflow/taint/test.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@
4444
| CharSeq.java:7:26:7:32 | taint(...) | CharSeq.java:8:12:8:14 | seq |
4545
| CharSeq.java:7:26:7:32 | taint(...) | CharSeq.java:11:12:11:21 | seqFromSeq |
4646
| CharSeq.java:7:26:7:32 | taint(...) | CharSeq.java:14:12:14:24 | stringFromSeq |
47+
| JavaIo.java:13:20:13:26 | taint(...) | JavaIo.java:16:10:16:21 | toString(...) |
48+
| JavaIo.java:13:20:13:26 | taint(...) | JavaIo.java:17:10:17:33 | toString(...) |
49+
| JavaIo.java:30:24:30:30 | taint(...) | JavaIo.java:33:10:33:24 | toCharArray(...) |
50+
| JavaIo.java:37:74:37:80 | taint(...) | JavaIo.java:41:10:41:12 | buf |
4751
| MethodFlow.java:7:22:7:28 | taint(...) | MethodFlow.java:8:10:8:16 | tainted |
4852
| MethodFlow.java:9:31:9:37 | taint(...) | MethodFlow.java:10:10:10:17 | tainted2 |
4953
| MethodFlow.java:11:35:11:41 | taint(...) | MethodFlow.java:12:10:12:17 | tainted3 |

0 commit comments

Comments
 (0)