Skip to content

Commit b7e1431

Browse files
committed
Ruby: Model ActionController logger
1 parent 27681ac commit b7e1431

File tree

4 files changed

+46
-0
lines changed

4 files changed

+46
-0
lines changed

ruby/ql/lib/codeql/ruby/frameworks/ActionController.qll

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ private import codeql.ruby.frameworks.ActionDispatch
1212
private import codeql.ruby.frameworks.ActionView
1313
private import codeql.ruby.frameworks.Rails
1414
private import codeql.ruby.frameworks.internal.Rails
15+
private import codeql.ruby.dataflow.internal.DataFlowDispatch
1516

1617
/**
1718
* DEPRECATED: Import `codeql.ruby.frameworks.Rails` and use `Rails::ParamsCall` instead.
@@ -733,3 +734,29 @@ private module Response {
733734
override DataFlow::Node getValue() { result = this.getArgument(0) }
734735
}
735736
}
737+
738+
private class ActionControllerLoggerInstance extends DataFlow::Node {
739+
ActionControllerLoggerInstance() {
740+
this.asExpr().getExpr() instanceof ActionControllerContextCall and
741+
this.(DataFlow::CallNode).getMethodName() = "logger"
742+
or
743+
any(ActionControllerLoggerInstance i).(DataFlow::LocalSourceNode).flowsTo(this)
744+
}
745+
}
746+
747+
private class ActionControllerLoggingCall extends DataFlow::CallNode, Logging::Range {
748+
ActionControllerLoggingCall() {
749+
this.getReceiver() instanceof ActionControllerLoggerInstance and
750+
this.getMethodName() = ["debug", "error", "fatal", "info", "unknown", "warn"]
751+
}
752+
753+
// Note: this is identical to the definition `stdlib.Logger.LoggerInfoStyleCall`.
754+
override DataFlow::Node getAnInput() {
755+
// `msg` from `Logger#info(msg)`,
756+
// or `progname` from `Logger#info(progname) <block>`
757+
result = this.getArgument(0)
758+
or
759+
// a return value from the block in `Logger#info(progname) <block>`
760+
exprNodeReturnedFrom(result, this.getBlock().asExpr().getExpr())
761+
}
762+
}

ruby/ql/test/library-tests/frameworks/action_controller/ActionController.expected

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ actionControllerControllerClasses
66
| controllers/tags_controller.rb:1:1:2:3 | TagsController |
77
| controllers/users/notifications_controller.rb:2:3:5:5 | NotificationsController |
88
| input_access.rb:1:1:50:3 | UsersController |
9+
| logging.rb:1:1:9:3 | UsersController |
910
| params_flow.rb:1:1:151:3 | MyController |
1011
actionControllerActionMethods
1112
| controllers/comments_controller.rb:2:3:36:5 | index |
@@ -22,6 +23,7 @@ actionControllerActionMethods
2223
| controllers/posts_controller.rb:8:3:9:5 | upvote |
2324
| controllers/users/notifications_controller.rb:3:5:4:7 | mark_as_read |
2425
| input_access.rb:2:3:49:5 | index |
26+
| logging.rb:2:5:8:7 | index |
2527
| params_flow.rb:2:3:4:5 | m1 |
2628
| params_flow.rb:6:3:8:5 | m2 |
2729
| params_flow.rb:10:3:12:5 | m2 |
@@ -201,6 +203,7 @@ httpInputAccesses
201203
| input_access.rb:43:5:43:20 | call to raw_post | ActionDispatch::Request#raw_post |
202204
| input_access.rb:45:5:45:30 | ...[...] | ActionDispatch::Request#env[] |
203205
| input_access.rb:47:5:47:39 | ...[...] | ActionDispatch::Request#env[] |
206+
| logging.rb:5:22:5:35 | call to params | ActionDispatch::Request#params |
204207
| params_flow.rb:3:10:3:15 | call to params | ActionController::Metal#params |
205208
| params_flow.rb:7:10:7:15 | call to params | ActionController::Metal#params |
206209
| params_flow.rb:11:10:11:15 | call to params | ActionController::Metal#params |
@@ -270,3 +273,8 @@ headerWriteAccesses
270273
| controllers/comments_controller.rb:33:5:33:26 | call to last_modified= | last-modified | controllers/comments_controller.rb:33:30:33:43 | ... = ... |
271274
| controllers/comments_controller.rb:34:5:34:22 | call to weak_etag= | etag | controllers/comments_controller.rb:34:26:34:32 | ... = ... |
272275
| controllers/comments_controller.rb:35:5:35:24 | call to strong_etag= | etag | controllers/comments_controller.rb:35:28:35:34 | ... = ... |
276+
loggingCalls
277+
| logging.rb:3:9:3:31 | call to info | logging.rb:3:21:3:31 | "some info" |
278+
| logging.rb:4:9:4:31 | call to warn | logging.rb:4:21:4:31 | "a warning" |
279+
| logging.rb:5:9:5:35 | call to debug | logging.rb:5:22:5:35 | call to params |
280+
| logging.rb:7:9:7:26 | call to info | logging.rb:7:16:7:26 | "more info" |

ruby/ql/test/library-tests/frameworks/action_controller/ActionController.ql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,5 @@ query predicate headerWriteAccesses(
3838
) {
3939
name = a.getName() and value = a.getValue()
4040
}
41+
42+
query predicate loggingCalls(Logging c, DataFlow::Node input) { input = c.getAnInput() }
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class UsersController < ActionController::Base
2+
def index
3+
logger.info "some info"
4+
logger.warn "a warning"
5+
logger.debug request.params
6+
l = logger
7+
l.info "more info"
8+
end
9+
end

0 commit comments

Comments
 (0)