Control: tags -1 + confirmed

On 2021-03-12 00:04:15, Shengjing Zhu wrote:
> Package: release.debian.org
> Severity: normal
> User: release.debian....@packages.debian.org
> Usertags: unblock
> X-Debbugs-Cc: z...@debian.org, team+go-compi...@tracker.debian.org
> 
> Please unblock package golang-1.15
> 
> [ Reason ]
> Upstream security release, only target fix is introduced.
> CVE-2021-27918: encoding/xml: infinite loop when using `xml.NewTokenDecoder`
> with a custom `TokenReader`.
> https://github.com/golang/go/issues/44913
> 
> [ Impact ]
> Without this version, the Go compiler is vulnerable.
> However with the new undetermined Go security policy, this
> bug is classified as LOW (severity issues affect niche configurations,
> have very limited impact, or are already widely known).
> https://github.com/golang/go/issues/44918
> 
> [ Tests ]
> + Upstream tests in source package.
> + Have manually test some Go packages.
> 
> [ Risks ]
> + No autopkgtest
> + Diff is small
> 
> [ Checklist ]
>   [x] all changes are documented in the d/changelog
>   [x] I reviewed all changes and I approve them
>   [x] attach debdiff against the package in testing
> 
> [ Other info ]
> If this package is blocked in unstable, all Go packages will be prevented
> from migrating to testing, due to the Built-Using thing..
> So I fill this pre-approval request. And if possible, reduce the age too.
> 
> unblock golang-1.15/1.15.9-1

Assuming the uploads happens soon, please go ahead.

Cheers

> 
> 
> diff -Nru golang-1.15-1.15.8/debian/changelog 
> golang-1.15-1.15.9/debian/changelog
> --- golang-1.15-1.15.8/debian/changelog       2021-02-15 23:19:39.000000000 
> +0800
> +++ golang-1.15-1.15.9/debian/changelog       2021-03-11 23:43:18.000000000 
> +0800
> @@ -1,3 +1,12 @@
> +golang-1.15 (1.15.9-1) unstable; urgency=medium
> +
> +  * Team upload.
> +  * New upstream version 1.15.9
> +    + encoding/xml: infinite loop when using `xml.NewTokenDecoder` with a
> +      custom `TokenReader`. CVE-2021-27918
> +
> + -- Shengjing Zhu <z...@debian.org>  Thu, 11 Mar 2021 23:43:18 +0800
> +
>  golang-1.15 (1.15.8-4) unstable; urgency=medium
>  
>    * Team upload.
> diff -Nru golang-1.15-1.15.8/src/encoding/xml/xml.go 
> golang-1.15-1.15.9/src/encoding/xml/xml.go
> --- golang-1.15-1.15.8/src/encoding/xml/xml.go        2021-02-05 
> 20:48:37.000000000 +0800
> +++ golang-1.15-1.15.9/src/encoding/xml/xml.go        2021-03-10 
> 22:29:35.000000000 +0800
> @@ -271,7 +271,7 @@
>  // it will return an error.
>  //
>  // Token implements XML name spaces as described by
> -// https://www.w3.org/TR/REC-xml-names/.  Each of the
> +// https://www.w3.org/TR/REC-xml-names/. Each of the
>  // Name structures contained in the Token has the Space
>  // set to the URL identifying its name space when known.
>  // If Token encounters an unrecognized name space prefix,
> @@ -285,16 +285,17 @@
>       if d.nextToken != nil {
>               t = d.nextToken
>               d.nextToken = nil
> -     } else if t, err = d.rawToken(); err != nil {
> -             switch {
> -             case err == io.EOF && d.t != nil:
> -                     err = nil
> -             case err == io.EOF && d.stk != nil && d.stk.kind != stkEOF:
> -                     err = d.syntaxError("unexpected EOF")
> +     } else {
> +             if t, err = d.rawToken(); t == nil && err != nil {
> +                     if err == io.EOF && d.stk != nil && d.stk.kind != 
> stkEOF {
> +                             err = d.syntaxError("unexpected EOF")
> +                     }
> +                     return nil, err
>               }
> -             return t, err
> +             // We still have a token to process, so clear any
> +             // errors (e.g. EOF) and proceed.
> +             err = nil
>       }
> -
>       if !d.Strict {
>               if t1, ok := d.autoClose(t); ok {
>                       d.nextToken = t
> diff -Nru golang-1.15-1.15.8/src/encoding/xml/xml_test.go 
> golang-1.15-1.15.9/src/encoding/xml/xml_test.go
> --- golang-1.15-1.15.8/src/encoding/xml/xml_test.go   2021-02-05 
> 20:48:37.000000000 +0800
> +++ golang-1.15-1.15.9/src/encoding/xml/xml_test.go   2021-03-10 
> 22:29:35.000000000 +0800
> @@ -33,30 +33,90 @@
>  
>  func TestDecodeEOF(t *testing.T) {
>       start := StartElement{Name: Name{Local: "test"}}
> -     t.Run("EarlyEOF", func(t *testing.T) {
> -             d := NewTokenDecoder(&toks{earlyEOF: true, t: []Token{
> -                     start,
> -                     start.End(),
> -             }})
> -             err := d.Decode(&struct {
> -                     XMLName Name `xml:"test"`
> -             }{})
> -             if err != nil {
> -                     t.Error(err)
> +     tests := []struct {
> +             name   string
> +             tokens []Token
> +             ok     bool
> +     }{
> +             {
> +                     name: "OK",
> +                     tokens: []Token{
> +                             start,
> +                             start.End(),
> +                     },
> +                     ok: true,
> +             },
> +             {
> +                     name: "Malformed",
> +                     tokens: []Token{
> +                             start,
> +                             StartElement{Name: Name{Local: "bad"}},
> +                             start.End(),
> +                     },
> +                     ok: false,
> +             },
> +     }
> +     for _, tc := range tests {
> +             for _, eof := range []bool{true, false} {
> +                     name := fmt.Sprintf("%s/earlyEOF=%v", tc.name, eof)
> +                     t.Run(name, func(t *testing.T) {
> +                             d := NewTokenDecoder(&toks{
> +                                     earlyEOF: eof,
> +                                     t:        tc.tokens,
> +                             })
> +                             err := d.Decode(&struct {
> +                                     XMLName Name `xml:"test"`
> +                             }{})
> +                             if tc.ok && err != nil {
> +                                     t.Fatalf("d.Decode: expected nil error, 
> got %v", err)
> +                             }
> +                             if _, ok := err.(*SyntaxError); !tc.ok && !ok {
> +                                     t.Errorf("d.Decode: expected syntax 
> error, got %v", err)
> +                             }
> +                     })
>               }
> -     })
> -     t.Run("LateEOF", func(t *testing.T) {
> -             d := NewTokenDecoder(&toks{t: []Token{
> -                     start,
> -                     start.End(),
> -             }})
> -             err := d.Decode(&struct {
> -                     XMLName Name `xml:"test"`
> -             }{})
> -             if err != nil {
> -                     t.Error(err)
> +     }
> +}
> +
> +type toksNil struct {
> +     returnEOF bool
> +     t         []Token
> +}
> +
> +func (t *toksNil) Token() (Token, error) {
> +     if len(t.t) == 0 {
> +             if !t.returnEOF {
> +                     // Return nil, nil before returning an EOF. It's legal, 
> but
> +                     // discouraged.
> +                     t.returnEOF = true
> +                     return nil, nil
>               }
> -     })
> +             return nil, io.EOF
> +     }
> +     var tok Token
> +     tok, t.t = t.t[0], t.t[1:]
> +     return tok, nil
> +}
> +
> +func TestDecodeNilToken(t *testing.T) {
> +     for _, strict := range []bool{true, false} {
> +             name := fmt.Sprintf("Strict=%v", strict)
> +             t.Run(name, func(t *testing.T) {
> +                     start := StartElement{Name: Name{Local: "test"}}
> +                     bad := StartElement{Name: Name{Local: "bad"}}
> +                     d := NewTokenDecoder(&toksNil{
> +                             // Malformed
> +                             t: []Token{start, bad, start.End()},
> +                     })
> +                     d.Strict = strict
> +                     err := d.Decode(&struct {
> +                             XMLName Name `xml:"test"`
> +                     }{})
> +                     if _, ok := err.(*SyntaxError); !ok {
> +                             t.Errorf("d.Decode: expected syntax error, got 
> %v", err)
> +                     }
> +             })
> +     }
>  }
>  
>  const testInput = `
> diff -Nru golang-1.15-1.15.8/VERSION golang-1.15-1.15.9/VERSION
> --- golang-1.15-1.15.8/VERSION        2021-02-05 20:48:37.000000000 +0800
> +++ golang-1.15-1.15.9/VERSION        2021-03-10 22:31:50.000000000 +0800
> @@ -1 +1 @@
> -go1.15.8
> \ No newline at end of file
> +go1.15.9
> \ No newline at end of file



-- 
Sebastian Ramacher

Reply via email to