diff --git a/java/ql/src/semmle/code/java/dataflow/FlowSources.qll b/java/ql/src/semmle/code/java/dataflow/FlowSources.qll index 4359fdbcbc2..b4235cb2635 100644 --- a/java/ql/src/semmle/code/java/dataflow/FlowSources.qll +++ b/java/ql/src/semmle/code/java/dataflow/FlowSources.qll @@ -24,6 +24,7 @@ import semmle.code.java.frameworks.spring.SpringWebClient import semmle.code.java.frameworks.Guice import semmle.code.java.frameworks.struts.StrutsActions import semmle.code.java.frameworks.Thrift +private import semmle.code.java.dataflow.ExternalFlow /** A data flow source of remote user input. */ abstract class RemoteFlowSource extends DataFlow::Node { @@ -31,6 +32,12 @@ abstract class RemoteFlowSource extends DataFlow::Node { abstract string getSourceType(); } +private class ExternalRemoteFlowSource extends RemoteFlowSource { + ExternalRemoteFlowSource() { sourceNode(this, "remote") } + + override string getSourceType() { result = "external" } +} + private class RemoteTaintedMethodAccessSource extends RemoteFlowSource { RemoteTaintedMethodAccessSource() { this.asExpr().(MethodAccess).getMethod() instanceof RemoteTaintedMethod diff --git a/java/ql/src/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll b/java/ql/src/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll index 69189d949f1..f03dab44a4f 100644 --- a/java/ql/src/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll +++ b/java/ql/src/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll @@ -10,6 +10,7 @@ private import semmle.code.java.dataflow.internal.ContainerFlow private import semmle.code.java.frameworks.spring.SpringController private import semmle.code.java.frameworks.spring.SpringHttp private import semmle.code.java.frameworks.Networking +private import semmle.code.java.dataflow.ExternalFlow import semmle.code.java.dataflow.FlowSteps /** @@ -45,6 +46,8 @@ predicate localAdditionalTaintStep(DataFlow::Node src, DataFlow::Node sink) { localAdditionalTaintUpdateStep(src.asExpr(), sink.(DataFlow::PostUpdateNode).getPreUpdateNode().asExpr()) or + summaryStep(src, sink, "taint") + or exists(Argument arg | src.asExpr() = arg and arg.isVararg() and