Skip to content

Commit c5dc877

Browse files
authored
Increased query robustness and test coverage
1 parent 09f0820 commit c5dc877

File tree

3 files changed

+37
-3
lines changed

3 files changed

+37
-3
lines changed

ruby/ql/src/experimental/decompression-api/DecompressionAPI.ql

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@ class DecompressionAPIUse extends DataFlow::Node {
2222
// this should find the first argument of Zlib::Inflate.inflate or Zip::File.extract
2323
DecompressionAPIUse() {
2424
this = API::getTopLevelMember("Zlib").getMember("Inflate").getAMethodCall("inflate").getArgument(0) or
25-
this = API::getTopLevelMember("Zip").getMember("File").getAMethodCall("extract").getArgument(0)
25+
this = API::getTopLevelMember("Zip").getMember("File").getAMethodCall("open").getArgument(0) or
26+
this = API::getTopLevelMember("Zip").getMember("Entry").getAMethodCall("extract").getArgument(0)
2627
}
28+
2729
}
2830

2931
class Configuration extends TaintTracking::Configuration {
30-
Configuration() { this = "DecompressionAPI" }
32+
Configuration() { this = "DecompressionAPIUse" }
3133

3234
// this predicate will be used to contstrain our query to find instances where only remote user-controlled data flows to the sink
3335
override predicate isSource(DataFlow::Node source) {
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
edges
22
| decompression_api.rb:3:31:3:36 | call to params : | decompression_api.rb:3:31:3:43 | ...[...] |
33
| decompression_api.rb:12:35:12:40 | call to params : | decompression_api.rb:12:35:12:47 | ...[...] |
4+
| decompression_api.rb:17:27:17:32 | call to params : | decompression_api.rb:17:27:17:39 | ...[...] |
5+
| decompression_api.rb:26:31:26:36 | call to params : | decompression_api.rb:26:31:26:43 | ...[...] |
46
nodes
57
| decompression_api.rb:3:31:3:36 | call to params : | semmle.label | call to params : |
68
| decompression_api.rb:3:31:3:43 | ...[...] | semmle.label | ...[...] |
79
| decompression_api.rb:12:35:12:40 | call to params : | semmle.label | call to params : |
810
| decompression_api.rb:12:35:12:47 | ...[...] | semmle.label | ...[...] |
11+
| decompression_api.rb:17:27:17:32 | call to params : | semmle.label | call to params : |
12+
| decompression_api.rb:17:27:17:39 | ...[...] | semmle.label | ...[...] |
13+
| decompression_api.rb:26:31:26:36 | call to params : | semmle.label | call to params : |
14+
| decompression_api.rb:26:31:26:43 | ...[...] | semmle.label | ...[...] |
915
subpaths
1016
#select
1117
| decompression_api.rb:3:31:3:43 | ...[...] | decompression_api.rb:3:31:3:36 | call to params : | decompression_api.rb:3:31:3:43 | ...[...] | This call to $@ is unsafe because user-controlled data is used to set the object being decompressed, which could lead to a denial of service attack or malicious code extracted from an unknown source. |
1218
| decompression_api.rb:12:35:12:47 | ...[...] | decompression_api.rb:12:35:12:40 | call to params : | decompression_api.rb:12:35:12:47 | ...[...] | This call to $@ is unsafe because user-controlled data is used to set the object being decompressed, which could lead to a denial of service attack or malicious code extracted from an unknown source. |
19+
| decompression_api.rb:17:27:17:39 | ...[...] | decompression_api.rb:17:27:17:32 | call to params : | decompression_api.rb:17:27:17:39 | ...[...] | This call to $@ is unsafe because user-controlled data is used to set the object being decompressed, which could lead to a denial of service attack or malicious code extracted from an unknown source. |
20+
| decompression_api.rb:26:31:26:43 | ...[...] | decompression_api.rb:26:31:26:36 | call to params : | decompression_api.rb:26:31:26:43 | ...[...] | This call to $@ is unsafe because user-controlled data is used to set the object being decompressed, which could lead to a denial of service attack or malicious code extracted from an unknown source. |

ruby/ql/test/query-tests/security/decompression-api/decompression_api.rb

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,32 @@ def safe_zlib_unzip
77
Zlib::Inflate.inflate("testfile.gz")
88
end
99

10+
11+
DECOMPRESSION_LIB = Zlib
12+
def unsafe_zlib_unzip_const
13+
DECOMPRESSION_LIB::Inflate.inflate(params[:path])
14+
end
15+
16+
def unsafe_zlib_unzip
17+
Zip::File.open(params[:file]) do |zip_file|
18+
zip_file.each do |entry|
19+
entry.extract(entry.name)
20+
end
21+
end
22+
end
23+
24+
def safe_zlib_unzip
25+
Zip::Entry.extract("testfile.gz")
26+
end
27+
1028
def sanitized_zlib_unzip
11-
if params[:path].in ["safe_file1.gz", "safe_file2.gz"]
29+
if "safe_file.gz" == params[:path]
30+
Zlib::Inflate.inflate(params[:path])
31+
end
32+
end
33+
34+
def sanitized_array_zlib_unzip
35+
if ["safe_file1.gz", "safe_file2.gz"].include? params[:path]
1236
Zlib::Inflate.inflate(params[:path])
1337
end
1438
end

0 commit comments

Comments
 (0)