@@ -37,7 +37,9 @@ module DecompressionBombs {
37
37
abstract class Sink extends DataFlow:: Node { }
38
38
39
39
/**
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.
41
43
*/
42
44
module DataDogZstd {
43
45
class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -60,7 +62,9 @@ module DecompressionBombs {
60
62
}
61
63
62
64
/**
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.
64
68
*/
65
69
module KlauspostZstd {
66
70
class TheSink extends Sink {
@@ -155,7 +159,9 @@ module DecompressionBombs {
155
159
}
156
160
157
161
/**
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.
159
165
*/
160
166
module UlikunitzXz {
161
167
class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -177,7 +183,9 @@ module DecompressionBombs {
177
183
}
178
184
179
185
/**
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.
181
189
*/
182
190
module CompressGzipBombs {
183
191
class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -200,9 +208,11 @@ module DecompressionBombs {
200
208
}
201
209
202
210
/**
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.
204
214
*/
205
- module KlauspostGzipAndPgzip {
215
+ module KlauspostPgzip {
206
216
class TheAdditionalTaintStep extends AdditionalTaintStep {
207
217
TheAdditionalTaintStep ( ) { this = "AdditionalTaintStep" }
208
218
@@ -216,7 +226,24 @@ module DecompressionBombs {
216
226
toNode = call .getResult ( 0 ) and
217
227
fromState = "" and
218
228
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 |
220
247
f .hasQualifiedName ( "github.com/klauspost/compress/gzip" , "NewReader" ) and
221
248
call = f .getACall ( ) and
222
249
fromNode = call .getArgument ( 0 ) and
@@ -229,7 +256,9 @@ module DecompressionBombs {
229
256
}
230
257
231
258
/**
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.
233
262
*/
234
263
module CompressBzip2 {
235
264
class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -252,7 +281,9 @@ module DecompressionBombs {
252
281
}
253
282
254
283
/**
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.
256
287
*/
257
288
module DsnetBzip2 {
258
289
class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -275,7 +306,9 @@ module DecompressionBombs {
275
306
}
276
307
277
308
/**
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.
279
312
*/
280
313
module DsnetFlate {
281
314
class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -298,21 +331,11 @@ module DecompressionBombs {
298
331
}
299
332
300
333
/**
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.
302
337
*/
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 {
316
339
class TheAdditionalTaintStep extends AdditionalTaintStep {
317
340
TheAdditionalTaintStep ( ) { this = "AdditionalTaintStep" }
318
341
@@ -333,21 +356,11 @@ module DecompressionBombs {
333
356
}
334
357
335
358
/**
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.
337
362
*/
338
363
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
-
351
364
class TheAdditionalTaintStep extends AdditionalTaintStep {
352
365
TheAdditionalTaintStep ( ) { this = "AdditionalTaintStep" }
353
366
@@ -368,7 +381,9 @@ module DecompressionBombs {
368
381
}
369
382
370
383
/**
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.
372
387
*/
373
388
module KlauspostZlib {
374
389
class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -391,7 +406,9 @@ module DecompressionBombs {
391
406
}
392
407
393
408
/**
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.
395
412
*/
396
413
module CompressZlibBombs {
397
414
class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -414,7 +431,9 @@ module DecompressionBombs {
414
431
}
415
432
416
433
/**
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.
418
437
*/
419
438
module GolangSnappy {
420
439
class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -437,7 +456,9 @@ module DecompressionBombs {
437
456
}
438
457
439
458
/**
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.
441
462
*/
442
463
module KlauspostSnappy {
443
464
class TheAdditionalTaintStep extends AdditionalTaintStep {
@@ -460,7 +481,9 @@ module DecompressionBombs {
460
481
}
461
482
462
483
/**
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.
464
487
*/
465
488
module KlauspostS2 {
466
489
class TheSink extends Sink {
@@ -497,61 +520,57 @@ module DecompressionBombs {
497
520
/**
498
521
* Provides decompression bomb sinks for packages that use some standard IO interfaces/methods for reading decompressed data
499
522
*/
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
+ )
555
574
}
556
575
}
557
576
0 commit comments