Skip to content

Commit 19d2b49

Browse files
committed
drive-by: make Base64.decode64(..) into a flowsummary that is shared with all queries
1 parent 1a27441 commit 19d2b49

File tree

5 files changed

+32
-27
lines changed

5 files changed

+32
-27
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import core.String
1616
import core.Regexp
1717
import core.IO
1818
import core.Digest
19+
import core.Base64
1920

2021
/**
2122
* A system command executed via subshell literal syntax.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* Provides modeling for the `Base64` module.
3+
*/
4+
5+
private import ruby
6+
private import codeql.ruby.dataflow.FlowSummary
7+
private import codeql.ruby.ApiGraphs
8+
9+
private class Base64Decode extends SummarizedCallable {
10+
Base64Decode() { this = "Base64.decode64()" }
11+
12+
override MethodCall getACall() {
13+
result =
14+
API::getTopLevelMember("Base64")
15+
.getAMethodCall(["decode64", "strict_decode64", "urlsafe_decode64"])
16+
.asExpr()
17+
.getExpr()
18+
}
19+
20+
override predicate propagatesFlowExt(string input, string output, boolean preservesValue) {
21+
input = "Argument[0]" and
22+
output = "ReturnValue" and
23+
preservesValue = false
24+
}
25+
}

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

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,6 @@ module UnsafeDeserialization {
3131
*/
3232
abstract class Sanitizer extends DataFlow::Node { }
3333

34-
/**
35-
* Additional taint steps for "unsafe deserialization" vulnerabilities.
36-
*/
37-
predicate isAdditionalTaintStep(DataFlow::Node fromNode, DataFlow::Node toNode) {
38-
base64DecodeTaintStep(fromNode, toNode)
39-
}
40-
4134
/** A source of remote user input, considered as a flow source for unsafe deserialization. */
4235
class RemoteFlowSourceAsSource extends Source instanceof RemoteFlowSource { }
4336

@@ -215,18 +208,4 @@ module UnsafeDeserialization {
215208
)
216209
}
217210
}
218-
219-
/**
220-
* `Base64.decode64` propagates taint from its argument to its return value.
221-
*/
222-
predicate base64DecodeTaintStep(DataFlow::Node fromNode, DataFlow::Node toNode) {
223-
exists(DataFlow::CallNode callNode |
224-
callNode =
225-
API::getTopLevelMember("Base64")
226-
.getAMethodCall(["decode64", "strict_decode64", "urlsafe_decode64"])
227-
|
228-
fromNode = callNode.getArgument(0) and
229-
toNode = callNode
230-
)
231-
}
232211
}

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,4 @@ class Configuration extends TaintTracking::Configuration {
2727
super.isSanitizer(node) or
2828
node instanceof UnsafeDeserialization::Sanitizer
2929
}
30-
31-
override predicate isAdditionalTaintStep(DataFlow::Node fromNode, DataFlow::Node toNode) {
32-
UnsafeDeserialization::isAdditionalTaintStep(fromNode, toNode)
33-
}
3430
}

ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
edges
2+
| UnsafeDeserialization.rb:10:23:10:50 | call to decode64 : | UnsafeDeserialization.rb:11:27:11:41 | serialized_data |
23
| UnsafeDeserialization.rb:10:39:10:44 | call to params : | UnsafeDeserialization.rb:10:39:10:50 | ...[...] : |
3-
| UnsafeDeserialization.rb:10:39:10:50 | ...[...] : | UnsafeDeserialization.rb:11:27:11:41 | serialized_data |
4+
| UnsafeDeserialization.rb:10:39:10:50 | ...[...] : | UnsafeDeserialization.rb:10:23:10:50 | call to decode64 : |
5+
| UnsafeDeserialization.rb:16:23:16:50 | call to decode64 : | UnsafeDeserialization.rb:17:30:17:44 | serialized_data |
46
| UnsafeDeserialization.rb:16:39:16:44 | call to params : | UnsafeDeserialization.rb:16:39:16:50 | ...[...] : |
5-
| UnsafeDeserialization.rb:16:39:16:50 | ...[...] : | UnsafeDeserialization.rb:17:30:17:44 | serialized_data |
7+
| UnsafeDeserialization.rb:16:39:16:50 | ...[...] : | UnsafeDeserialization.rb:16:23:16:50 | call to decode64 : |
68
| UnsafeDeserialization.rb:22:17:22:22 | call to params : | UnsafeDeserialization.rb:22:17:22:28 | ...[...] : |
79
| UnsafeDeserialization.rb:22:17:22:28 | ...[...] : | UnsafeDeserialization.rb:23:24:23:32 | json_data |
810
| UnsafeDeserialization.rb:28:17:28:22 | call to params : | UnsafeDeserialization.rb:28:17:28:28 | ...[...] : |
@@ -19,9 +21,11 @@ edges
1921
| UnsafeDeserialization.rb:87:17:87:22 | call to params : | UnsafeDeserialization.rb:87:17:87:28 | ...[...] : |
2022
| UnsafeDeserialization.rb:87:17:87:28 | ...[...] : | UnsafeDeserialization.rb:88:25:88:33 | yaml_data |
2123
nodes
24+
| UnsafeDeserialization.rb:10:23:10:50 | call to decode64 : | semmle.label | call to decode64 : |
2225
| UnsafeDeserialization.rb:10:39:10:44 | call to params : | semmle.label | call to params : |
2326
| UnsafeDeserialization.rb:10:39:10:50 | ...[...] : | semmle.label | ...[...] : |
2427
| UnsafeDeserialization.rb:11:27:11:41 | serialized_data | semmle.label | serialized_data |
28+
| UnsafeDeserialization.rb:16:23:16:50 | call to decode64 : | semmle.label | call to decode64 : |
2529
| UnsafeDeserialization.rb:16:39:16:44 | call to params : | semmle.label | call to params : |
2630
| UnsafeDeserialization.rb:16:39:16:50 | ...[...] : | semmle.label | ...[...] : |
2731
| UnsafeDeserialization.rb:17:30:17:44 | serialized_data | semmle.label | serialized_data |

0 commit comments

Comments
 (0)