mirror of
https://github.com/github/codeql.git
synced 2026-07-21 11:18:20 +02:00
61 lines
2.1 KiB
Plaintext
61 lines
2.1 KiB
Plaintext
import semmle.code.java.dataflow.DataFlow
|
|
import semmle.code.java.dataflow.ExternalFlow
|
|
import semmle.code.java.dataflow.TaintTracking
|
|
import TestUtilities.InlineExpectationsTest
|
|
|
|
class DefaultValueFlowConf extends DataFlow::Configuration {
|
|
DefaultValueFlowConf() { this = "qltest:defaultValueFlowConf" }
|
|
|
|
override predicate isSource(DataFlow::Node n) {
|
|
n.asExpr().(MethodAccess).getMethod().getName() = ["source", "taint"]
|
|
}
|
|
|
|
override predicate isSink(DataFlow::Node n) {
|
|
exists(MethodAccess ma | ma.getMethod().hasName("sink") | n.asExpr() = ma.getAnArgument())
|
|
}
|
|
|
|
override int fieldFlowBranchLimit() { result = 1000 }
|
|
}
|
|
|
|
class DefaultTaintFlowConf extends TaintTracking::Configuration {
|
|
DefaultTaintFlowConf() { this = "qltest:defaultTaintFlowConf" }
|
|
|
|
override predicate isSource(DataFlow::Node n) {
|
|
n.asExpr().(MethodAccess).getMethod().getName() = ["source", "taint"]
|
|
}
|
|
|
|
override predicate isSink(DataFlow::Node n) {
|
|
exists(MethodAccess ma | ma.getMethod().hasName("sink") | n.asExpr() = ma.getAnArgument())
|
|
}
|
|
|
|
override int fieldFlowBranchLimit() { result = 1000 }
|
|
}
|
|
|
|
class InlineFlowTest extends InlineExpectationsTest {
|
|
InlineFlowTest() { this = "HasFlowTest" }
|
|
|
|
override string getARelevantTag() { result = ["hasValueFlow", "hasTaintFlow"] }
|
|
|
|
override predicate hasActualResult(Location location, string element, string tag, string value) {
|
|
tag = "hasValueFlow" and
|
|
exists(DataFlow::Node src, DataFlow::Node sink | getValueFlowConfig().hasFlow(src, sink) |
|
|
sink.getLocation() = location and
|
|
element = sink.toString() and
|
|
value = ""
|
|
)
|
|
or
|
|
tag = "hasTaintFlow" and
|
|
exists(DataFlow::Node src, DataFlow::Node sink |
|
|
getTaintFlowConfig().hasFlow(src, sink) and not getValueFlowConfig().hasFlow(src, sink)
|
|
|
|
|
sink.getLocation() = location and
|
|
element = sink.toString() and
|
|
value = ""
|
|
)
|
|
}
|
|
|
|
DataFlow::Configuration getValueFlowConfig() { result = any(DefaultValueFlowConf config) }
|
|
|
|
DataFlow::Configuration getTaintFlowConfig() { result = any(DefaultTaintFlowConf config) }
|
|
}
|