Skip to content

Commit 6c2eee3

Browse files
committed
Ruby: Restrict regexp taint flow to String summaries
1 parent 60fe370 commit 6c2eee3

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,9 @@ class SummaryNode extends NodeImpl, TSummaryNode {
735735

736736
SummaryNode() { this = TSummaryNode(c, state) }
737737

738+
/** Gets the summarized callable that this node belongs to. */
739+
FlowSummaryImpl::Public::SummarizedCallable getSummarizedCallable() { result = c }
740+
738741
override CfgScope getCfgScope() { none() }
739742

740743
override DataFlowCallable getEnclosingCallable() { result.asLibraryCallable() = c }

ruby/ql/lib/codeql/ruby/frameworks/core/String.qll

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
private import codeql.ruby.AST
44
private import codeql.ruby.ApiGraphs
55
private import codeql.ruby.DataFlow
6-
private import codeql.ruby.dataflow.FlowSummary
6+
private import codeql.ruby.dataflow.FlowSummary as FlowSummary
77
private import codeql.ruby.dataflow.internal.DataFlowDispatch
88
private import codeql.ruby.controlflow.CfgNodes
99
private import codeql.ruby.Regexp as RE
@@ -107,6 +107,18 @@ module String {
107107
preservesValue = false
108108
}
109109

110+
/** A `String` callable with a flow summary. */
111+
abstract class SummarizedCallable extends FlowSummary::SummarizedCallable {
112+
bindingset[this]
113+
SummarizedCallable() { any() }
114+
}
115+
116+
abstract private class SimpleSummarizedCallable extends SummarizedCallable,
117+
FlowSummary::SimpleSummarizedCallable {
118+
bindingset[this]
119+
SimpleSummarizedCallable() { any() }
120+
}
121+
110122
private class NewSummary extends SummarizedCallable {
111123
NewSummary() { this = "String.new" }
112124

ruby/ql/lib/codeql/ruby/regexp/internal/RegExpConfiguration.qll

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ private import codeql.ruby.controlflow.CfgNodes
55
private import codeql.ruby.dataflow.internal.tainttrackingforregexp.TaintTrackingImpl
66
private import codeql.ruby.typetracking.TypeTracker
77
private import codeql.ruby.ApiGraphs
8+
private import codeql.ruby.dataflow.internal.DataFlowPrivate as DataFlowPrivate
9+
private import codeql.ruby.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl
10+
private import codeql.ruby.dataflow.FlowSummary as FlowSummary
11+
private import codeql.ruby.frameworks.core.String
812

913
class RegExpConfiguration extends Configuration {
1014
RegExpConfiguration() { this = "RegExpConfiguration" }
@@ -30,6 +34,11 @@ class RegExpConfiguration extends Configuration {
3034
node = mce.getArgument(0) and
3135
mce.getReceiver() = trackRegexpType()
3236
)
37+
or
38+
// only include taint flow through `String` summaries
39+
FlowSummaryImpl::Private::Steps::summaryLocalStep(_, node, false) and
40+
not node.(DataFlowPrivate::SummaryNode).getSummarizedCallable() instanceof
41+
String::SummarizedCallable
3342
}
3443
}
3544

0 commit comments

Comments
 (0)