Skip to content

Commit 4a98ef0

Browse files
committed
Ruby: use the 'customizations' pattern for the SQL injection query
1 parent e7576fd commit 4a98ef0

File tree

3 files changed

+65
-19
lines changed

3 files changed

+65
-19
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/**
2+
* Provides default sources, sinks and sanitizers for detecting SQL injection
3+
* vulnerabilities, as well as extension points for adding your own.
4+
*/
5+
6+
private import codeql.ruby.Concepts
7+
private import codeql.ruby.DataFlow
8+
private import codeql.ruby.dataflow.BarrierGuards
9+
private import codeql.ruby.dataflow.RemoteFlowSources
10+
11+
/**
12+
* Provides default sources, sinks and sanitizers for detecting SQL injection
13+
* vulnerabilities, as well as extension points for adding your own.
14+
*/
15+
module SqlInjection {
16+
abstract class Source extends DataFlow::Node { }
17+
18+
abstract class Sink extends DataFlow::Node { }
19+
20+
abstract class Sanitizer extends DataFlow::Node { }
21+
22+
/**
23+
* A source of remote user input, considered as a flow source.
24+
*/
25+
private class RemoteFlowSourceAsSource extends Source, RemoteFlowSource { }
26+
27+
/**
28+
* A SQL statement of a SQL execution, considered as a flow sink.
29+
*/
30+
private class SqlExecutionAsSink extends Sink {
31+
SqlExecutionAsSink() { this = any(SqlExecution e).getSql() }
32+
}
33+
34+
/**
35+
* A comparison with a constant string, considered as a sanitizer-guard.
36+
*/
37+
private class StringConstCompareAsSanitizerGuard extends Sanitizer, StringConstCompareBarrier { }
38+
39+
/**
40+
* An inclusion check against an array of constant strings, considered as a
41+
* sanitizer-guard.
42+
*/
43+
class StringConstArrayInclusionCallAsSanitizer extends Sanitizer,
44+
StringConstArrayInclusionCallBarrier { }
45+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* Provides default sources, sinks and sanitizers for detecting SQL injection
3+
* vulnerabilities, as well as extension points for adding your own.
4+
*/
5+
6+
private import codeql.ruby.DataFlow
7+
private import codeql.ruby.TaintTracking
8+
import SqlInjectionCustomizations::SqlInjection
9+
10+
class Configuration extends TaintTracking::Configuration {
11+
Configuration() { this = "SqlInjectionConfiguration" }
12+
13+
override predicate isSource(DataFlow::Node source) { source instanceof Source }
14+
15+
override predicate isSink(DataFlow::Node source) { source instanceof Sink }
16+
17+
override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer }
18+
}

ruby/ql/src/queries/security/cwe-089/SqlInjection.ql

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,11 @@
1111
* external/cwe/cwe-089
1212
*/
1313

14-
import codeql.ruby.AST
15-
import codeql.ruby.Concepts
1614
import codeql.ruby.DataFlow
17-
import codeql.ruby.dataflow.BarrierGuards
18-
import codeql.ruby.dataflow.RemoteFlowSources
19-
import codeql.ruby.TaintTracking
15+
import codeql.ruby.security.SqlInjectionQuery
2016
import DataFlow::PathGraph
2117

22-
class SqlInjectionConfiguration extends TaintTracking::Configuration {
23-
SqlInjectionConfiguration() { this = "SQLInjectionConfiguration" }
24-
25-
override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
26-
27-
override predicate isSink(DataFlow::Node sink) { sink instanceof SqlExecution }
28-
29-
override predicate isSanitizer(DataFlow::Node node) {
30-
node instanceof StringConstCompareBarrier or
31-
node instanceof StringConstArrayInclusionCallBarrier
32-
}
33-
}
34-
35-
from SqlInjectionConfiguration config, DataFlow::PathNode source, DataFlow::PathNode sink
18+
from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink
3619
where config.hasFlowPath(source, sink)
3720
select sink.getNode(), source, sink, "This SQL query depends on a $@.", source.getNode(),
3821
"user-provided value"

0 commit comments

Comments
 (0)