Skip to content

Commit 39af2d2

Browse files
committed
Ruby: configsig rb/user-controlled-file-decompression
1 parent cdc788b commit 39af2d2

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import codeql.ruby.ApiGraphs
1616
import codeql.ruby.DataFlow
1717
import codeql.ruby.dataflow.RemoteFlowSources
1818
import codeql.ruby.TaintTracking
19-
import DataFlow::PathGraph
2019

2120
class DecompressionApiUse extends DataFlow::Node {
2221
private DataFlow::CallNode call;
@@ -34,18 +33,20 @@ class DecompressionApiUse extends DataFlow::Node {
3433
DataFlow::CallNode getCall() { result = call }
3534
}
3635

37-
class Configuration extends TaintTracking::Configuration {
38-
Configuration() { this = "DecompressionApiUse" }
39-
36+
private module DecompressionApiConfig implements DataFlow::ConfigSig {
4037
// this predicate will be used to constrain our query to find instances where only remote user-controlled data flows to the sink
41-
override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
38+
predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
4239

4340
// our Decompression APIs defined above will be the sinks we use for this query
44-
override predicate isSink(DataFlow::Node sink) { sink instanceof DecompressionApiUse }
41+
predicate isSink(DataFlow::Node sink) { sink instanceof DecompressionApiUse }
4542
}
4643

47-
from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink
48-
where config.hasFlowPath(source, sink)
44+
private module DecompressionApiFlow = TaintTracking::Global<DecompressionApiConfig>;
45+
46+
private import DecompressionApiFlow::PathGraph
47+
48+
from DecompressionApiFlow::PathNode source, DecompressionApiFlow::PathNode sink
49+
where DecompressionApiFlow::flowPath(source, sink)
4950
select sink.getNode().(DecompressionApiUse), source, sink,
5051
"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.",
5152
sink.getNode().(DecompressionApiUse).getCall(),

0 commit comments

Comments
 (0)