File tree Expand file tree Collapse file tree 3 files changed +31
-21
lines changed
Expand file tree Collapse file tree 3 files changed +31
-21
lines changed Original file line number Diff line number Diff line change @@ -33,3 +33,4 @@ private import codeql.ruby.frameworks.Sinatra
3333private import codeql.ruby.frameworks.Twirp
3434private import codeql.ruby.frameworks.Sqlite3
3535private import codeql.ruby.frameworks.Pg
36+ private import codeql.ruby.frameworks.Yaml
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff 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
You can’t perform that action at this time.
0 commit comments