Skip to content

Commit b41fd52

Browse files
committed
Swift: First version swift/regex-injection query.
1 parent ca71d48 commit b41fd52

File tree

3 files changed

+98
-0
lines changed

3 files changed

+98
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* Provides classes and predicates to reason about regular expression injection
3+
* vulnerabilities.
4+
*/
5+
6+
import swift
7+
import codeql.swift.dataflow.DataFlow
8+
import codeql.swift.dataflow.ExternalFlow
9+
import codeql.swift.regex.Regex
10+
11+
/**
12+
* A data flow sink for regular expression injection vulnerabilities.
13+
*/
14+
abstract class RegexInjectionSink extends DataFlow::Node { }
15+
16+
/**
17+
* A barrier for regular expression injection vulnerabilities.
18+
*/
19+
abstract class RegexInjectionBarrier extends DataFlow::Node { }
20+
21+
/**
22+
* A unit class for adding additional flow steps.
23+
*/
24+
class RegexInjectionAdditionalFlowStep extends Unit {
25+
/**
26+
* Holds if the step from `node1` to `node2` should be considered a flow
27+
* step for paths related to regular expression injection vulnerabilities.
28+
*/
29+
abstract predicate step(DataFlow::Node node1, DataFlow::Node node2);
30+
}
31+
32+
/**
33+
* A sink that is a regular expression evaluation defined in the Regex library.
34+
*/
35+
private class EvalRegexInjectionSink extends RegexInjectionSink {
36+
EvalRegexInjectionSink() { this.asExpr() = any(RegexEval e).getRegexInput() }
37+
}
38+
39+
/**
40+
* A sink that is a regular expression use defined in a CSV model.
41+
*/
42+
private class DefaultRegexInjectionSink extends RegexInjectionSink {
43+
DefaultRegexInjectionSink() { sinkNode(this, "regex-use") }
44+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* Provides a taint-tracking configuration for detecting regular expression
3+
* injection vulnerabilities.
4+
*/
5+
6+
import swift
7+
import codeql.swift.dataflow.DataFlow
8+
import codeql.swift.dataflow.TaintTracking
9+
import codeql.swift.dataflow.FlowSources
10+
import codeql.swift.security.regex.RegexInjectionExtensions
11+
12+
/**
13+
* A taint configuration for detecting regular expression injection vulnerabilities.
14+
*/
15+
module RegexInjectionConfig implements DataFlow::ConfigSig {
16+
predicate isSource(DataFlow::Node source) { source instanceof FlowSource }
17+
18+
predicate isSink(DataFlow::Node sink) { sink instanceof RegexInjectionSink }
19+
20+
predicate isBarrier(DataFlow::Node barrier) { barrier instanceof RegexInjectionBarrier }
21+
22+
predicate isAdditionalFlowStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) {
23+
any(RegexInjectionAdditionalFlowStep s).step(nodeFrom, nodeTo)
24+
}
25+
}
26+
27+
/**
28+
* Detect taint flow of tainted data that reaches a regular expression sink.
29+
*/
30+
module RegexInjectionFlow = TaintTracking::Global<RegexInjectionConfig>;
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* @name Regular expression injection
3+
* @description User input should not be used in regular expressions without first being escaped,
4+
* otherwise a malicious user may be able to provide a regex that could require
5+
* exponential time on certain inputs.
6+
* @kind path-problem
7+
* @problem.severity error
8+
* @security-severity 7.5
9+
* @precision high
10+
* @id swift/regex-injection
11+
* @tags security
12+
* external/cwe/cwe-730
13+
* external/cwe/cwe-400
14+
*/
15+
16+
import swift
17+
import codeql.swift.dataflow.DataFlow
18+
import codeql.swift.security.regex.RegexInjectionQuery
19+
import RegexInjectionFlow::PathGraph
20+
21+
from RegexInjectionFlow::PathNode sourceNode, RegexInjectionFlow::PathNode sinkNode
22+
where RegexInjectionFlow::flowPath(sourceNode, sinkNode)
23+
select sinkNode.getNode(), sourceNode, sinkNode,
24+
"This regular expression is constructed from a $@.", sourceNode.getNode(), "user-provided value"

0 commit comments

Comments
 (0)