@@ -16,7 +16,6 @@ import codeql.ruby.ApiGraphs
1616import codeql.ruby.DataFlow
1717import codeql.ruby.dataflow.RemoteFlowSources
1818import codeql.ruby.TaintTracking
19- import DataFlow:: PathGraph
2019
2120class 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 )
4950select 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