Skip to content

Commit e9277a5

Browse files
committed
Ruby: Add sinks from external models
1 parent ad60834 commit e9277a5

File tree

5 files changed

+27
-0
lines changed

5 files changed

+27
-0
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ private import codeql.ruby.Concepts
44
private import codeql.ruby.Frameworks
55
private import codeql.ruby.dataflow.RemoteFlowSources
66
private import codeql.ruby.dataflow.BarrierGuards
7+
private import codeql.ruby.frameworks.data.internal.ApiGraphModels
78

89
/**
910
* Provides default sources, sinks and sanitizers for detecting
@@ -156,4 +157,8 @@ module CodeInjection {
156157

157158
override FlowState::State getAState() { result instanceof FlowState::Full }
158159
}
160+
161+
private class ExternalCodeInjectionSink extends Sink {
162+
ExternalCodeInjectionSink() { this = ModelOutput::getASinkNode("code-injection").asSink() }
163+
}
159164
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ private import codeql.ruby.dataflow.RemoteFlowSources
99
private import codeql.ruby.Concepts
1010
private import codeql.ruby.Frameworks
1111
private import codeql.ruby.ApiGraphs
12+
private import codeql.ruby.frameworks.data.internal.ApiGraphModels
1213

1314
module CommandInjection {
1415
/**
@@ -52,4 +53,10 @@ module CommandInjection {
5253
this.(DataFlow::CallNode).getMethodName() = "shellescape"
5354
}
5455
}
56+
57+
private class ExternalCommandInjectionSink extends Sink {
58+
ExternalCommandInjectionSink() {
59+
this = ModelOutput::getASinkNode("command-injection").asSink()
60+
}
61+
}
5562
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import codeql.ruby.DataFlow
88
import codeql.ruby.TaintTracking
99
import codeql.ruby.dataflow.RemoteFlowSources
1010
import codeql.ruby.frameworks.Core
11+
private import codeql.ruby.frameworks.data.internal.ApiGraphModels
1112

1213
/**
1314
* A data flow source for user input used in log entries.
@@ -50,6 +51,10 @@ class LoggingSink extends Sink {
5051
LoggingSink() { this = any(Logging logging).getAnInput() }
5152
}
5253

54+
private class ExternalLogInjectionSink extends Sink {
55+
ExternalLogInjectionSink() { this = ModelOutput::getASinkNode("log-injection").asSink() }
56+
}
57+
5358
/**
5459
* A call to `String#replace` that replaces `\n` is considered to sanitize the replaced string (reduce false positive).
5560
*/

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ private import codeql.ruby.Concepts
1111
private import codeql.ruby.DataFlow
1212
private import codeql.ruby.dataflow.BarrierGuards
1313
private import codeql.ruby.dataflow.RemoteFlowSources
14+
private import codeql.ruby.frameworks.data.internal.ApiGraphModels
1415

1516
module PathInjection {
1617
/**
@@ -52,4 +53,8 @@ module PathInjection {
5253
class StringConstArrayInclusionCallAsSanitizer extends Sanitizer,
5354
StringConstArrayInclusionCallBarrier
5455
{ }
56+
57+
private class ExternalPathInjectionSink extends Sink {
58+
ExternalPathInjectionSink() { this = ModelOutput::getASinkNode("path-injection").asSink() }
59+
}
5560
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ private import codeql.ruby.dataflow.RemoteFlowSources
1111
private import codeql.ruby.dataflow.BarrierGuards
1212
private import codeql.ruby.dataflow.Sanitizers
1313
private import codeql.ruby.frameworks.ActionController
14+
private import codeql.ruby.frameworks.data.internal.ApiGraphModels
1415

1516
/**
1617
* Provides default sources, sinks and sanitizers for detecting
@@ -73,6 +74,10 @@ module UrlRedirect {
7374
}
7475
}
7576

77+
private class ExternalUrlRedirectSink extends Sink {
78+
ExternalUrlRedirectSink() { this = ModelOutput::getASinkNode("url-redirect").asSink() }
79+
}
80+
7681
/**
7782
* A comparison with a constant string, considered as a sanitizer-guard.
7883
*/

0 commit comments

Comments
 (0)