mirror of
https://git.yoctoproject.org/poky
synced 2026-02-20 08:29:42 +01:00
go: fix CVE-2023-29405
The go command may execute arbitrary code at build time when using cgo.
This may occur when running "go get" on a malicious module, or when running
any other command which builds untrusted code. This is can by triggered by
linker flags, specified via a "#cgo LDFLAGS" directive. Flags containing
embedded spaces are mishandled, allowing disallowed flags to be smuggled
through the LDFLAGS sanitization by including them in the argument of
another flag. This only affects usage of the gccgo compiler.
References:
https://nvd.nist.gov/vuln/detail/CVE-2023-29405
Upstream patches:
6d8af00a63
(From OE-Core rev: 7ce6d0029effc06cff500271a124150f1a7db7b3)
Signed-off-by: Archana Polampalli <archana.polampalli@windriver.com>
Signed-off-by: Steve Sakoman <steve@sakoman.com>
This commit is contained in:
committed by
Steve Sakoman
parent
19cce6f246
commit
92a46e5fff
@@ -33,6 +33,7 @@ SRC_URI += "\
|
||||
file://CVE-2023-24540.patch \
|
||||
file://CVE-2023-24539.patch \
|
||||
file://CVE-2023-29404.patch \
|
||||
file://CVE-2023-29405.patch \
|
||||
"
|
||||
SRC_URI[main.sha256sum] = "a1a48b23afb206f95e7bbaa9b898d965f90826f6f1d1fc0c1d784ada0cd300fd"
|
||||
|
||||
|
||||
109
meta/recipes-devtools/go/go-1.19/CVE-2023-29405.patch
Normal file
109
meta/recipes-devtools/go/go-1.19/CVE-2023-29405.patch
Normal file
@@ -0,0 +1,109 @@
|
||||
From 6d8af00a630aa51134e54f0f321658621c6410f0 Mon Sep 17 00:00:00 2001
|
||||
From: Ian Lance Taylor <iant@golang.org>
|
||||
Date: Thu, 4 May 2023 14:06:39 -0700
|
||||
Subject: [PATCH] cmd/go,cmd/cgo: in _cgo_flags use one line per flag
|
||||
|
||||
The flags that we recorded in _cgo_flags did not use any quoting,
|
||||
so a flag containing embedded spaces was mishandled.
|
||||
Change the _cgo_flags format to put each flag on a separate line.
|
||||
That is a simple format that does not require any quoting.
|
||||
|
||||
As far as I can tell only cmd/go uses _cgo_flags, and it is only
|
||||
used for gccgo. If this patch doesn't cause any trouble, then
|
||||
in the next release we can change to only using _cgo_flags for gccgo.
|
||||
|
||||
Thanks to Juho Nurminen of Mattermost for reporting this issue.
|
||||
|
||||
Fixes #60306
|
||||
Fixes CVE-2023-29405
|
||||
|
||||
Change-Id: I81fb5337db8a22e1f4daca22ceff4b79b96d0b4f
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1875094
|
||||
Reviewed-by: Damien Neil <dneil@google.com>
|
||||
Reviewed-by: Roland Shoemaker <bracewell@google.com>
|
||||
Reviewed-on: https://go-review.googlesource.com/c/go/+/501224
|
||||
Reviewed-by: Ian Lance Taylor <iant@google.com>
|
||||
Run-TryBot: David Chase <drchase@google.com>
|
||||
Reviewed-by: Michael Knyszek <mknyszek@google.com>
|
||||
Reviewed-by: Roland Shoemaker <roland@golang.org>
|
||||
TryBot-Result: Gopher Robot <gobot@golang.org>
|
||||
|
||||
Upstream-Status: Backport [https://github.com/golang/go/commit/6d8af00a630aa51134e54f0f321658621c6410f0]
|
||||
CVE: CVE-2023-29405
|
||||
|
||||
Signed-off-by: Archana Polampalli <archana.polampalli@windriver.com>
|
||||
---
|
||||
src/cmd/cgo/out.go | 4 +++-
|
||||
src/cmd/go/internal/work/gccgo.go | 14 ++++++-------
|
||||
.../go/testdata/script/gccgo_link_ldflags.txt | 20 +++++++++++++++++++
|
||||
3 files changed, 29 insertions(+), 9 deletions(-)
|
||||
create mode 100644 src/cmd/go/testdata/script/gccgo_link_ldflags.txt
|
||||
|
||||
diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go
|
||||
index 94152f4..62e6528 100644
|
||||
--- a/src/cmd/cgo/out.go
|
||||
+++ b/src/cmd/cgo/out.go
|
||||
@@ -47,7 +47,9 @@ func (p *Package) writeDefs() {
|
||||
|
||||
fflg := creat(*objDir + "_cgo_flags")
|
||||
for k, v := range p.CgoFlags {
|
||||
- fmt.Fprintf(fflg, "_CGO_%s=%s\n", k, strings.Join(v, " "))
|
||||
+ for _, arg := range v {
|
||||
+ fmt.Fprintf(fflg, "_CGO_%s=%s\n", k, arg)
|
||||
+ }
|
||||
if k == "LDFLAGS" && !*gccgo {
|
||||
for _, arg := range v {
|
||||
fmt.Fprintf(fgo2, "//go:cgo_ldflag %q\n", arg)
|
||||
diff --git a/src/cmd/go/internal/work/gccgo.go b/src/cmd/go/internal/work/gccgo.go
|
||||
index 1499536..bb4be2f 100644
|
||||
--- a/src/cmd/go/internal/work/gccgo.go
|
||||
+++ b/src/cmd/go/internal/work/gccgo.go
|
||||
@@ -283,14 +283,12 @@ func (tools gccgoToolchain) link(b *Builder, root *Action, out, importcfg string
|
||||
const ldflagsPrefix = "_CGO_LDFLAGS="
|
||||
for _, line := range strings.Split(string(flags), "\n") {
|
||||
if strings.HasPrefix(line, ldflagsPrefix) {
|
||||
- newFlags := strings.Fields(line[len(ldflagsPrefix):])
|
||||
- for _, flag := range newFlags {
|
||||
- // Every _cgo_flags file has -g and -O2 in _CGO_LDFLAGS
|
||||
- // but they don't mean anything to the linker so filter
|
||||
- // them out.
|
||||
- if flag != "-g" && !strings.HasPrefix(flag, "-O") {
|
||||
- cgoldflags = append(cgoldflags, flag)
|
||||
- }
|
||||
+ flag := line[len(ldflagsPrefix):]
|
||||
+ // Every _cgo_flags file has -g and -O2 in _CGO_LDFLAGS
|
||||
+ // but they don't mean anything to the linker so filter
|
||||
+ // them out.
|
||||
+ if flag != "-g" && !strings.HasPrefix(flag, "-O") {
|
||||
+ cgoldflags = append(cgoldflags, flag)
|
||||
}
|
||||
}
|
||||
}
|
||||
diff --git a/src/cmd/go/testdata/script/gccgo_link_ldflags.txt b/src/cmd/go/testdata/script/gccgo_link_ldflags.txt
|
||||
new file mode 100644
|
||||
index 0000000..4e91ae5
|
||||
--- /dev/null
|
||||
+++ b/src/cmd/go/testdata/script/gccgo_link_ldflags.txt
|
||||
@@ -0,0 +1,20 @@
|
||||
+# Test that #cgo LDFLAGS are properly quoted.
|
||||
+# The #cgo LDFLAGS below should pass a string with spaces to -L,
|
||||
+# as though searching a directory with a space in its name.
|
||||
+# It should not pass --nosuchoption to the external linker.
|
||||
+
|
||||
+[!cgo] skip
|
||||
+
|
||||
+go build
|
||||
+
|
||||
+[!exec:gccgo] skip
|
||||
+
|
||||
+go build -compiler gccgo
|
||||
+
|
||||
+-- go.mod --
|
||||
+module m
|
||||
+-- cgo.go --
|
||||
+package main
|
||||
+// #cgo LDFLAGS: -L "./ -Wl,--nosuchoption"
|
||||
+import "C"
|
||||
+func main() {}
|
||||
--
|
||||
2.40.0
|
||||
Reference in New Issue
Block a user