diff --git a/java/ql/src/semmle/code/java/dataflow/FlowSteps.qll b/java/ql/src/semmle/code/java/dataflow/FlowSteps.qll index d30cca6afe6..c129f25e3ee 100644 --- a/java/ql/src/semmle/code/java/dataflow/FlowSteps.qll +++ b/java/ql/src/semmle/code/java/dataflow/FlowSteps.qll @@ -111,14 +111,14 @@ private class StringTaintPreservingMethod extends TaintPreservingCallable { this.hasName([ "concat", "copyValueOf", "endsWith", "format", "formatted", "getBytes", "indent", "intern", "join", "repeat", "split", "strip", "stripIndent", "stripLeading", "stripTrailing", - "substring", "toCharArray", "toLowerCase", "toString", "toUpperCase", "trim" + "substring", "toCharArray", "toLowerCase", "toString", "toUpperCase", "trim", "valueOf" ]) } override predicate returnsTaintFrom(int arg) { arg = -1 and not this.isStatic() or - this.hasName(["concat", "copyValueOf"]) and arg = 0 + this.hasName(["concat", "copyValueOf", "valueOf"]) and arg = 0 or this.hasName(["format", "formatted", "join"]) and arg = [0 .. getNumberOfParameters()] } diff --git a/java/ql/test/library-tests/dataflow/taint/B.java b/java/ql/test/library-tests/dataflow/taint/B.java index 81b007e6871..fa0094394c4 100644 --- a/java/ql/test/library-tests/dataflow/taint/B.java +++ b/java/ql/test/library-tests/dataflow/taint/B.java @@ -34,6 +34,9 @@ public class B { // tainted - data preserving constructors String constructed = new String(complex); sink(constructed); + // tainted - data preserving method + String valueOf = String.valueOf(complex.toCharArray()); + sink(valueOf); // tainted - unsafe escape String badEscape = constructed.replaceAll("(