|
13 | 13 | import codeql.ruby.AST
|
14 | 14 | import codeql.ruby.Concepts
|
15 | 15 | import codeql.ruby.DataFlow
|
16 |
| -import DataFlow::PathGraph |
17 | 16 | import codeql.ruby.ApiGraphs
|
18 | 17 |
|
19 | 18 | bindingset[p]
|
@@ -47,22 +46,25 @@ class PermissivePermissionsExpr extends Expr {
|
47 | 46 | }
|
48 | 47 | }
|
49 | 48 |
|
50 |
| -class PermissivePermissionsConfig extends DataFlow::Configuration { |
51 |
| - PermissivePermissionsConfig() { this = "PermissivePermissionsConfig" } |
52 |
| - |
53 |
| - override predicate isSource(DataFlow::Node source) { |
| 49 | +private module PermissivePermissionsConfig implements DataFlow::ConfigSig { |
| 50 | + predicate isSource(DataFlow::Node source) { |
54 | 51 | source.asExpr().getExpr() instanceof PermissivePermissionsExpr
|
55 | 52 | }
|
56 | 53 |
|
57 |
| - override predicate isSink(DataFlow::Node sink) { |
| 54 | + predicate isSink(DataFlow::Node sink) { |
58 | 55 | exists(FileSystemPermissionModification mod | mod.getAPermissionNode() = sink)
|
59 | 56 | }
|
60 | 57 | }
|
61 | 58 |
|
| 59 | +private module PermissivePermissionsFlow = DataFlow::Global<PermissivePermissionsConfig>; |
| 60 | + |
| 61 | +private import PermissivePermissionsFlow::PathGraph |
| 62 | + |
62 | 63 | from
|
63 |
| - DataFlow::PathNode source, DataFlow::PathNode sink, PermissivePermissionsConfig conf, |
| 64 | + PermissivePermissionsFlow::PathNode source, PermissivePermissionsFlow::PathNode sink, |
64 | 65 | FileSystemPermissionModification mod
|
65 |
| -where conf.hasFlowPath(source, sink) and mod.getAPermissionNode() = sink.getNode() |
| 66 | +where |
| 67 | + PermissivePermissionsFlow::flowPath(source, sink) and mod.getAPermissionNode() = sink.getNode() |
66 | 68 | select source.getNode(), source, sink,
|
67 | 69 | "This overly permissive mask used in $@ allows read or write access to others.", mod,
|
68 | 70 | mod.toString()
|
0 commit comments