Upstream-Status: Backport 
[https://github.com/golang/go/commit/31d60cda1f58b7558fc5725d2b9e4531655d980e]
CVE: CVE-2021-33195
Signed-off-by: Ralph Siemsen <[email protected]>
---
 meta/recipes-devtools/go/go-1.14.inc          |   1 +
 .../go/go-1.14/CVE-2021-33195.patch           | 373 ++++++++++++++++++
 2 files changed, 374 insertions(+)
 create mode 100644 meta/recipes-devtools/go/go-1.14/CVE-2021-33195.patch

diff --git a/meta/recipes-devtools/go/go-1.14.inc 
b/meta/recipes-devtools/go/go-1.14.inc
index 3341beb159..63da997bf1 100644
--- a/meta/recipes-devtools/go/go-1.14.inc
+++ b/meta/recipes-devtools/go/go-1.14.inc
@@ -42,6 +42,7 @@ SRC_URI += "\
     file://0003-CVE-2022-32190.patch \
     file://0004-CVE-2022-32190.patch \
     file://CVE-2022-2880.patch \
+    file://CVE-2021-33195.patch \
 "
 
 SRC_URI_append_libc-musl = " 
file://0009-ld-replace-glibc-dynamic-linker-with-musl.patch"
diff --git a/meta/recipes-devtools/go/go-1.14/CVE-2021-33195.patch 
b/meta/recipes-devtools/go/go-1.14/CVE-2021-33195.patch
new file mode 100644
index 0000000000..3d9de888ff
--- /dev/null
+++ b/meta/recipes-devtools/go/go-1.14/CVE-2021-33195.patch
@@ -0,0 +1,373 @@
+From 9324d7e53151e9dfa4b25af994a28c2e0b11f729 Mon Sep 17 00:00:00 2001
+From: Roland Shoemaker <[email protected]>
+Date: Thu, 27 May 2021 10:40:06 -0700
+Subject: [PATCH] net: verify results from Lookup* are valid domain names
+
+Upstream-Status: Backport 
[https://github.com/golang/go/commit/31d60cda1f58b7558fc5725d2b9e4531655d980e]
+CVE: CVE-2021-33195
+Signed-off-by: Ralph Siemsen <[email protected]>
+
+
+For the methods LookupCNAME, LookupSRV, LookupMX, LookupNS, and
+LookupAddr check that the returned domain names are in fact valid DNS
+names using the existing isDomainName function.
+
+Thanks to Philipp Jeitner and Haya Shulman from Fraunhofer SIT for
+reporting this issue.
+
+Updates #46241
+Fixes #46356
+Fixes CVE-2021-33195
+
+Change-Id: I47a4f58c031cb752f732e88bbdae7f819f0af4f3
+Reviewed-on: https://go-review.googlesource.com/c/go/+/323131
+Trust: Roland Shoemaker <[email protected]>
+Run-TryBot: Roland Shoemaker <[email protected]>
+TryBot-Result: Go Bot <[email protected]>
+Reviewed-by: Filippo Valsorda <[email protected]>
+Reviewed-by: Katie Hockman <[email protected]>
+(cherry picked from commit cdcd02842da7c004efd023881e3719105209c908)
+Reviewed-on: https://go-review.googlesource.com/c/go/+/323269
+---
+ src/net/dnsclient_unix_test.go | 157 +++++++++++++++++++++++++++++++++
+ src/net/lookup.go              | 111 ++++++++++++++++++++---
+ 2 files changed, 255 insertions(+), 13 deletions(-)
+
+diff --git a/src/net/dnsclient_unix_test.go b/src/net/dnsclient_unix_test.go
+index 2ad40df..b8617d9 100644
+--- a/src/net/dnsclient_unix_test.go
++++ b/src/net/dnsclient_unix_test.go
+@@ -1800,3 +1800,160 @@ func TestPTRandNonPTR(t *testing.T) {
+               t.Errorf("names = %q; want %q", names, want)
+       }
+ }
++
++func TestCVE202133195(t *testing.T) {
++      fake := fakeDNSServer{
++              rh: func(n, _ string, q dnsmessage.Message, _ time.Time) 
(dnsmessage.Message, error) {
++                      r := dnsmessage.Message{
++                              Header: dnsmessage.Header{
++                                      ID:                 q.Header.ID,
++                                      Response:           true,
++                                      RCode:              
dnsmessage.RCodeSuccess,
++                                      RecursionAvailable: true,
++                              },
++                              Questions: q.Questions,
++                      }
++                      switch q.Questions[0].Type {
++                      case dnsmessage.TypeCNAME:
++                              r.Answers = []dnsmessage.Resource{}
++                      case dnsmessage.TypeA: // CNAME lookup uses a A/AAAA as 
a proxy
++                              r.Answers = append(r.Answers,
++                                      dnsmessage.Resource{
++                                              Header: 
dnsmessage.ResourceHeader{
++                                                      Name:   
dnsmessage.MustNewName("<html>.golang.org."),
++                                                      Type:   
dnsmessage.TypeA,
++                                                      Class:  
dnsmessage.ClassINET,
++                                                      Length: 4,
++                                              },
++                                              Body: &dnsmessage.AResource{
++                                                      A: TestAddr,
++                                              },
++                                      },
++                              )
++                      case dnsmessage.TypeSRV:
++                              n := q.Questions[0].Name
++                              if n.String() == "_hdr._tcp.golang.org." {
++                                      n = 
dnsmessage.MustNewName("<html>.golang.org.")
++                              }
++                              r.Answers = append(r.Answers,
++                                      dnsmessage.Resource{
++                                              Header: 
dnsmessage.ResourceHeader{
++                                                      Name:   n,
++                                                      Type:   
dnsmessage.TypeSRV,
++                                                      Class:  
dnsmessage.ClassINET,
++                                                      Length: 4,
++                                              },
++                                              Body: &dnsmessage.SRVResource{
++                                                      Target: 
dnsmessage.MustNewName("<html>.golang.org."),
++                                              },
++                                      },
++                              )
++                      case dnsmessage.TypeMX:
++                              r.Answers = append(r.Answers,
++                                      dnsmessage.Resource{
++                                              Header: 
dnsmessage.ResourceHeader{
++                                                      Name:   
dnsmessage.MustNewName("<html>.golang.org."),
++                                                      Type:   
dnsmessage.TypeMX,
++                                                      Class:  
dnsmessage.ClassINET,
++                                                      Length: 4,
++                                              },
++                                              Body: &dnsmessage.MXResource{
++                                                      MX: 
dnsmessage.MustNewName("<html>.golang.org."),
++                                              },
++                                      },
++                              )
++                      case dnsmessage.TypeNS:
++                              r.Answers = append(r.Answers,
++                                      dnsmessage.Resource{
++                                              Header: 
dnsmessage.ResourceHeader{
++                                                      Name:   
dnsmessage.MustNewName("<html>.golang.org."),
++                                                      Type:   
dnsmessage.TypeNS,
++                                                      Class:  
dnsmessage.ClassINET,
++                                                      Length: 4,
++                                              },
++                                              Body: &dnsmessage.NSResource{
++                                                      NS: 
dnsmessage.MustNewName("<html>.golang.org."),
++                                              },
++                                      },
++                              )
++                      case dnsmessage.TypePTR:
++                              r.Answers = append(r.Answers,
++                                      dnsmessage.Resource{
++                                              Header: 
dnsmessage.ResourceHeader{
++                                                      Name:   
dnsmessage.MustNewName("<html>.golang.org."),
++                                                      Type:   
dnsmessage.TypePTR,
++                                                      Class:  
dnsmessage.ClassINET,
++                                                      Length: 4,
++                                              },
++                                              Body: &dnsmessage.PTRResource{
++                                                      PTR: 
dnsmessage.MustNewName("<html>.golang.org."),
++                                              },
++                                      },
++                              )
++                      }
++                      return r, nil
++              },
++      }
++
++      r := Resolver{PreferGo: true, Dial: fake.DialContext}
++      // Change the default resolver to match our manipulated resolver
++      originalDefault := DefaultResolver
++      DefaultResolver = &r
++      defer func() {
++              DefaultResolver = originalDefault
++      }()
++
++      _, err := r.LookupCNAME(context.Background(), "golang.org")
++      if expected := "lookup golang.org: CNAME target is invalid"; err == nil 
|| err.Error() != expected {
++              t.Errorf("Resolver.LookupCNAME returned unexpected error, got 
%q, want %q", err.Error(), expected)
++      }
++      _, err = LookupCNAME("golang.org")
++      if expected := "lookup golang.org: CNAME target is invalid"; err == nil 
|| err.Error() != expected {
++              t.Errorf("LookupCNAME returned unexpected error, got %q, want 
%q", err.Error(), expected)
++      }
++
++      _, _, err = r.LookupSRV(context.Background(), "target", "tcp", 
"golang.org")
++      if expected := "lookup golang.org: SRV target is invalid"; err == nil 
|| err.Error() != expected {
++              t.Errorf("Resolver.LookupSRV returned unexpected error, got %q, 
want %q", err.Error(), expected)
++      }
++      _, _, err = LookupSRV("target", "tcp", "golang.org")
++      if expected := "lookup golang.org: SRV target is invalid"; err == nil 
|| err.Error() != expected {
++              t.Errorf("LookupSRV returned unexpected error, got %q, want 
%q", err.Error(), expected)
++      }
++
++      _, _, err = r.LookupSRV(context.Background(), "hdr", "tcp", 
"golang.org")
++      if expected := "lookup golang.org: SRV header name is invalid"; err == 
nil || err.Error() != expected {
++              t.Errorf("Resolver.LookupSRV returned unexpected error, got %q, 
want %q", err.Error(), expected)
++      }
++      _, _, err = LookupSRV("hdr", "tcp", "golang.org")
++      if expected := "lookup golang.org: SRV header name is invalid"; err == 
nil || err.Error() != expected {
++              t.Errorf("LookupSRV returned unexpected error, got %q, want 
%q", err.Error(), expected)
++      }
++
++      _, err = r.LookupMX(context.Background(), "golang.org")
++      if expected := "lookup golang.org: MX target is invalid"; err == nil || 
err.Error() != expected {
++              t.Errorf("Resolver.LookupMX returned unexpected error, got %q, 
want %q", err.Error(), expected)
++      }
++      _, err = LookupMX("golang.org")
++      if expected := "lookup golang.org: MX target is invalid"; err == nil || 
err.Error() != expected {
++              t.Errorf("LookupMX returned unexpected error, got %q, want %q", 
err.Error(), expected)
++      }
++
++      _, err = r.LookupNS(context.Background(), "golang.org")
++      if expected := "lookup golang.org: NS target is invalid"; err == nil || 
err.Error() != expected {
++              t.Errorf("Resolver.LookupNS returned unexpected error, got %q, 
want %q", err.Error(), expected)
++      }
++      _, err = LookupNS("golang.org")
++      if expected := "lookup golang.org: NS target is invalid"; err == nil || 
err.Error() != expected {
++              t.Errorf("LookupNS returned unexpected error, got %q, want %q", 
err.Error(), expected)
++      }
++
++      _, err = r.LookupAddr(context.Background(), "1.2.3.4")
++      if expected := "lookup 1.2.3.4: PTR target is invalid"; err == nil || 
err.Error() != expected {
++              t.Errorf("Resolver.LookupAddr returned unexpected error, got 
%q, want %q", err.Error(), expected)
++      }
++      _, err = LookupAddr("1.2.3.4")
++      if expected := "lookup 1.2.3.4: PTR target is invalid"; err == nil || 
err.Error() != expected {
++              t.Errorf("LookupAddr returned unexpected error, got %q, want 
%q", err.Error(), expected)
++      }
++}
+diff --git a/src/net/lookup.go b/src/net/lookup.go
+index 9cebd10..05e88e4 100644
+--- a/src/net/lookup.go
++++ b/src/net/lookup.go
+@@ -364,8 +364,11 @@ func (r *Resolver) LookupPort(ctx context.Context, 
network, service string) (por
+ // LookupCNAME does not return an error if host does not
+ // contain DNS "CNAME" records, as long as host resolves to
+ // address records.
++//
++// The returned canonical name is validated to be a properly
++// formatted presentation-format domain name.
+ func LookupCNAME(host string) (cname string, err error) {
+-      return DefaultResolver.lookupCNAME(context.Background(), host)
++      return DefaultResolver.LookupCNAME(context.Background(), host)
+ }
+ 
+ // LookupCNAME returns the canonical name for the given host.
+@@ -378,8 +381,18 @@ func LookupCNAME(host string) (cname string, err error) {
+ // LookupCNAME does not return an error if host does not
+ // contain DNS "CNAME" records, as long as host resolves to
+ // address records.
+-func (r *Resolver) LookupCNAME(ctx context.Context, host string) (cname 
string, err error) {
+-      return r.lookupCNAME(ctx, host)
++//
++// The returned canonical name is validated to be a properly
++// formatted presentation-format domain name.
++func (r *Resolver) LookupCNAME(ctx context.Context, host string) (string, 
error) {
++      cname, err := r.lookupCNAME(ctx, host)
++      if err != nil {
++              return "", err
++      }
++      if !isDomainName(cname) {
++              return "", &DNSError{Err: "CNAME target is invalid", Name: host}
++      }
++      return cname, nil
+ }
+ 
+ // LookupSRV tries to resolve an SRV query of the given service,
+@@ -391,8 +404,11 @@ func (r *Resolver) LookupCNAME(ctx context.Context, host 
string) (cname string,
+ // That is, it looks up _service._proto.name. To accommodate services
+ // publishing SRV records under non-standard names, if both service
+ // and proto are empty strings, LookupSRV looks up name directly.
++//
++// The returned service names are validated to be properly
++// formatted presentation-format domain names.
+ func LookupSRV(service, proto, name string) (cname string, addrs []*SRV, err 
error) {
+-      return DefaultResolver.lookupSRV(context.Background(), service, proto, 
name)
++      return DefaultResolver.LookupSRV(context.Background(), service, proto, 
name)
+ }
+ 
+ // LookupSRV tries to resolve an SRV query of the given service,
+@@ -404,28 +420,82 @@ func LookupSRV(service, proto, name string) (cname 
string, addrs []*SRV, err err
+ // That is, it looks up _service._proto.name. To accommodate services
+ // publishing SRV records under non-standard names, if both service
+ // and proto are empty strings, LookupSRV looks up name directly.
+-func (r *Resolver) LookupSRV(ctx context.Context, service, proto, name 
string) (cname string, addrs []*SRV, err error) {
+-      return r.lookupSRV(ctx, service, proto, name)
++//
++// The returned service names are validated to be properly
++// formatted presentation-format domain names.
++func (r *Resolver) LookupSRV(ctx context.Context, service, proto, name 
string) (string, []*SRV, error) {
++      cname, addrs, err := r.lookupSRV(ctx, service, proto, name)
++      if err != nil {
++              return "", nil, err
++      }
++      if cname != "" && !isDomainName(cname) {
++              return "", nil, &DNSError{Err: "SRV header name is invalid", 
Name: name}
++      }
++      for _, addr := range addrs {
++              if addr == nil {
++                      continue
++              }
++              if !isDomainName(addr.Target) {
++                      return "", nil, &DNSError{Err: "SRV target is invalid", 
Name: name}
++              }
++      }
++      return cname, addrs, nil
+ }
+ 
+ // LookupMX returns the DNS MX records for the given domain name sorted by 
preference.
++//
++// The returned mail server names are validated to be properly
++// formatted presentation-format domain names.
+ func LookupMX(name string) ([]*MX, error) {
+-      return DefaultResolver.lookupMX(context.Background(), name)
++      return DefaultResolver.LookupMX(context.Background(), name)
+ }
+ 
+ // LookupMX returns the DNS MX records for the given domain name sorted by 
preference.
++//
++// The returned mail server names are validated to be properly
++// formatted presentation-format domain names.
+ func (r *Resolver) LookupMX(ctx context.Context, name string) ([]*MX, error) {
+-      return r.lookupMX(ctx, name)
++      records, err := r.lookupMX(ctx, name)
++      if err != nil {
++              return nil, err
++      }
++      for _, mx := range records {
++              if mx == nil {
++                      continue
++              }
++              if !isDomainName(mx.Host) {
++                      return nil, &DNSError{Err: "MX target is invalid", 
Name: name}
++              }
++      }
++      return records, nil
+ }
+ 
+ // LookupNS returns the DNS NS records for the given domain name.
++//
++// The returned name server names are validated to be properly
++// formatted presentation-format domain names.
+ func LookupNS(name string) ([]*NS, error) {
+-      return DefaultResolver.lookupNS(context.Background(), name)
++      return DefaultResolver.LookupNS(context.Background(), name)
+ }
+ 
+ // LookupNS returns the DNS NS records for the given domain name.
++//
++// The returned name server names are validated to be properly
++// formatted presentation-format domain names.
+ func (r *Resolver) LookupNS(ctx context.Context, name string) ([]*NS, error) {
+-      return r.lookupNS(ctx, name)
++      records, err := r.lookupNS(ctx, name)
++      if err != nil {
++              return nil, err
++      }
++      for _, ns := range records {
++              if ns == nil {
++                      continue
++              }
++              if !isDomainName(ns.Host) {
++                      return nil, &DNSError{Err: "NS target is invalid", 
Name: name}
++              }
++      }
++      return records, nil
+ }
+ 
+ // LookupTXT returns the DNS TXT records for the given domain name.
+@@ -441,14 +511,29 @@ func (r *Resolver) LookupTXT(ctx context.Context, name 
string) ([]string, error)
+ // LookupAddr performs a reverse lookup for the given address, returning a 
list
+ // of names mapping to that address.
+ //
++// The returned names are validated to be properly formatted 
presentation-format
++// domain names.
++//
+ // When using the host C library resolver, at most one result will be
+ // returned. To bypass the host resolver, use a custom Resolver.
+ func LookupAddr(addr string) (names []string, err error) {
+-      return DefaultResolver.lookupAddr(context.Background(), addr)
++      return DefaultResolver.LookupAddr(context.Background(), addr)
+ }
+ 
+ // LookupAddr performs a reverse lookup for the given address, returning a 
list
+ // of names mapping to that address.
+-func (r *Resolver) LookupAddr(ctx context.Context, addr string) (names 
[]string, err error) {
+-      return r.lookupAddr(ctx, addr)
++//
++// The returned names are validated to be properly formatted 
presentation-format
++// domain names.
++func (r *Resolver) LookupAddr(ctx context.Context, addr string) ([]string, 
error) {
++      names, err := r.lookupAddr(ctx, addr)
++      if err != nil {
++              return nil, err
++      }
++      for _, name := range names {
++              if !isDomainName(name) {
++                      return nil, &DNSError{Err: "PTR target is invalid", 
Name: addr}
++              }
++      }
++      return names, nil
+ }
-- 
2.25.1

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#173434): 
https://lists.openembedded.org/g/openembedded-core/message/173434
Mute This Topic: https://lists.openembedded.org/mt/95093841/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to