From ec5b63a6a2b6205cc204e9ce856e7517a1b989d2 Mon Sep 17 00:00:00 2001 From: Katie Hockman Date: Tue, 4 Aug 2020 11:45:32 -0400 Subject: [release-branch.go1.13-security] encoding/binary: read at most MaxVarintLen64 bytes in ReadUvarint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL ensures that ReadUvarint consumes only a limited amount of input (instead of an unbounded amount). On some inputs, ReadUvarint could read an arbitrary number of bytes before deciding to return an overflow error. After this CL, ReadUvarint returns that same overflow error sooner, after reading at most MaxVarintLen64 bytes. Fix authored by Robert Griesemer and Filippo Valsorda. Thanks to Diederik Loerakker, Jonny Rhea, Raúl Kripalani, and Preston Van Loon for reporting this. Fixes CVE-2020-16845 Change-Id: Ie0cb15972f14c38b7cf7af84c45c4ce54909bb8f Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/812099 Reviewed-by: Filippo Valsorda Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/812324 --- src/encoding/binary/varint.go | 5 +++-- src/encoding/binary/varint_test.go | 18 ++++++++++++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/encoding/binary/varint.go b/src/encoding/binary/varint.go index bcb8ac9a45..38af61075c 100644 --- a/src/encoding/binary/varint.go +++ b/src/encoding/binary/varint.go @@ -106,13 +106,13 @@ var overflow = errors.New("binary: varint overflows a 64-bit integer") func ReadUvarint(r io.ByteReader) (uint64, error) { var x uint64 var s uint - for i := 0; ; i++ { + for i := 0; i < MaxVarintLen64; i++ { b, err := r.ReadByte() if err != nil { return x, err } if b < 0x80 { - if i > 9 || i == 9 && b > 1 { + if i == 9 && b > 1 { return x, overflow } return x | uint64(b)< MaxVarintLen64 { + t.Errorf("ReadUvarint(%v): read more than MaxVarintLen64 bytes, got %d", buf, read) } } func TestOverflow(t *testing.T) { - testOverflow(t, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x2}, -10, overflow) - testOverflow(t, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x1, 0, 0}, -13, overflow) + testOverflow(t, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x2}, 0, -10, overflow) + testOverflow(t, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x1, 0, 0}, 0, -13, overflow) + testOverflow(t, []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 1<<64-1, 0, overflow) // 11 bytes, should overflow } func TestNonCanonicalZero(t *testing.T) { -- cgit v1.2.1 From e71b61180aa19a60c23b3b7e3f6586726ebe4fd1 Mon Sep 17 00:00:00 2001 From: Alexander Rakoczy Date: Thu, 6 Aug 2020 10:05:40 -0400 Subject: [release-branch.go1.13-security] go1.13.15 Change-Id: I4922f24774168f1c991b486276257a1ed18d34b6 Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/814547 Reviewed-by: Katie Hockman --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index be38e0e48c..1cad8be834 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -go1.13.14 \ No newline at end of file +go1.13.15 \ No newline at end of file -- cgit v1.2.1