Skip to content

Commit 43df6a2

Browse files
committed
add comments for already implemented io.Read and io.WriteTo Sinks.
remove some sinks about `"decompressor"` which was added wrongly. change `GeneralReadIoSink` type from module to class. separate `KlauspostGzipAndPgzip` `KlauspostPgzip` and `KlauspostGzip`.
1 parent 66130d2 commit 43df6a2

File tree

1 file changed

+116
-97
lines changed

1 file changed

+116
-97
lines changed

go/ql/src/experimental/frameworks/DecompressionBombsCustomizations.qll

Lines changed: 116 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)