From 412ba1263bdaad8aab547a143efce10893fc559e Mon Sep 17 00:00:00 2001 From: Slavomir Date: Sun, 6 Sep 2020 18:06:39 +0200 Subject: [PATCH] Add taint-tracking for `encoding/ascii85` --- ql/src/semmle/go/frameworks/Stdlib.qll | 1 + .../go/frameworks/stdlib/EncodingAscii85.qll | 35 +++++++++++ .../StdlibTaintFlow/EncodingAscii85.go | 59 +++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 ql/src/semmle/go/frameworks/stdlib/EncodingAscii85.qll create mode 100644 ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/EncodingAscii85.go diff --git a/ql/src/semmle/go/frameworks/Stdlib.qll b/ql/src/semmle/go/frameworks/Stdlib.qll index 6de114d1735..8c62bda1a1d 100644 --- a/ql/src/semmle/go/frameworks/Stdlib.qll +++ b/ql/src/semmle/go/frameworks/Stdlib.qll @@ -16,6 +16,7 @@ import semmle.go.frameworks.stdlib.Mime import semmle.go.frameworks.stdlib.MimeMultipart import semmle.go.frameworks.stdlib.MimeQuotedprintable import semmle.go.frameworks.stdlib.Encoding +import semmle.go.frameworks.stdlib.EncodingAscii85 import semmle.go.frameworks.stdlib.Path import semmle.go.frameworks.stdlib.PathFilepath import semmle.go.frameworks.stdlib.Reflect diff --git a/ql/src/semmle/go/frameworks/stdlib/EncodingAscii85.qll b/ql/src/semmle/go/frameworks/stdlib/EncodingAscii85.qll new file mode 100644 index 00000000000..cb039ab4c0b --- /dev/null +++ b/ql/src/semmle/go/frameworks/stdlib/EncodingAscii85.qll @@ -0,0 +1,35 @@ +/** + * Provides classes modeling security-relevant aspects of the `encoding/ascii85` package. + */ + +import go + +/** Provides models of commonly used functions in the `encoding/ascii85` package. */ +module EncodingAscii85 { + private class FunctionModels extends TaintTracking::FunctionModel { + FunctionInput inp; + FunctionOutput outp; + + FunctionModels() { + // signature: func Decode(dst []byte, src []byte, flush bool) (ndst int, nsrc int, err error) + hasQualifiedName("encoding/ascii85", "Decode") and + (inp.isParameter(1) and outp.isParameter(0)) + or + // signature: func Encode(dst []byte, src []byte) int + hasQualifiedName("encoding/ascii85", "Encode") and + (inp.isParameter(1) and outp.isParameter(0)) + or + // signature: func NewDecoder(r io.Reader) io.Reader + hasQualifiedName("encoding/ascii85", "NewDecoder") and + (inp.isParameter(0) and outp.isResult()) + or + // signature: func NewEncoder(w io.Writer) io.WriteCloser + hasQualifiedName("encoding/ascii85", "NewEncoder") and + (inp.isResult() and outp.isParameter(0)) + } + + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { + input = inp and output = outp + } + } +} diff --git a/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/EncodingAscii85.go b/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/EncodingAscii85.go new file mode 100644 index 00000000000..1bd73a0649d --- /dev/null +++ b/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/EncodingAscii85.go @@ -0,0 +1,59 @@ +// Code generated by https://github.com/gagliardetto/codebox. DO NOT EDIT. + +package main + +import ( + "encoding/ascii85" + "io" +) + +func TaintStepTest_EncodingAscii85Decode_B0I0O0(sourceCQL interface{}) interface{} { + fromByte656 := sourceCQL.([]byte) + var intoByte414 []byte + ascii85.Decode(intoByte414, fromByte656, false) + return intoByte414 +} + +func TaintStepTest_EncodingAscii85Encode_B0I0O0(sourceCQL interface{}) interface{} { + fromByte518 := sourceCQL.([]byte) + var intoByte650 []byte + ascii85.Encode(intoByte650, fromByte518) + return intoByte650 +} + +func TaintStepTest_EncodingAscii85NewDecoder_B0I0O0(sourceCQL interface{}) interface{} { + fromReader784 := sourceCQL.(io.Reader) + intoReader957 := ascii85.NewDecoder(fromReader784) + return intoReader957 +} + +func TaintStepTest_EncodingAscii85NewEncoder_B0I0O0(sourceCQL interface{}) interface{} { + fromWriteCloser520 := sourceCQL.(io.WriteCloser) + var intoWriter443 io.Writer + intermediateCQL := ascii85.NewEncoder(intoWriter443) + link(fromWriteCloser520, intermediateCQL) + return intoWriter443 +} + +func RunAllTaints_EncodingAscii85() { + { + source := newSource(0) + out := TaintStepTest_EncodingAscii85Decode_B0I0O0(source) + sink(0, out) + } + { + source := newSource(1) + out := TaintStepTest_EncodingAscii85Encode_B0I0O0(source) + sink(1, out) + } + { + source := newSource(2) + out := TaintStepTest_EncodingAscii85NewDecoder_B0I0O0(source) + sink(2, out) + } + { + source := newSource(3) + out := TaintStepTest_EncodingAscii85NewEncoder_B0I0O0(source) + sink(3, out) + } +}