Add new module-based query

This commit is contained in:
Michael Hohn
2023-08-16 15:38:22 -07:00
committed by =Michael Hohn
parent c40c1cac09
commit 10f707ccde
2 changed files with 55 additions and 52 deletions

View File

@@ -15,59 +15,9 @@
expression, the =query= argument. Again start from =from..where..select=, expression, the =query= argument. Again start from =from..where..select=,
then convert to a predicate. then convert to a predicate.
3. Fill in the /taintflow configuration/ boilerplate 3. Fill in the /taintflow configuration/ boilerplate.
#+BEGIN_SRC java
class SqliFlowConfig extends TaintTracking::Configuration {
SqliFlowConfig() { this = "SqliFlow" }
override predicate isSource(DataFlow::Node node) { The final query is in [[./full-query.ql]]
none()
}
override predicate isSink(DataFlow::Node node) {
none()
}
}
#+END_SRC
The final query (without =isAdditionalTaintStep=) is
#+BEGIN_SRC java
/**
,* @name SQLI Vulnerability
,* @description Using untrusted strings in a sql query allows sql injection attacks.
,* @kind path-problem
,* @id java/SQLIVulnerable
,* @problem.severity warning
,*/
import java
import semmle.code.java.dataflow.TaintTracking
import DataFlow::PathGraph
class SqliFlowConfig extends TaintTracking::Configuration {
SqliFlowConfig() { this = "SqliFlow" }
override predicate isSource(DataFlow::Node source) {
// System.console().readLine();
exists(Call read |
read.getCallee().getName() = "readLine" and
read = source.asExpr()
)
}
override predicate isSink(DataFlow::Node sink) {
// conn.createStatement().executeUpdate(query);
exists(Call exec |
exec.getCallee().getName() = "executeUpdate" and
exec.getArgument(0) = sink.asExpr()
)
}
}
from SqliFlowConfig conf, DataFlow::PathNode source, DataFlow::PathNode sink
where conf.hasFlowPath(source, sink)
select sink, source, sink, "Possible SQL injection"
#+END_SRC
** (optional) Review of the results via SARIF file ** (optional) Review of the results via SARIF file
Query results are available in several output formats using the cli. The Query results are available in several output formats using the cli. The

53
session/full-query.ql Normal file
View File

@@ -0,0 +1,53 @@
/**
* @name SQLI Vulnerability
* @description Using untrusted strings in a sql query allows sql injection attacks.
* @kind path-problem
* @id cpp/SQLIVulnerable
* @problem.severity warning
*/
import java
import semmle.code.java.dataflow.TaintTracking
import semmle.code.java.dataflow.DataFlow
/**
* A global data-flow configuration using modules
*/
// Note result differences between
module InputToSQL = TaintTracking::Global<SqliFlowConfig>;
// and
// module InputToSQL = DataFlow::Global<SqliFlowConfig>;
module SqliFlowConfig implements DataFlow::ConfigSig {
predicate isSource(DataFlow::Node source) {
// System.console().readLine();
exists(Call read |
read.getCallee().getName() = "readLine" and
read = source.asExpr()
)
}
predicate isSink(DataFlow::Node sink) {
// conn.createStatement().executeUpdate(query);
exists(Call exec |
exec.getCallee().getName() = "executeUpdate" and
exec.getArgument(0) = sink.asExpr()
)
}
// predicate isSanitizer(DataFlow::Node sanitizer) { none() }
// predicate isAdditionalTaintStep(DataFlow::Node into, DataFlow::Node out) {
// // Extra taint step
// // String.format("INSERT INTO users VALUES (%d, '%s')", id, info);
// // Not needed here, but may be needed for larger libraries.
// none()
// }
}
// To construct the paths between sources and sinks.
import InputToSQL::PathGraph
from InputToSQL::PathNode source, InputToSQL::PathNode sink
where InputToSQL::flowPath(source, sink)
select sink, source, sink, "Possible SQL injection"