diff --git a/ql/src/semmle/go/frameworks/Stdlib.qll b/ql/src/semmle/go/frameworks/Stdlib.qll index 1c89ecf540e..34b576574ad 100644 --- a/ql/src/semmle/go/frameworks/Stdlib.qll +++ b/ql/src/semmle/go/frameworks/Stdlib.qll @@ -20,6 +20,7 @@ import semmle.go.frameworks.stdlib.EncodingAscii85 import semmle.go.frameworks.stdlib.EncodingAsn1 import semmle.go.frameworks.stdlib.EncodingBase32 import semmle.go.frameworks.stdlib.EncodingBase64 +import semmle.go.frameworks.stdlib.EncodingBinary 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/EncodingBinary.qll b/ql/src/semmle/go/frameworks/stdlib/EncodingBinary.qll new file mode 100644 index 00000000000..71c3c55987b --- /dev/null +++ b/ql/src/semmle/go/frameworks/stdlib/EncodingBinary.qll @@ -0,0 +1,27 @@ +/** + * Provides classes modeling security-relevant aspects of the `encoding/binary` package. + */ + +import go + +/** Provides models of commonly used functions in the `encoding/binary` package. */ +module EncodingBinary { + private class FunctionModels extends TaintTracking::FunctionModel { + FunctionInput inp; + FunctionOutput outp; + + FunctionModels() { + // signature: func Read(r io.Reader, order ByteOrder, data interface{}) error + hasQualifiedName("encoding/binary", "Read") and + (inp.isParameter(0) and outp.isParameter(2)) + or + // signature: func Write(w io.Writer, order ByteOrder, data interface{}) error + hasQualifiedName("encoding/binary", "Write") and + (inp.isParameter(2) 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/EncodingBinary.go b/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/EncodingBinary.go new file mode 100644 index 00000000000..9a6300eaf30 --- /dev/null +++ b/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/EncodingBinary.go @@ -0,0 +1,35 @@ +// Code generated by https://github.com/gagliardetto/codebox. DO NOT EDIT. + +package main + +import ( + "encoding/binary" + "io" +) + +func TaintStepTest_EncodingBinaryRead_B0I0O0(sourceCQL interface{}) interface{} { + fromReader656 := sourceCQL.(io.Reader) + var intoInterface414 interface{} + binary.Read(fromReader656, nil, intoInterface414) + return intoInterface414 +} + +func TaintStepTest_EncodingBinaryWrite_B0I0O0(sourceCQL interface{}) interface{} { + fromInterface518 := sourceCQL.(interface{}) + var intoWriter650 io.Writer + binary.Write(intoWriter650, nil, fromInterface518) + return intoWriter650 +} + +func RunAllTaints_EncodingBinary() { + { + source := newSource(0) + out := TaintStepTest_EncodingBinaryRead_B0I0O0(source) + sink(0, out) + } + { + source := newSource(1) + out := TaintStepTest_EncodingBinaryWrite_B0I0O0(source) + sink(1, out) + } +}