@@ -37,7 +37,9 @@ module DecompressionBombs {
3737 abstract class Sink extends DataFlow:: Node { }
3838
3939 /**
40- * Provides decompression bomb sinks and additional flow steps for `github.com/DataDog/zstd` package
40+ * Provides decompression bomb sinks and additional flow steps for `github.com/DataDog/zstd` package.
41+ *
42+ * `Reader.Read` already modeled.
4143 */
4244 module DataDogZstd {
4345 class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -60,7 +62,9 @@ module DecompressionBombs {
6062 }
6163
6264 /**
63- * Provides decompression bomb sinks and additional flow steps for `github.com/klauspost/compress/zstd` package
65+ * Provides decompression bomb sinks and additional flow steps for `github.com/klauspost/compress/zstd` package.
66+ *
67+ * `Reader.Read`, `Reader.WriteTo` already modeled.
6468 */
6569 module KlauspostZstd {
6670 class TheSink extends Sink {
@@ -155,7 +159,9 @@ module DecompressionBombs {
155159 }
156160
157161 /**
158- * Provides decompression bomb sinks and additional flow steps for `github.com/ulikunitz/xz` package
162+ * Provides decompression bomb sinks and additional flow steps for `github.com/ulikunitz/xz` package.
163+ *
164+ * `Reader.Read` already modeled.
159165 */
160166 module UlikunitzXz {
161167 class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -177,7 +183,9 @@ module DecompressionBombs {
177183 }
178184
179185 /**
180- * Provides decompression bomb sinks and additional flow steps for `compress/gzip` package
186+ * Provides decompression bomb sinks and additional flow steps for `compress/gzip` package.
187+ *
188+ * `Reader.Read` already modeled.
181189 */
182190 module CompressGzipBombs {
183191 class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -200,9 +208,11 @@ module DecompressionBombs {
200208 }
201209
202210 /**
203- * Provides decompression bomb sinks and additional flow steps for `github.com/klauspost/compress/gzip` package
211+ * Provides decompression bomb sinks and additional flow steps for `github.com/klauspost/pgzip` package.
212+ *
213+ * `Reader.Read`, `Reader.WriteTo` already modeled.
204214 */
205- module KlauspostGzipAndPgzip {
215+ module KlauspostPgzip {
206216 class TheAdditionalTaintStep extends AdditionalTaintStep {
207217 TheAdditionalTaintStep ( ) { this = "AdditionalTaintStep" }
208218
@@ -216,7 +226,24 @@ module DecompressionBombs {
216226 toNode = call .getResult ( 0 ) and
217227 fromState = "" and
218228 toState = "PgzipNewReader"
219- or
229+ )
230+ }
231+ }
232+ }
233+
234+ /**
235+ * Provides decompression bomb sinks and additional flow steps for `github.com/klauspost/compress/gzip` package.
236+ *
237+ * `Reader.Read`, `Reader.WriteTo` already modeled.
238+ */
239+ module KlauspostGzip {
240+ class TheAdditionalTaintStep extends AdditionalTaintStep {
241+ TheAdditionalTaintStep ( ) { this = "AdditionalTaintStep" }
242+
243+ override predicate isAdditionalFlowStep (
244+ DataFlow:: Node fromNode , FlowState fromState , DataFlow:: Node toNode , FlowState toState
245+ ) {
246+ exists ( Function f , DataFlow:: CallNode call |
220247 f .hasQualifiedName ( "github.com/klauspost/compress/gzip" , "NewReader" ) and
221248 call = f .getACall ( ) and
222249 fromNode = call .getArgument ( 0 ) and
@@ -229,7 +256,9 @@ module DecompressionBombs {
229256 }
230257
231258 /**
232- * Provides decompression bomb sinks and additional flow steps for `compress/bzip2` package
259+ * Provides decompression bomb sinks and additional flow steps for `compress/bzip2` package.
260+ *
261+ * `Reader.Read` already modeled.
233262 */
234263 module CompressBzip2 {
235264 class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -252,7 +281,9 @@ module DecompressionBombs {
252281 }
253282
254283 /**
255- * Provides decompression bomb sinks and additional flow steps for `github.com/dsnet/compress/bzip2` package
284+ * Provides decompression bomb sinks and additional flow steps for `github.com/dsnet/compress/bzip2` package.
285+ *
286+ * `Reader.Read` already modeled.
256287 */
257288 module DsnetBzip2 {
258289 class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -275,7 +306,9 @@ module DecompressionBombs {
275306 }
276307
277308 /**
278- * Provides decompression bomb sinks and additional flow steps for `github.com/dsnet/compress/flate` package
309+ * Provides decompression bomb sinks and additional flow steps for `github.com/dsnet/compress/flate` package.
310+ *
311+ * `Reader.Read` already modeled.
279312 */
280313 module DsnetFlate {
281314 class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -298,21 +331,11 @@ module DecompressionBombs {
298331 }
299332
300333 /**
301- * Provides decompression bomb sinks and additional flow steps for `compress/flate` package
334+ * Provides decompression bomb sinks and additional flow steps for `compress/flate` package.
335+ *
336+ * `Reader.Read` already modeled.
302337 */
303- module CompressFlateBombs {
304- class TheSink extends Sink {
305- TheSink ( ) {
306- exists ( Method m , DataFlow:: CallNode cn |
307- m .hasQualifiedName ( "compress/flate" , "decompressor" , "Read" ) and
308- cn = m .getACall ( )
309- |
310- this = cn .getReceiver ( ) and
311- not hasFlowToComparison ( cn .getResult ( 0 ) )
312- )
313- }
314- }
315-
338+ module CompressFlate {
316339 class TheAdditionalTaintStep extends AdditionalTaintStep {
317340 TheAdditionalTaintStep ( ) { this = "AdditionalTaintStep" }
318341
@@ -333,21 +356,11 @@ module DecompressionBombs {
333356 }
334357
335358 /**
336- * Provides decompression bomb sinks and additional flow steps for `github.com/klauspost/compress/flate` package
359+ * Provides decompression bomb sinks and additional flow steps for `github.com/klauspost/compress/flate` package.
360+ *
361+ * `Reader.Read` already modeled.
337362 */
338363 module KlauspostFlate {
339- class TheSink extends Sink {
340- TheSink ( ) {
341- exists ( Method m , DataFlow:: CallNode cn |
342- m .hasQualifiedName ( "github.com/klauspost/compress/flate" , "decompressor" , "Read" ) and
343- cn = m .getACall ( )
344- |
345- this = cn .getReceiver ( ) and
346- not hasFlowToComparison ( cn .getResult ( 0 ) )
347- )
348- }
349- }
350-
351364 class TheAdditionalTaintStep extends AdditionalTaintStep {
352365 TheAdditionalTaintStep ( ) { this = "AdditionalTaintStep" }
353366
@@ -368,7 +381,9 @@ module DecompressionBombs {
368381 }
369382
370383 /**
371- * Provides decompression bomb sinks and additional flow steps for `github.com/klauspost/compress/zlib` package
384+ * Provides decompression bomb sinks and additional flow steps for `github.com/klauspost/compress/zlib` package.
385+ *
386+ * `Reader.Read` already modeled.
372387 */
373388 module KlauspostZlib {
374389 class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -391,7 +406,9 @@ module DecompressionBombs {
391406 }
392407
393408 /**
394- * Provides decompression bomb sinks and additional flow steps for `compress/zlib` package
409+ * Provides decompression bomb sinks and additional flow steps for `compress/zlib` package.
410+ *
411+ * `Reader.Read` already modeled.
395412 */
396413 module CompressZlibBombs {
397414 class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -414,7 +431,9 @@ module DecompressionBombs {
414431 }
415432
416433 /**
417- * Provides decompression bomb sinks and additional flow steps for `github.com/golang/snappy` package
434+ * Provides decompression bomb sinks and additional flow steps for `github.com/golang/snappy` package.
435+ *
436+ * `Reader.Read`, `Reader.ReadByte` already modeled.
418437 */
419438 module GolangSnappy {
420439 class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -437,7 +456,9 @@ module DecompressionBombs {
437456 }
438457
439458 /**
440- * Provides decompression bombs sinks and additional flow steps for `github.com/klauspost/compress/snappy` package
459+ * Provides decompression bombs sinks and additional flow steps for `github.com/klauspost/compress/snappy` package.
460+ *
461+ * `Reader.Read`, `Reader.ReadByte` already modeled.
441462 */
442463 module KlauspostSnappy {
443464 class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -460,7 +481,9 @@ module DecompressionBombs {
460481 }
461482
462483 /**
463- * Provides decompression bomb sinks and additional flow steps for `github.com/klauspost/compress/s2` package
484+ * Provides decompression bomb sinks and additional flow steps for `github.com/klauspost/compress/s2` package.
485+ *
486+ * `Reader.Read`, `Reader.ReadByte` already modeled.
464487 */
465488 module KlauspostS2 {
466489 class TheSink extends Sink {
@@ -497,61 +520,57 @@ module DecompressionBombs {
497520 /**
498521 * Provides decompression bomb sinks for packages that use some standard IO interfaces/methods for reading decompressed data
499522 */
500- module GeneralReadIoSink {
501- class TheSink extends Sink {
502- TheSink ( ) {
503- exists ( Function f , DataFlow:: CallNode cn |
504- f .hasQualifiedName ( "io" , "CopyN" ) and cn = f .getACall ( )
505- |
506- this = cn .getArgument ( 1 ) and
507- not hasFlowToComparison ( cn .getResult ( 0 ) )
508- )
509- or
510- exists ( Method m , DataFlow:: CallNode cn |
511- (
512- m .implements ( "io" , "Reader" , "Read" ) or
513- m .implements ( "io" , "ByteReader" , "ReadByte" ) or
514- m .implements ( "io" , "WriterTo" , "WriteTo" )
515- ) and
516- cn = m .getACall ( )
517- |
518- this = cn .getReceiver ( ) and
519- not hasFlowToComparison ( cn .getResult ( 0 ) )
520- )
521- or
522- exists ( Function f | f .hasQualifiedName ( "io" , [ "Copy" , "CopyBuffer" ] ) |
523- this = f .getACall ( ) .getArgument ( 1 )
524- )
525- or
526- exists ( Function f |
527- f .hasQualifiedName ( "io" , [ "Pipe" , "ReadAll" , "ReadAtLeast" , "ReadFull" ] )
528- |
529- this = f .getACall ( ) .getArgument ( 0 )
530- )
531- or
532- exists ( Method m |
533- m .hasQualifiedName ( "bufio" , "Reader" ,
534- [ "ReadBytes" , "ReadByte" , "ReadLine" , "ReadRune" , "ReadSlice" , "ReadString" ] )
535- |
536- this = m .getACall ( ) .getReceiver ( )
537- )
538- or
539- exists ( Method m , DataFlow:: CallNode cn |
540- m .hasQualifiedName ( "bufio" , "Reader" , [ "Read" , "WriteTo" ] ) and
541- cn = m .getACall ( )
542- |
543- this = cn .getReceiver ( ) and
544- not hasFlowToComparison ( cn .getResult ( 0 ) )
545- )
546- or
547- exists ( Method m | m .hasQualifiedName ( "bufio" , "Scanner" , [ "Text" , "Bytes" ] ) |
548- this = m .getACall ( ) .getReceiver ( )
549- )
550- or
551- exists ( Function f | f .hasQualifiedName ( "io/ioutil" , "ReadAll" ) |
552- this = f .getACall ( ) .getArgument ( 0 )
553- )
554- }
523+ class GeneralReadIoSink extends Sink {
524+ GeneralReadIoSink ( ) {
525+ exists ( Function f , DataFlow:: CallNode cn |
526+ f .hasQualifiedName ( "io" , "CopyN" ) and cn = f .getACall ( )
527+ |
528+ this = cn .getArgument ( 1 ) and
529+ not hasFlowToComparison ( cn .getResult ( 0 ) )
530+ )
531+ or
532+ exists ( Method m , DataFlow:: CallNode cn |
533+ (
534+ m .implements ( "io" , "Reader" , "Read" ) or
535+ m .implements ( "io" , "ByteReader" , "ReadByte" ) or
536+ m .implements ( "io" , "WriterTo" , "WriteTo" )
537+ ) and
538+ cn = m .getACall ( )
539+ |
540+ this = cn .getReceiver ( ) and
541+ not hasFlowToComparison ( cn .getResult ( 0 ) )
542+ )
543+ or
544+ exists ( Function f | f .hasQualifiedName ( "io" , [ "Copy" , "CopyBuffer" ] ) |
545+ this = f .getACall ( ) .getArgument ( 1 )
546+ )
547+ or
548+ exists ( Function f | f .hasQualifiedName ( "io" , [ "Pipe" , "ReadAll" , "ReadAtLeast" , "ReadFull" ] ) |
549+ this = f .getACall ( ) .getArgument ( 0 )
550+ )
551+ or
552+ exists ( Method m |
553+ m .hasQualifiedName ( "bufio" , "Reader" ,
554+ [ "ReadBytes" , "ReadByte" , "ReadLine" , "ReadRune" , "ReadSlice" , "ReadString" ] )
555+ |
556+ this = m .getACall ( ) .getReceiver ( )
557+ )
558+ or
559+ exists ( Method m , DataFlow:: CallNode cn |
560+ m .hasQualifiedName ( "bufio" , "Reader" , [ "Read" , "WriteTo" ] ) and
561+ cn = m .getACall ( )
562+ |
563+ this = cn .getReceiver ( ) and
564+ not hasFlowToComparison ( cn .getResult ( 0 ) )
565+ )
566+ or
567+ exists ( Method m | m .hasQualifiedName ( "bufio" , "Scanner" , [ "Text" , "Bytes" ] ) |
568+ this = m .getACall ( ) .getReceiver ( )
569+ )
570+ or
571+ exists ( Function f | f .hasQualifiedName ( "io/ioutil" , "ReadAll" ) |
572+ this = f .getACall ( ) .getArgument ( 0 )
573+ )
555574 }
556575 }
557576
0 commit comments