Skip to content

Commit 1a27441

Browse files
committed
drive-by: delete code-execution sinks from unsafe-deserialization, we risked duplicate alerts
1 parent 0e6028a commit 1a27441

File tree

4 files changed

+11
-53
lines changed

4 files changed

+11
-53
lines changed

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

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -229,27 +229,4 @@ module UnsafeDeserialization {
229229
toNode = callNode
230230
)
231231
}
232-
233-
/**
234-
* A argument in a call to `Module.const_get`, considered as a sink for unsafe
235-
* deserialization.
236-
*
237-
* Calls to `Module.const_get` can return arbitrary classes which can then be
238-
* instantiated.
239-
*/
240-
class ConstGetCallArgument extends Sink {
241-
ConstGetCallArgument() { this = any(Module::ModuleConstGetCallCodeExecution c).getCode() }
242-
}
243-
244-
/**
245-
* A argument in a call to `ActiveJob::Serializers.deserialize`, considered as
246-
* a sink for unsafe deserialization.
247-
*
248-
* This is roughly equivalent to a call to `Module.const_get`.
249-
*/
250-
class ActiveJobSerializersDeserializeArgument extends Sink {
251-
ActiveJobSerializersDeserializeArgument() {
252-
this = any(ActiveJob::Serializers::DeserializeCall c).getCode()
253-
}
254-
}
255232
}

ruby/ql/test/library-tests/dataflow/local/TaintStep.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2804,6 +2804,7 @@
28042804
| file://:0:0:0:0 | parameter position 0 of ActionController::Parameters#merge! | file://:0:0:0:0 | [summary] to write: argument self in ActionController::Parameters#merge! |
28052805
| file://:0:0:0:0 | parameter position 0 of ActionController::Parameters#merge! | file://:0:0:0:0 | [summary] to write: return (return) in ActionController::Parameters#merge! |
28062806
| file://:0:0:0:0 | parameter position 0 of Arel.sql | file://:0:0:0:0 | [summary] to write: return (return) in Arel.sql |
2807+
| file://:0:0:0:0 | parameter position 0 of Base64.decode64() | file://:0:0:0:0 | [summary] to write: return (return) in Base64.decode64() |
28072808
| file://:0:0:0:0 | parameter position 0 of File.absolute_path | file://:0:0:0:0 | [summary] to write: return (return) in File.absolute_path |
28082809
| file://:0:0:0:0 | parameter position 0 of File.dirname | file://:0:0:0:0 | [summary] to write: return (return) in File.dirname |
28092810
| file://:0:0:0:0 | parameter position 0 of File.expand_path | file://:0:0:0:0 | [summary] to write: return (return) in File.expand_path |

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

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ edges
1818
| UnsafeDeserialization.rb:81:11:81:22 | ...[...] : | UnsafeDeserialization.rb:82:34:82:36 | xml |
1919
| UnsafeDeserialization.rb:87:17:87:22 | call to params : | UnsafeDeserialization.rb:87:17:87:28 | ...[...] : |
2020
| UnsafeDeserialization.rb:87:17:87:28 | ...[...] : | UnsafeDeserialization.rb:88:25:88:33 | yaml_data |
21-
| UnsafeDeserialization.rb:93:30:93:35 | call to params : | UnsafeDeserialization.rb:93:30:93:43 | ...[...] |
22-
| UnsafeDeserialization.rb:99:48:99:53 | call to params : | UnsafeDeserialization.rb:99:48:99:61 | ...[...] |
2321
nodes
2422
| UnsafeDeserialization.rb:10:39:10:44 | call to params : | semmle.label | call to params : |
2523
| UnsafeDeserialization.rb:10:39:10:50 | ...[...] : | semmle.label | ...[...] : |
@@ -49,15 +47,11 @@ nodes
4947
| UnsafeDeserialization.rb:87:17:87:22 | call to params : | semmle.label | call to params : |
5048
| UnsafeDeserialization.rb:87:17:87:28 | ...[...] : | semmle.label | ...[...] : |
5149
| UnsafeDeserialization.rb:88:25:88:33 | yaml_data | semmle.label | yaml_data |
52-
| UnsafeDeserialization.rb:93:30:93:35 | call to params : | semmle.label | call to params : |
53-
| UnsafeDeserialization.rb:93:30:93:43 | ...[...] | semmle.label | ...[...] |
54-
| UnsafeDeserialization.rb:99:48:99:53 | call to params : | semmle.label | call to params : |
55-
| UnsafeDeserialization.rb:99:48:99:61 | ...[...] | semmle.label | ...[...] |
56-
| UnsafeDeserialization.rb:104:24:104:34 | call to read | semmle.label | call to read |
57-
| UnsafeDeserialization.rb:107:24:107:33 | call to gets | semmle.label | call to gets |
58-
| UnsafeDeserialization.rb:110:24:110:32 | call to read | semmle.label | call to read |
59-
| UnsafeDeserialization.rb:113:24:113:27 | call to gets | semmle.label | call to gets |
60-
| UnsafeDeserialization.rb:116:24:116:32 | call to readlines | semmle.label | call to readlines |
50+
| UnsafeDeserialization.rb:92:24:92:34 | call to read | semmle.label | call to read |
51+
| UnsafeDeserialization.rb:95:24:95:33 | call to gets | semmle.label | call to gets |
52+
| UnsafeDeserialization.rb:98:24:98:32 | call to read | semmle.label | call to read |
53+
| UnsafeDeserialization.rb:101:24:101:27 | call to gets | semmle.label | call to gets |
54+
| UnsafeDeserialization.rb:104:24:104:32 | call to readlines | semmle.label | call to readlines |
6155
subpaths
6256
#select
6357
| UnsafeDeserialization.rb:11:27:11:41 | serialized_data | UnsafeDeserialization.rb:10:39:10:44 | call to params : | UnsafeDeserialization.rb:11:27:11:41 | serialized_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:10:39:10:44 | call to params | user-provided value |
@@ -70,10 +64,8 @@ subpaths
7064
| UnsafeDeserialization.rb:69:23:69:31 | json_data | UnsafeDeserialization.rb:59:17:59:22 | call to params : | UnsafeDeserialization.rb:69:23:69:31 | json_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:59:17:59:22 | call to params | user-provided value |
7165
| UnsafeDeserialization.rb:82:34:82:36 | xml | UnsafeDeserialization.rb:81:11:81:16 | call to params : | UnsafeDeserialization.rb:82:34:82:36 | xml | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:81:11:81:16 | call to params | user-provided value |
7266
| UnsafeDeserialization.rb:88:25:88:33 | yaml_data | UnsafeDeserialization.rb:87:17:87:22 | call to params : | UnsafeDeserialization.rb:88:25:88:33 | yaml_data | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:87:17:87:22 | call to params | user-provided value |
73-
| UnsafeDeserialization.rb:93:30:93:43 | ...[...] | UnsafeDeserialization.rb:93:30:93:35 | call to params : | UnsafeDeserialization.rb:93:30:93:43 | ...[...] | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:93:30:93:35 | call to params | user-provided value |
74-
| UnsafeDeserialization.rb:99:48:99:61 | ...[...] | UnsafeDeserialization.rb:99:48:99:53 | call to params : | UnsafeDeserialization.rb:99:48:99:61 | ...[...] | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:99:48:99:53 | call to params | user-provided value |
75-
| UnsafeDeserialization.rb:104:24:104:34 | call to read | UnsafeDeserialization.rb:104:24:104:34 | call to read | UnsafeDeserialization.rb:104:24:104:34 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:104:24:104:34 | call to read | value from stdin |
76-
| UnsafeDeserialization.rb:107:24:107:33 | call to gets | UnsafeDeserialization.rb:107:24:107:33 | call to gets | UnsafeDeserialization.rb:107:24:107:33 | call to gets | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:107:24:107:33 | call to gets | value from stdin |
77-
| UnsafeDeserialization.rb:110:24:110:32 | call to read | UnsafeDeserialization.rb:110:24:110:32 | call to read | UnsafeDeserialization.rb:110:24:110:32 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:110:24:110:32 | call to read | value from stdin |
78-
| UnsafeDeserialization.rb:113:24:113:27 | call to gets | UnsafeDeserialization.rb:113:24:113:27 | call to gets | UnsafeDeserialization.rb:113:24:113:27 | call to gets | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:113:24:113:27 | call to gets | value from stdin |
79-
| UnsafeDeserialization.rb:116:24:116:32 | call to readlines | UnsafeDeserialization.rb:116:24:116:32 | call to readlines | UnsafeDeserialization.rb:116:24:116:32 | call to readlines | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:116:24:116:32 | call to readlines | value from stdin |
67+
| UnsafeDeserialization.rb:92:24:92:34 | call to read | UnsafeDeserialization.rb:92:24:92:34 | call to read | UnsafeDeserialization.rb:92:24:92:34 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:92:24:92:34 | call to read | value from stdin |
68+
| UnsafeDeserialization.rb:95:24:95:33 | call to gets | UnsafeDeserialization.rb:95:24:95:33 | call to gets | UnsafeDeserialization.rb:95:24:95:33 | call to gets | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:95:24:95:33 | call to gets | value from stdin |
69+
| UnsafeDeserialization.rb:98:24:98:32 | call to read | UnsafeDeserialization.rb:98:24:98:32 | call to read | UnsafeDeserialization.rb:98:24:98:32 | call to read | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:98:24:98:32 | call to read | value from stdin |
70+
| UnsafeDeserialization.rb:101:24:101:27 | call to gets | UnsafeDeserialization.rb:101:24:101:27 | call to gets | UnsafeDeserialization.rb:101:24:101:27 | call to gets | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:101:24:101:27 | call to gets | value from stdin |
71+
| UnsafeDeserialization.rb:104:24:104:32 | call to readlines | UnsafeDeserialization.rb:104:24:104:32 | call to readlines | UnsafeDeserialization.rb:104:24:104:32 | call to readlines | Unsafe deserialization depends on a $@. | UnsafeDeserialization.rb:104:24:104:32 | call to readlines | value from stdin |

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

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -88,18 +88,6 @@ def route11
8888
object = Psych.load yaml_data
8989
end
9090

91-
# BAD - user input determines which class is instantiated
92-
def route12
93-
klass = Module.const_get(params[:class])
94-
object = klass.new
95-
end
96-
97-
# BAD - user input determines which class is instantiated
98-
def route13
99-
klass = ActiveJob::Serializers.deserialize(params[:class])
100-
object = klass.new
101-
end
102-
10391
def stdin
10492
object = YAML.load $stdin.read
10593

0 commit comments

Comments
 (0)