11private import codeql.ruby.Regexp
2- private import codeql.ruby.ast.Literal as Ast
2+ private import codeql.ruby.AST as Ast
3+ private import codeql.ruby.CFG
34private import codeql.ruby.DataFlow
45private import codeql.ruby.controlflow.CfgNodes
5- private import codeql.ruby.dataflow.internal.tainttrackingforregexp.TaintTrackingImpl
6+ private import codeql.ruby.dataflow.internal.DataFlowImplForRegExp
67private import codeql.ruby.typetracking.TypeTracker
78private import codeql.ruby.ApiGraphs
9+ private import codeql.ruby.dataflow.internal.DataFlowPrivate as DataFlowPrivate
10+ private import codeql.ruby.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl
11+ private import codeql.ruby.dataflow.FlowSummary as FlowSummary
12+ private import codeql.ruby.frameworks.core.String
813
914class RegExpConfiguration extends Configuration {
1015 RegExpConfiguration ( ) { this = "RegExpConfiguration" }
@@ -20,7 +25,7 @@ class RegExpConfiguration extends Configuration {
2025
2126 override predicate isSink ( DataFlow:: Node sink ) { sink instanceof RegExpInterpretation:: Range }
2227
23- override predicate isSanitizer ( DataFlow:: Node node ) {
28+ override predicate isBarrier ( DataFlow:: Node node ) {
2429 exists ( DataFlow:: CallNode mce | mce .getMethodName ( ) = [ "match" , "match?" ] |
2530 // receiver of https://ruby-doc.org/core-2.4.0/String.html#method-i-match
2631 node = mce .getReceiver ( ) and
@@ -31,6 +36,24 @@ class RegExpConfiguration extends Configuration {
3136 mce .getReceiver ( ) = trackRegexpType ( )
3237 )
3338 }
39+
40+ override predicate isAdditionalFlowStep ( DataFlow:: Node nodeFrom , DataFlow:: Node nodeTo ) {
41+ // include taint flow through `String` summaries,
42+ FlowSummaryImpl:: Private:: Steps:: summaryLocalStep ( nodeFrom , nodeTo , false ) and
43+ nodeFrom .( DataFlowPrivate:: SummaryNode ) .getSummarizedCallable ( ) instanceof
44+ String:: SummarizedCallable
45+ or
46+ // string concatenations, and
47+ exists ( CfgNodes:: ExprNodes:: OperationCfgNode op |
48+ op = nodeTo .asExpr ( ) and
49+ op .getAnOperand ( ) = nodeFrom .asExpr ( ) and
50+ op .getExpr ( ) .( Ast:: BinaryOperation ) .getOperator ( ) = "+"
51+ )
52+ or
53+ // string interpolations
54+ nodeFrom .asExpr ( ) =
55+ nodeTo .asExpr ( ) .( CfgNodes:: ExprNodes:: StringlikeLiteralCfgNode ) .getAComponent ( )
56+ }
3457}
3558
3659private DataFlow:: LocalSourceNode trackRegexpType ( TypeTracker t ) {
0 commit comments