Skip to content

Commit 360a99f

Browse files
committed
delete getKernelMethod and don't special-case the methodName on super-calls in the Kernel model
1 parent 52c0afa commit 360a99f

File tree

4 files changed

+15
-29
lines changed

4 files changed

+15
-29
lines changed

ruby/ql/lib/codeql/ruby/frameworks/core/Kernel.qll

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,34 +18,20 @@ module Kernel {
1818
* providing a specific receiver as in `Kernel.exit`.
1919
*/
2020
class KernelMethodCall extends DataFlow::CallNode {
21-
string methodName;
22-
2321
KernelMethodCall() {
24-
this = API::getTopLevelMember("Kernel").getAMethodCall(methodName)
22+
this = API::getTopLevelMember("Kernel").getAMethodCall(_)
2523
or
2624
this.asExpr().getExpr() instanceof UnknownMethodCall and
27-
(
28-
methodName = super.getMethodName()
29-
or
30-
this.asExpr().getExpr() instanceof SuperCall and
31-
methodName = this.asExpr().getExpr().getEnclosingCallable().(MethodBase).getName()
32-
) and
3325
(
3426
this.getReceiver().asExpr().getExpr() instanceof SelfVariableAccess and
35-
isPrivateKernelMethod(methodName)
27+
isPrivateKernelMethod(super.getMethodName())
3628
or
3729
this.asExpr().getExpr() instanceof SuperCall and
38-
isPrivateKernelMethod(methodName)
30+
isPrivateKernelMethod(super.getMethodName())
3931
or
40-
isPublicKernelMethod(methodName)
32+
isPublicKernelMethod(super.getMethodName())
4133
)
4234
}
43-
44-
/**
45-
* Gets which method of `Kernel` is called.
46-
* Works even when the call is a `super(...)` call.
47-
*/
48-
string getKernelMethod() { result = methodName }
4935
}
5036

5137
/**
@@ -110,7 +96,7 @@ module Kernel {
11096
* Ruby documentation: https://docs.ruby-lang.org/en/3.0.0/Kernel.html#method-i-system
11197
*/
11298
class KernelSystemCall extends SystemCommandExecution::Range instanceof KernelMethodCall {
113-
KernelSystemCall() { this.getKernelMethod() = "system" }
99+
KernelSystemCall() { this.getMethodName() = "system" }
114100

115101
override DataFlow::Node getAnArgument() { result = super.getArgument(_) }
116102

@@ -126,7 +112,7 @@ module Kernel {
126112
* Ruby documentation: https://docs.ruby-lang.org/en/3.0.0/Kernel.html#method-i-exec
127113
*/
128114
class KernelExecCall extends SystemCommandExecution::Range instanceof KernelMethodCall {
129-
KernelExecCall() { this.getKernelMethod() = "exec" }
115+
KernelExecCall() { this.getMethodName() = "exec" }
130116

131117
override DataFlow::Node getAnArgument() { result = super.getArgument(_) }
132118

@@ -147,7 +133,7 @@ module Kernel {
147133
* ```
148134
*/
149135
class KernelSpawnCall extends SystemCommandExecution::Range instanceof KernelMethodCall {
150-
KernelSpawnCall() { this.getKernelMethod() = "spawn" }
136+
KernelSpawnCall() { this.getMethodName() = "spawn" }
151137

152138
override DataFlow::Node getAnArgument() { result = super.getArgument(_) }
153139

@@ -166,7 +152,7 @@ module Kernel {
166152
* ```
167153
*/
168154
class EvalCallCodeExecution extends CodeExecution::Range, KernelMethodCall {
169-
EvalCallCodeExecution() { this.getKernelMethod() = "eval" }
155+
EvalCallCodeExecution() { this.getMethodName() = "eval" }
170156

171157
override DataFlow::Node getCode() { result = this.getArgument(0) }
172158
}
@@ -180,7 +166,7 @@ module Kernel {
180166
* ```
181167
*/
182168
class SendCallCodeExecution extends CodeExecution::Range, KernelMethodCall {
183-
SendCallCodeExecution() { this.getKernelMethod() = "send" }
169+
SendCallCodeExecution() { this.getMethodName() = "send" }
184170

185171
override DataFlow::Node getCode() { result = this.getArgument(0) }
186172

@@ -200,15 +186,15 @@ module Kernel {
200186
/** A call to e.g. `Kernel.load` that accesses a file. */
201187
private class KernelFileAccess extends FileSystemAccess::Range instanceof KernelMethodCall {
202188
KernelFileAccess() {
203-
super.getKernelMethod() = ["load", "require", "require_relative", "autoload", "autoload?"]
189+
super.getMethodName() = ["load", "require", "require_relative", "autoload", "autoload?"]
204190
}
205191

206192
override DataFlow::Node getAPathArgument() {
207193
result = super.getArgument(0) and
208-
super.getKernelMethod() = ["load", "require", "require_relative"]
194+
super.getMethodName() = ["load", "require", "require_relative"]
209195
or
210196
result = super.getArgument(1) and
211-
super.getKernelMethod() = ["autoload", "autoload?"]
197+
super.getMethodName() = ["autoload", "autoload?"]
212198
}
213199
}
214200
}

ruby/ql/lib/codeql/ruby/frameworks/core/internal/IOOrFile.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ DataFlow::Node fileInstanceInstantiation() {
2929
result = API::getTopLevelMember("File").getAMethodCall(["open", "try_convert"])
3030
or
3131
// Calls to `Kernel.open` can yield `File` instances
32-
result.(KernelMethodCall).getKernelMethod() = "open" and
32+
result.(KernelMethodCall).getMethodName() = "open" and
3333
// Assume that calls that don't invoke shell commands will instead open
3434
// a file.
3535
not pathArgSpawnsSubprocess(result.(KernelMethodCall).getArgument(0).asExpr().getExpr())

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class AmbiguousPathCall extends DataFlow::CallNode {
1313
string name;
1414

1515
AmbiguousPathCall() {
16-
this.(KernelMethodCall).getKernelMethod() = "open" and
16+
this.(KernelMethodCall).getMethodName() = "open" and
1717
name = "Kernel.open"
1818
or
1919
this = API::getTopLevelMember("IO").getAMethodCall("read") and

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ module StackTraceExposure {
4242
* A call to `Kernel#caller`, considered as a flow source.
4343
*/
4444
class KernelCallerCall extends Source instanceof Kernel::KernelMethodCall {
45-
KernelCallerCall() { super.getKernelMethod() = "caller" }
45+
KernelCallerCall() { super.getMethodName() = "caller" }
4646
}
4747

4848
/**

0 commit comments

Comments
 (0)