Skip to content

Commit 75a3748

Browse files
hmachvitved
authored andcommitted
Add WIP query for erb flow
1 parent bf3b86b commit 75a3748

File tree

2 files changed

+54
-11
lines changed

2 files changed

+54
-11
lines changed

ruby/ql/test/library-tests/dataflow/erb/erb.expected

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ testFailures
22
edges
33
nodes
44
subpaths
5-
#select
5+
#select
Lines changed: 53 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,56 @@
1-
/**
2-
* @kind path-problem
3-
*/
4-
51
import codeql.ruby.AST
62
import codeql.ruby.CFG
7-
import TestUtilities.InlineFlowTest
8-
import ValueFlowTest<DefaultFlowConfig>
9-
import ValueFlow::PathGraph
3+
import ruby
4+
import codeql.ruby.DataFlow
5+
import codeql.ruby.AST
6+
import codeql.ruby.TaintTracking
7+
import codeql.ruby.frameworks.data.internal.ApiGraphModels
8+
import codeql.ruby.ApiGraphs
9+
import codeql.ruby.dataflow.RemoteFlowSources
10+
private import codeql.ruby.CFG
11+
private import codeql.ruby.dataflow.BarrierGuards
12+
import codeql.ruby.ast.internal.Module
13+
import codeql.ruby.dataflow.internal.DataFlowPrivate
14+
import codeql.ruby.dataflow.SSA
15+
16+
from ErbFlow::PartialPathNode source, ErbFlow::PartialPathNode sink
17+
where ErbFlow::partialFlow(source, sink, _)
18+
select source, sink
19+
20+
module ErbFlow = TaintTracking::Global<Erb>::FlowExplorationFwd<explorationLimit/0>;
21+
22+
module Erb implements DataFlow::ConfigSig {
23+
predicate isSource(DataFlow::Node node) { node.(DataFlow::CallNode).getMethodName() = "source" }
24+
25+
predicate isSink(DataFlow::Node node) {
26+
node = any(DataFlow::CallNode c | c.getMethodName() = "sink").getArgument(_)
27+
}
28+
29+
predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) {
30+
isFlowFromViewSelfToTemplate(node1, node2)
31+
}
32+
}
33+
34+
int explorationLimit() { result = 10 }
35+
36+
predicate isFlowFromViewSelfToTemplate(DataFlow::Node node1, SsaSelfDefinitionNode node2) {
37+
exists(DataFlow::CallNode call, DataFlow::ClassNode view |
38+
call.getMethodName() = "render" and
39+
call.getArgument(0) = node1 and
40+
view.trackInstance().getAValueReachableFromSource() = node1 and
41+
exists(ErbFile template |
42+
view = getTemplateAssociatedViewClass(template) and node2.getLocation().getFile() = template
43+
) and
44+
node2.getSelfScope() instanceof Toplevel and
45+
node2.getDefinitionExt() instanceof Ssa::SelfDefinition
46+
)
47+
}
1048

11-
from ValueFlow::PathNode source, ValueFlow::PathNode sink
12-
where ValueFlow::flowPath(source, sink)
13-
select sink, source, sink, "$@", source, source.toString()
49+
DataFlow::ClassNode getTemplateAssociatedViewClass(ErbFile template) {
50+
// template is in same directory as view
51+
exists(File viewFile | viewFile = result.getADeclaration().getFile() |
52+
template.getParentContainer().getAbsolutePath() =
53+
viewFile.getParentContainer().getAbsolutePath() and
54+
viewFile.getStem() = template.getStem()
55+
)
56+
}

0 commit comments

Comments
 (0)