Skip to content

Commit e76ed94

Browse files
am0o0hmac
authored andcommitted
v3 add global taint steps for to_ruby of YAML/Psych
1 parent ad7e107 commit e76ed94

File tree

3 files changed

+31
-21
lines changed

3 files changed

+31
-21
lines changed

ruby/ql/lib/codeql/ruby/Frameworks.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,4 @@ private import codeql.ruby.frameworks.Sinatra
3333
private import codeql.ruby.frameworks.Twirp
3434
private import codeql.ruby.frameworks.Sqlite3
3535
private import codeql.ruby.frameworks.Pg
36+
private import codeql.ruby.frameworks.Yaml
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* add additional steps for to_ruby method of YAML/Psych library
3+
*/
4+
5+
private import codeql.ruby.dataflow.FlowSteps
6+
private import codeql.ruby.DataFlow
7+
private import codeql.ruby.ApiGraphs
8+
9+
private class YamlParseStep extends AdditionalTaintStep {
10+
override predicate step(DataFlow::Node pred, DataFlow::Node succ) {
11+
exists(DataFlow::CallNode yaml_parser_methods |
12+
yaml_parser_methods =
13+
API::getTopLevelMember(["YAML", "Psych"]).getAMethodCall(["parse", "parse_stream"]) and
14+
(
15+
pred = yaml_parser_methods.getArgument(0) or
16+
pred = yaml_parser_methods.getKeywordArgument("yaml")
17+
) and
18+
succ = yaml_parser_methods.getAMethodCall("to_ruby")
19+
)
20+
or
21+
exists(DataFlow::CallNode yaml_parser_methods |
22+
yaml_parser_methods = API::getTopLevelMember(["YAML", "Psych"]).getAMethodCall("parse_file") and
23+
(
24+
pred = yaml_parser_methods.getArgument(0) or
25+
pred = yaml_parser_methods.getKeywordArgument("filename")
26+
) and
27+
succ = yaml_parser_methods.getAMethodCall("to_ruby")
28+
)
29+
}
30+
}

ruby/ql/lib/codeql/ruby/security/UnsafeDeserializationQuery.qll

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,27 +24,6 @@ class Configuration extends TaintTracking::Configuration {
2424

2525
override predicate isSink(DataFlow::Node sink) { sink instanceof UnsafeDeserialization::Sink }
2626

27-
override predicate isAdditionalTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) {
28-
exists(DataFlow::CallNode yaml_parser_methods |
29-
yaml_parser_methods =
30-
API::getTopLevelMember(["YAML", "Psych"]).getAMethodCall(["parse", "parse_stream"]) and
31-
(
32-
nodeFrom = yaml_parser_methods.getArgument(0) or
33-
nodeFrom = yaml_parser_methods.getKeywordArgument("yaml")
34-
) and
35-
nodeTo = yaml_parser_methods.getAMethodCall("to_ruby")
36-
)
37-
or
38-
exists(DataFlow::CallNode yaml_parser_methods |
39-
yaml_parser_methods = API::getTopLevelMember(["YAML", "Psych"]).getAMethodCall("parse_file") and
40-
(
41-
nodeFrom = yaml_parser_methods.getArgument(0) or
42-
nodeFrom = yaml_parser_methods.getKeywordArgument("filename")
43-
) and
44-
nodeTo = yaml_parser_methods.getAMethodCall("to_ruby")
45-
)
46-
}
47-
4827
override predicate isSanitizer(DataFlow::Node node) {
4928
super.isSanitizer(node) or
5029
node instanceof UnsafeDeserialization::Sanitizer

0 commit comments

Comments
 (0)