]> Cypherpunks.ru repositories - gostls13.git/commitdiff
[release-branch.go1.20] cmd/go: enforce flags with non-optional arguments
authorRoland Shoemaker <bracewell@google.com>
Fri, 5 May 2023 20:10:34 +0000 (13:10 -0700)
committerGopher Robot <gobot@golang.org>
Tue, 6 Jun 2023 17:03:00 +0000 (17:03 +0000)
Enforce that linker flags which expect arguments get them, otherwise it
may be possible to smuggle unexpected flags through as the linker can
consume what looks like a flag as an argument to a preceding flag (i.e.
"-Wl,-O -Wl,-R,-bad-flag" is interpreted as "-O=-R -bad-flag"). Also be
somewhat more restrictive in the general format of some flags.

Thanks to Juho Nurminen of Mattermost for reporting this issue.

Updates #60305
Fixes #60512
Fixes CVE-2023-29404

Change-Id: I5989f68d21a8851d8edd47f08550850524ee9180
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1876275
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Damien Neil <dneil@google.com>
(cherry picked from commit 896779503cf754cbdac24b61d4cc953b50fe2dde)
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1902226
TryBot-Result: Security TryBots <security-trybots@go-security-trybots.iam.gserviceaccount.com>
Run-TryBot: Roland Shoemaker <bracewell@google.com>
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1904346
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/501221
Run-TryBot: David Chase <drchase@google.com>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/cmd/go/internal/work/security.go
src/cmd/go/internal/work/security_test.go

index f4f1880c846aec7c7b3d7bd9f5b819d05b2320c6..270a34e9c7cf7fbd689f85114c6a1d0f87b434d6 100644 (file)
@@ -180,10 +180,10 @@ var validLinkerFlags = []*lazyregexp.Regexp{
        re(`-Wl,-berok`),
        re(`-Wl,-Bstatic`),
        re(`-Wl,-Bsymbolic-functions`),
-       re(`-Wl,-O([^@,\-][^,]*)?`),
+       re(`-Wl,-O[0-9]+`),
        re(`-Wl,-d[ny]`),
        re(`-Wl,--disable-new-dtags`),
-       re(`-Wl,-e[=,][a-zA-Z0-9]*`),
+       re(`-Wl,-e[=,][a-zA-Z0-9]+`),
        re(`-Wl,--enable-new-dtags`),
        re(`-Wl,--end-group`),
        re(`-Wl,--(no-)?export-dynamic`),
@@ -192,7 +192,7 @@ var validLinkerFlags = []*lazyregexp.Regexp{
        re(`-Wl,--hash-style=(sysv|gnu|both)`),
        re(`-Wl,-headerpad_max_install_names`),
        re(`-Wl,--no-undefined`),
-       re(`-Wl,-R([^@\-][^,@]*$)`),
+       re(`-Wl,-R,?([^@\-,][^,@]*$)`),
        re(`-Wl,--just-symbols[=,]([^,@\-][^,@]+)`),
        re(`-Wl,-rpath(-link)?[=,]([^,@\-][^,]+)`),
        re(`-Wl,-s`),
index 8cecc74eae3cce5c185a0786cfcefffc63b927bd..c05ba7b9a472e3dbab12c5c70b5d4bd50c865620 100644 (file)
@@ -230,6 +230,11 @@ var badLinkerFlags = [][]string{
        {"-Wl,-R,@foo"},
        {"-Wl,--just-symbols,@foo"},
        {"../x.o"},
+       {"-Wl,-R,"},
+       {"-Wl,-O"},
+       {"-Wl,-e="},
+       {"-Wl,-e,"},
+       {"-Wl,-R,-flag"},
 }
 
 func TestCheckLinkerFlags(t *testing.T) {