|
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