File tree Expand file tree Collapse file tree 3 files changed +47
-0
lines changed
ruby/ql/src/queries/security/cwe-094 Expand file tree Collapse file tree 3 files changed +47
-0
lines changed Original file line number Diff line number Diff line change @@ -66,6 +66,26 @@ to define the getter method.
66
66
<sample src =" examples/UnsafeCodeConstruction2Safe.rb" />
67
67
</example >
68
68
69
+ <example >
70
+ <p >
71
+ This example dynamically registers a method on another class which
72
+ forwards its arguments to the registering module. This approach uses
73
+ <code >module_eval</code > and string interpolation to construct class variables
74
+ and methods.
75
+ </p >
76
+
77
+ <sample src =" examples/UnsafeCodeConstruction3.rb" />
78
+
79
+ <p >
80
+ A safer approach is to use <code >class_variable_set</code > and
81
+ <code >class_variable_get</code > along with <code >define_method</code >. String
82
+ interpolation is still used to construct the class variable name, but this is
83
+ safe because <code >class_variable_set<code > is not susceptible to code injection.
84
+ </p >
85
+
86
+ <sample src =" examples/UnsafeCodeConstruction3Safe.rb" />
87
+ </example >
88
+
69
89
<references >
70
90
<li >
71
91
OWASP:
@@ -74,5 +94,11 @@ OWASP:
74
94
<li >
75
95
Wikipedia: <a href =" https://en.wikipedia.org/wiki/Code_injection" >Code Injection</a >.
76
96
</li >
97
+ <li >
98
+ Ruby documentation: <a href =" https://docs.ruby-lang.org/en/3.2/Module.html#method-i-define_method" ><code >define_method</code ></a >.
99
+ </li >
100
+ <li >
101
+ Ruby documentation: <a href =" https://docs.ruby-lang.org/en/3.2/Module.html#method-i-class_variable_set" ><code >class_variable_set</code ></a >.
102
+ </li >
77
103
</references >
78
104
</qhelp >
Original file line number Diff line number Diff line change
1
+ module Invoker
2
+ def attach ( klass , name )
3
+ invoker = self
4
+ klass . module_eval <<-CODE
5
+ @@#{ name } = invoker
6
+
7
+ def #{ name } (*args)
8
+ @@#{ name } .call(*args)
9
+ end
10
+ CODE
11
+ end
12
+ end
Original file line number Diff line number Diff line change
1
+ module Invoker
2
+ def attach ( klass , name )
3
+ var = :"@@#{ name } "
4
+ klass . class_variable_set ( var , self )
5
+ klass . define_method ( name ) do |*args |
6
+ self . class . class_variable_get ( var ) . call ( *args )
7
+ end
8
+ end
9
+ end
You can’t perform that action at this time.
0 commit comments