Skip to content

Commit af0dff8

Browse files
committed
Java: migrate constructor flow taint steps to CSV
1 parent f9a207d commit af0dff8

File tree

2 files changed

+24
-55
lines changed

2 files changed

+24
-55
lines changed

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

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,30 @@ private predicate summaryModelCsv(string row) {
241241
"org.apache.commons.io;IOUtils;false;write;;;Argument[0];Argument[1];taint",
242242
"org.apache.commons.io;IOUtils;false;writeChunked;;;Argument[0];Argument[1];taint",
243243
"org.apache.commons.io;IOUtils;false;writeLines;;;Argument[0];Argument[2];taint",
244-
"org.apache.commons.io;IOUtils;false;writeLines;;;Argument[1];Argument[2];taint"
244+
"org.apache.commons.io;IOUtils;false;writeLines;;;Argument[1];Argument[2];taint",
245+
// constructor flow
246+
"java.io;File;false;File;;;Argument[0];ReturnValue;taint",
247+
"java.io;File;false;File;;;Argument[1];ReturnValue;taint",
248+
"java.net;URI;false;URI;(String);;Argument[0];ReturnValue;taint",
249+
"javax.xml.transform.stream;StreamSource;false;StreamSource;;;Argument[0];ReturnValue;taint",
250+
"javax.xml.transform.sax;SAXSource;false;SAXSource;(InputSource);;Argument[0];ReturnValue;taint",
251+
"javax.xml.transform.sax;SAXSource;false;SAXSource;(XMLReader,InputSource);;Argument[1];ReturnValue;taint",
252+
"org.xml.sax;InputSource;false;InputSource;;;Argument[0];ReturnValue;taint",
253+
"javax.servlet.http;Cookie;false;Cookie;;;Argument[0];ReturnValue;taint",
254+
"javax.servlet.http;Cookie;false;Cookie;;;Argument[1];ReturnValue;taint",
255+
"java.util.zip;ZipInputStream;false;ZipInputStream;;;Argument[0];ReturnValue;taint",
256+
"java.util.zip;GZIPInputStream;false;GZIPInputStream;;;Argument[0];ReturnValue;taint",
257+
"java.util;StringTokenizer;false;StringTokenizer;;;Argument[0];ReturnValue;taint",
258+
"java.beans;XMLDecoder;false;XMLDecoder;;;Argument[0];ReturnValue;taint",
259+
"com.esotericsoftware.kryo.io;Input;false;Input;;;Argument[0];ReturnValue;taint",
260+
"java.io;BufferedInputStream;false;BufferedInputStream;;;Argument[0];ReturnValue;taint",
261+
"java.io;DataInputStream;false;DataInputStream;;;Argument[0];ReturnValue;taint",
262+
"java.io;ByteArrayInputStream;false;ByteArrayInputStream;;;Argument[0];ReturnValue;taint",
263+
"java.io;ObjectInputStream;false;ObjectInputStream;;;Argument[0];ReturnValue;taint",
264+
"java.io;StringReader;false;StringReader;;;Argument[0];ReturnValue;taint",
265+
"java.io;CharArrayReader;false;CharArrayReader;;;Argument[0];ReturnValue;taint",
266+
"java.io;BufferedReader;false;BufferedReader;;;Argument[0];ReturnValue;taint",
267+
"java.io;InputStreamReader;false;InputStreamReader;;;Argument[0];ReturnValue;taint"
245268
]
246269
}
247270

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

Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -166,60 +166,6 @@ private predicate inputStreamWrapper(Constructor c, int argi) {
166166
/** An object construction that preserves the data flow status of any of its arguments. */
167167
private predicate constructorStep(Expr tracked, ConstructorCall sink) {
168168
exists(int argi | sink.getArgument(argi) = tracked |
169-
exists(string s | sink.getConstructedType().getQualifiedName() = s |
170-
// some readers preserve the content of streams
171-
s = "java.io.InputStreamReader" and argi = 0
172-
or
173-
s = "java.io.BufferedReader" and argi = 0
174-
or
175-
s = "java.io.CharArrayReader" and argi = 0
176-
or
177-
s = "java.io.StringReader" and argi = 0
178-
or
179-
// data preserved through streams
180-
s = "java.io.ObjectInputStream" and argi = 0
181-
or
182-
s = "java.io.ByteArrayInputStream" and argi = 0
183-
or
184-
s = "java.io.DataInputStream" and argi = 0
185-
or
186-
s = "java.io.BufferedInputStream" and argi = 0
187-
or
188-
s = "com.esotericsoftware.kryo.io.Input" and argi = 0
189-
or
190-
s = "java.beans.XMLDecoder" and argi = 0
191-
or
192-
// a tokenizer preserves the content of a string
193-
s = "java.util.StringTokenizer" and argi = 0
194-
or
195-
// unzipping the stream preserves content
196-
s = "java.util.zip.ZipInputStream" and argi = 0
197-
or
198-
s = "java.util.zip.GZIPInputStream" and argi = 0
199-
or
200-
// a cookie with tainted ingredients is tainted
201-
s = "javax.servlet.http.Cookie" and argi = 0
202-
or
203-
s = "javax.servlet.http.Cookie" and argi = 1
204-
or
205-
// various xml stream source constructors.
206-
s = "org.xml.sax.InputSource" and argi = 0
207-
or
208-
s = "javax.xml.transform.sax.SAXSource" and argi = 0 and sink.getNumArgument() = 1
209-
or
210-
s = "javax.xml.transform.sax.SAXSource" and argi = 1 and sink.getNumArgument() = 2
211-
or
212-
s = "javax.xml.transform.stream.StreamSource" and argi = 0
213-
or
214-
//a URI constructed from a tainted string is tainted.
215-
s = "java.net.URI" and argi = 0 and sink.getNumArgument() = 1
216-
or
217-
//a File constructed from a tainted string is tainted.
218-
s = "java.io.File" and argi = 0
219-
or
220-
s = "java.io.File" and argi = 1
221-
)
222-
or
223169
// wrappers constructed by extension
224170
exists(Constructor c, Parameter p, SuperConstructorInvocationStmt sup |
225171
c = sink.getConstructor() and

0 commit comments

Comments
 (0)