Skip to content

Commit

Permalink
cmd/go: reject toolchain directives containing path separators
Browse files Browse the repository at this point in the history
If GOTOOLCHAIN="path" or "auto", the go command uses exec.LookPath to
search for it in order to allow toolchains to refer to local-only
toolchain variants (such as toolchains built from enterprise- or
distro-patched source). However, those toolchains should only be
resolved from $PATH, not relative to the working directory of the
command.

Thanks to Juho Nurminen of Mattermost for reporting this issue.

Fixes #62198.
Fixes CVE-2023-39320.

Change-Id: I247c7acea95d737362dd0475e9fc8515430d0fcc
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1996318
Run-TryBot: Roland Shoemaker <bracewell@google.com>
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Roland Shoemaker <bracewell@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/526158
Reviewed-by: Bryan Mills <bcmills@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
  • Loading branch information
Bryan C. Mills authored and cherrymui committed Sep 6, 2023
1 parent b2f8f6c commit a0c3a1b
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 0 deletions.
7 changes: 7 additions & 0 deletions src/cmd/go/internal/gover/toolchain.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@ import (
// FromToolchain("go1.2.3-bigcorp") == "1.2.3"
// FromToolchain("invalid") == ""
func FromToolchain(name string) string {
if strings.ContainsAny(name, "\\/") {
// The suffix must not include a path separator, since that would cause
// exec.LookPath to resolve it from a relative directory instead of from
// $PATH.
return ""
}

var v string
if strings.HasPrefix(name, "go") {
v = name[2:]
Expand Down
32 changes: 32 additions & 0 deletions src/cmd/go/testdata/script/mod_toolchain_slash.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
[!exec:/bin/sh] skip

chmod 0777 go1.999999-/run.sh
chmod 0777 run.sh

! go list all
! stdout 'RAN SCRIPT'

cd subdir
! go list all
! stdout 'RAN SCRIPT'

-- go.mod --
module exploit

go 1.21
toolchain go1.999999-/run.sh
-- go1.999999-/run.sh --
#!/bin/sh
printf 'RAN SCRIPT\n'
exit 1
-- run.sh --
#!/bin/sh
printf 'RAN SCRIPT\n'
exit 1
-- subdir/go.mod --
module exploit

go 1.21
toolchain go1.999999-/../../run.sh
-- subdir/go1.999999-/README.txt --
heh heh heh

0 comments on commit a0c3a1b

Please sign in to comment.