mirror of
https://git.yoctoproject.org/poky
synced 2026-07-27 07:27:12 +00:00
f25b363233
Backport fixes for: * CVE-2023-29402 - Upstream-Status: Backport from https://github.com/golang/go/commit/c160b49b6d328c86bd76ca2fff9009a71347333f * CVE-2023-29404 - Upstream-Status: Backport from https://github.com/golang/go/commit/bf3c8ce03e175e870763901a3850bca01381a828 (From OE-Core rev: a4a989605d8cab3278d6c6e32eb882815ff36a28) Signed-off-by: Hitendra Prajapati <hprajapati@mvista.com> Signed-off-by: Steve Sakoman <steve@sakoman.com>
202 lines
6.3 KiB
Diff
202 lines
6.3 KiB
Diff
rom c160b49b6d328c86bd76ca2fff9009a71347333f Mon Sep 17 00:00:00 2001
|
|
From: "Bryan C. Mills" <bcmills@google.com>
|
|
Date: Fri, 12 May 2023 14:15:16 -0400
|
|
Subject: [PATCH] [release-branch.go1.19] cmd/go: disallow package directories
|
|
containing newlines
|
|
|
|
Directory or file paths containing newlines may cause tools (such as
|
|
cmd/cgo) that emit "//line" or "#line" -directives to write part of
|
|
the path into non-comment lines in generated source code. If those
|
|
lines contain valid Go code, it may be injected into the resulting
|
|
binary.
|
|
|
|
(Note that Go import paths and file paths within module zip files
|
|
already could not contain newlines.)
|
|
|
|
Thanks to Juho Nurminen of Mattermost for reporting this issue.
|
|
|
|
Updates #60167.
|
|
Fixes #60515.
|
|
Fixes CVE-2023-29402.
|
|
|
|
Change-Id: If55d0400c02beb7a5da5eceac60f1abeac99f064
|
|
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1882606
|
|
Reviewed-by: Roland Shoemaker <bracewell@google.com>
|
|
Run-TryBot: Roland Shoemaker <bracewell@google.com>
|
|
Reviewed-by: Russ Cox <rsc@google.com>
|
|
Reviewed-by: Damien Neil <dneil@google.com>
|
|
(cherry picked from commit 41f9046495564fc728d6f98384ab7276450ac7e2)
|
|
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1902229
|
|
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1904343
|
|
Reviewed-by: Michael Knyszek <mknyszek@google.com>
|
|
Reviewed-by: Bryan Mills <bcmills@google.com>
|
|
Reviewed-on: https://go-review.googlesource.com/c/go/+/501218
|
|
Run-TryBot: David Chase <drchase@google.com>
|
|
Auto-Submit: Michael Knyszek <mknyszek@google.com>
|
|
TryBot-Result: Gopher Robot <gobot@golang.org>
|
|
|
|
Upstream-Status: Backport [https://github.com/golang/go/commit/c160b49b6d328c86bd76ca2fff9009a71347333f]
|
|
CVE: CVE-2023-29402
|
|
Signed-off-by: Hitendra Prajapati <hprajapati@mvista.com>
|
|
---
|
|
src/cmd/go/internal/load/pkg.go | 4 +
|
|
src/cmd/go/internal/work/exec.go | 6 ++
|
|
src/cmd/go/script_test.go | 1 +
|
|
.../go/testdata/script/build_cwd_newline.txt | 100 ++++++++++++++++++
|
|
4 files changed, 111 insertions(+)
|
|
create mode 100644 src/cmd/go/testdata/script/build_cwd_newline.txt
|
|
|
|
diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go
|
|
index 369a79b..d2b63b0 100644
|
|
--- a/src/cmd/go/internal/load/pkg.go
|
|
+++ b/src/cmd/go/internal/load/pkg.go
|
|
@@ -1697,6 +1697,10 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) {
|
|
setError(ImportErrorf(p.ImportPath, "invalid import path %q", p.ImportPath))
|
|
return
|
|
}
|
|
+ if strings.ContainsAny(p.Dir, "\r\n") {
|
|
+ setError(fmt.Errorf("invalid package directory %q", p.Dir))
|
|
+ return
|
|
+ }
|
|
|
|
// Build list of imported packages and full dependency list.
|
|
imports := make([]*Package, 0, len(p.Imports))
|
|
diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go
|
|
index 9a9650b..050b785 100644
|
|
--- a/src/cmd/go/internal/work/exec.go
|
|
+++ b/src/cmd/go/internal/work/exec.go
|
|
@@ -458,6 +458,12 @@ func (b *Builder) build(a *Action) (err error) {
|
|
b.Print(a.Package.ImportPath + "\n")
|
|
}
|
|
|
|
+ if p.Error != nil {
|
|
+ // Don't try to build anything for packages with errors. There may be a
|
|
+ // problem with the inputs that makes the package unsafe to build.
|
|
+ return p.Error
|
|
+ }
|
|
+
|
|
if a.Package.BinaryOnly {
|
|
p.Stale = true
|
|
p.StaleReason = "binary-only packages are no longer supported"
|
|
diff --git a/src/cmd/go/script_test.go b/src/cmd/go/script_test.go
|
|
index ec498bb..a1398ad 100644
|
|
--- a/src/cmd/go/script_test.go
|
|
+++ b/src/cmd/go/script_test.go
|
|
@@ -123,6 +123,7 @@ func (ts *testScript) setup() {
|
|
"devnull=" + os.DevNull,
|
|
"goversion=" + goVersion(ts),
|
|
":=" + string(os.PathListSeparator),
|
|
+ "newline=\n",
|
|
}
|
|
|
|
if runtime.GOOS == "plan9" {
|
|
diff --git a/src/cmd/go/testdata/script/build_cwd_newline.txt b/src/cmd/go/testdata/script/build_cwd_newline.txt
|
|
new file mode 100644
|
|
index 0000000..61c6966
|
|
--- /dev/null
|
|
+++ b/src/cmd/go/testdata/script/build_cwd_newline.txt
|
|
@@ -0,0 +1,100 @@
|
|
+[windows] skip 'filesystem normalizes / to \'
|
|
+[plan9] skip 'filesystem disallows \n in paths'
|
|
+
|
|
+# If the directory path containing a package to be built includes a newline,
|
|
+# the go command should refuse to even try to build the package.
|
|
+
|
|
+env DIR=$WORK${/}${newline}'package main'${newline}'func main() { panic("uh-oh")'${newline}'/*'
|
|
+
|
|
+mkdir $DIR
|
|
+cd $DIR
|
|
+exec pwd
|
|
+cp $WORK/go.mod ./go.mod
|
|
+cp $WORK/main.go ./main.go
|
|
+cp $WORK/main_test.go ./main_test.go
|
|
+
|
|
+! go build -o $devnull .
|
|
+stderr 'package example: invalid package directory .*uh-oh'
|
|
+
|
|
+! go build -o $devnull main.go
|
|
+stderr 'package command-line-arguments: invalid package directory .*uh-oh'
|
|
+
|
|
+! go run .
|
|
+stderr 'package example: invalid package directory .*uh-oh'
|
|
+
|
|
+! go run main.go
|
|
+stderr 'package command-line-arguments: invalid package directory .*uh-oh'
|
|
+
|
|
+! go test .
|
|
+stderr 'package example: invalid package directory .*uh-oh'
|
|
+
|
|
+! go test -v main.go main_test.go
|
|
+stderr 'package command-line-arguments: invalid package directory .*uh-oh'
|
|
+
|
|
+
|
|
+# Since we do preserve $PWD (or set it appropriately) for commands, and we do
|
|
+# not resolve symlinks unnecessarily, referring to the contents of the unsafe
|
|
+# directory via a safe symlink should be ok, and should not inject the data from
|
|
+# the symlink target path.
|
|
+
|
|
+[!symlink] stop 'remainder of test checks symlink behavior'
|
|
+[short] stop 'links and runs binaries'
|
|
+
|
|
+symlink $WORK${/}link -> $DIR
|
|
+
|
|
+go run $WORK${/}link${/}main.go
|
|
+! stdout panic
|
|
+! stderr panic
|
|
+stderr '^ok$'
|
|
+
|
|
+go test -v $WORK${/}link${/}main.go $WORK${/}link${/}main_test.go
|
|
+! stdout panic
|
|
+! stderr panic
|
|
+stdout '^ok$' # 'go test' combines the test's stdout into stderr
|
|
+
|
|
+cd $WORK/link
|
|
+
|
|
+! go run $DIR${/}main.go
|
|
+stderr 'package command-line-arguments: invalid package directory .*uh-oh'
|
|
+
|
|
+go run .
|
|
+! stdout panic
|
|
+! stderr panic
|
|
+stderr '^ok$'
|
|
+
|
|
+go run main.go
|
|
+! stdout panic
|
|
+! stderr panic
|
|
+stderr '^ok$'
|
|
+
|
|
+go test -v
|
|
+! stdout panic
|
|
+! stderr panic
|
|
+stdout '^ok$' # 'go test' combines the test's stdout into stderr
|
|
+
|
|
+go test -v .
|
|
+! stdout panic
|
|
+! stderr panic
|
|
+stdout '^ok$' # 'go test' combines the test's stdout into stderr
|
|
+
|
|
+
|
|
+-- $WORK/go.mod --
|
|
+module example
|
|
+go 1.19
|
|
+-- $WORK/main.go --
|
|
+package main
|
|
+
|
|
+import "C"
|
|
+
|
|
+func main() {
|
|
+ /* nothing here */
|
|
+ println("ok")
|
|
+}
|
|
+-- $WORK/main_test.go --
|
|
+package main
|
|
+
|
|
+import "testing"
|
|
+
|
|
+func TestMain(*testing.M) {
|
|
+ main()
|
|
+}
|
|
--
|
|
2.25.1
|
|
|