Skip to content

Commit 07e3195

Browse files
[release-branch.go1.15-security] all: introduce and use internal/execabs
Introduces a wrapper around os/exec, internal/execabs, for use in all commands. This wrapper prevents exec.LookPath and exec.Command from running executables in the current directory. All imports of os/exec in non-test files in cmd/ are replaced with imports of internal/execabs. This issue was reported by RyotaK. Fixes CVE-2021-3115 Change-Id: I0423451a6e27ec1e1d6f3fe929ab1ef69145c08f Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/955304 Reviewed-by: Russ Cox <[email protected]> Reviewed-by: Katie Hockman <[email protected]> (cherry picked from commit 44f09a6990ccf4db601cbf8208c89ac4e888f884) Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/955308
1 parent b210522 commit 07e3195

File tree

38 files changed

+221
-36
lines changed

38 files changed

+221
-36
lines changed

src/cmd/api/goapi.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ import (
1616
"go/parser"
1717
"go/token"
1818
"go/types"
19+
exec "internal/execabs"
1920
"io"
2021
"io/ioutil"
2122
"log"
2223
"os"
23-
"os/exec"
2424
"path/filepath"
2525
"regexp"
2626
"runtime"

src/cmd/api/run.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ package main
1010

1111
import (
1212
"fmt"
13+
exec "internal/execabs"
1314
"log"
1415
"os"
15-
"os/exec"
1616
"path/filepath"
1717
"runtime"
1818
"strings"

src/cmd/cgo/out.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ import (
1313
"go/ast"
1414
"go/printer"
1515
"go/token"
16+
exec "internal/execabs"
1617
"internal/xcoff"
1718
"io"
1819
"io/ioutil"
1920
"os"
20-
"os/exec"
2121
"path/filepath"
2222
"regexp"
2323
"sort"

src/cmd/cgo/util.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import (
88
"bytes"
99
"fmt"
1010
"go/token"
11+
exec "internal/execabs"
1112
"io/ioutil"
1213
"os"
13-
"os/exec"
1414
)
1515

1616
// run runs the command argv, feeding in stdin on standard input.

src/cmd/compile/internal/ssa/html.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import (
99
"cmd/internal/src"
1010
"fmt"
1111
"html"
12+
exec "internal/execabs"
1213
"io"
1314
"os"
14-
"os/exec"
1515
"path/filepath"
1616
"strconv"
1717
"strings"

src/cmd/cover/func.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ import (
1515
"go/ast"
1616
"go/parser"
1717
"go/token"
18+
exec "internal/execabs"
1819
"io"
1920
"os"
20-
"os/exec"
2121
"path"
2222
"path/filepath"
2323
"runtime"

src/cmd/cover/testdata/toolexec.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ package main
1616

1717
import (
1818
"os"
19-
"os/exec"
19+
exec "internal/execabs"
2020
"strings"
2121
)
2222

src/cmd/dist/buildtool.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,8 +302,10 @@ func bootstrapFixImports(srcFile string) string {
302302
continue
303303
}
304304
if strings.HasPrefix(line, `import "`) || strings.HasPrefix(line, `import . "`) ||
305-
inBlock && (strings.HasPrefix(line, "\t\"") || strings.HasPrefix(line, "\t. \"")) {
305+
inBlock && (strings.HasPrefix(line, "\t\"") || strings.HasPrefix(line, "\t. \"") || strings.HasPrefix(line, "\texec \"")) {
306306
line = strings.Replace(line, `"cmd/`, `"bootstrap/cmd/`, -1)
307+
// During bootstrap, must use plain os/exec.
308+
line = strings.Replace(line, `exec "internal/execabs"`, `"os/exec"`, -1)
307309
for _, dir := range bootstrapDirs {
308310
if strings.HasPrefix(dir, "cmd/") {
309311
continue

src/cmd/doc/dirs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ package main
77
import (
88
"bytes"
99
"fmt"
10+
exec "internal/execabs"
1011
"log"
1112
"os"
12-
"os/exec"
1313
"path/filepath"
1414
"regexp"
1515
"strings"

src/cmd/fix/typecheck.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import (
99
"go/ast"
1010
"go/parser"
1111
"go/token"
12+
exec "internal/execabs"
1213
"io/ioutil"
1314
"os"
14-
"os/exec"
1515
"path/filepath"
1616
"reflect"
1717
"runtime"

src/cmd/go/internal/base/base.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ package base
99
import (
1010
"flag"
1111
"fmt"
12+
exec "internal/execabs"
1213
"log"
1314
"os"
14-
"os/exec"
1515
"strings"
1616
"sync"
1717

src/cmd/go/internal/bug/bug.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ package bug
88
import (
99
"bytes"
1010
"fmt"
11+
exec "internal/execabs"
1112
"io"
1213
"io/ioutil"
1314
urlpkg "net/url"
1415
"os"
15-
"os/exec"
1616
"path/filepath"
1717
"regexp"
1818
"runtime"

src/cmd/go/internal/generate/generate.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ import (
1111
"fmt"
1212
"go/parser"
1313
"go/token"
14+
exec "internal/execabs"
1415
"io"
1516
"io/ioutil"
1617
"log"
1718
"os"
18-
"os/exec"
1919
"path/filepath"
2020
"regexp"
2121
"strconv"

src/cmd/go/internal/modfetch/codehost/codehost.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ import (
1010
"bytes"
1111
"crypto/sha256"
1212
"fmt"
13+
exec "internal/execabs"
1314
"io"
1415
"io/ioutil"
1516
"os"
16-
"os/exec"
1717
"path/filepath"
1818
"strings"
1919
"sync"

src/cmd/go/internal/modfetch/codehost/git.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ import (
88
"bytes"
99
"errors"
1010
"fmt"
11+
exec "internal/execabs"
1112
"io"
1213
"io/ioutil"
1314
"net/url"
1415
"os"
15-
"os/exec"
1616
"path/filepath"
1717
"sort"
1818
"strconv"

src/cmd/go/internal/test/genflags.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ package main
99
import (
1010
"bytes"
1111
"flag"
12+
exec "internal/execabs"
1213
"log"
1314
"os"
14-
"os/exec"
1515
"strings"
1616
"testing"
1717
"text/template"

src/cmd/go/internal/test/test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ import (
1010
"errors"
1111
"fmt"
1212
"go/build"
13+
exec "internal/execabs"
1314
"io"
1415
"io/ioutil"
1516
"os"
16-
"os/exec"
1717
"path"
1818
"path/filepath"
1919
"regexp"

src/cmd/go/internal/tool/tool.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ package tool
77

88
import (
99
"fmt"
10+
exec "internal/execabs"
1011
"os"
11-
"os/exec"
1212
"sort"
1313
"strings"
1414

src/cmd/go/internal/vet/vetflag.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import (
1010
"errors"
1111
"flag"
1212
"fmt"
13+
exec "internal/execabs"
1314
"log"
1415
"os"
15-
"os/exec"
1616
"path/filepath"
1717
"strings"
1818

src/cmd/go/internal/work/build.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import (
88
"errors"
99
"fmt"
1010
"go/build"
11+
exec "internal/execabs"
1112
"os"
12-
"os/exec"
1313
"path/filepath"
1414
"runtime"
1515
"strings"

src/cmd/go/internal/work/buildid.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ package work
77
import (
88
"bytes"
99
"fmt"
10+
exec "internal/execabs"
1011
"io/ioutil"
1112
"os"
12-
"os/exec"
1313
"strings"
1414

1515
"cmd/go/internal/base"

src/cmd/go/internal/work/exec.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ import (
1111
"encoding/json"
1212
"errors"
1313
"fmt"
14+
exec "internal/execabs"
1415
"internal/lazyregexp"
1516
"io"
1617
"io/ioutil"
1718
"log"
1819
"math/rand"
1920
"os"
20-
"os/exec"
2121
"path/filepath"
2222
"regexp"
2323
"runtime"

src/cmd/go/internal/work/gccgo.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ package work
66

77
import (
88
"fmt"
9+
exec "internal/execabs"
910
"io/ioutil"
1011
"os"
11-
"os/exec"
1212
"path/filepath"
1313
"strings"
1414

src/cmd/go/testdata/addmod.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525
"io/ioutil"
2626
"log"
2727
"os"
28-
"os/exec"
28+
exec "internal/execabs"
2929
"path/filepath"
3030
"strings"
3131

src/cmd/internal/browser/browser.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
package browser
77

88
import (
9+
exec "internal/execabs"
910
"os"
10-
"os/exec"
1111
"runtime"
1212
"time"
1313
)

src/cmd/internal/diff/diff.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
package diff
88

99
import (
10+
exec "internal/execabs"
1011
"io/ioutil"
1112
"os"
12-
"os/exec"
1313
"runtime"
1414
)
1515

src/cmd/internal/dwarf/dwarf.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
"cmd/internal/objabi"
1313
"errors"
1414
"fmt"
15-
"os/exec"
15+
exec "internal/execabs"
1616
"sort"
1717
"strconv"
1818
"strings"

src/cmd/link/internal/ld/execarchive.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
package ld
88

99
import (
10+
exec "internal/execabs"
1011
"os"
11-
"os/exec"
1212
"path/filepath"
1313
"syscall"
1414
)

src/cmd/link/internal/ld/lib.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,11 @@ import (
5050
"encoding/binary"
5151
"encoding/hex"
5252
"fmt"
53+
exec "internal/execabs"
5354
"io"
5455
"io/ioutil"
5556
"log"
5657
"os"
57-
"os/exec"
5858
"path/filepath"
5959
"runtime"
6060
"sort"

src/cmd/test2json/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ package main
8282
import (
8383
"flag"
8484
"fmt"
85+
exec "internal/execabs"
8586
"io"
8687
"os"
87-
"os/exec"
8888

8989
"cmd/internal/test2json"
9090
)

src/cmd/trace/pprof.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ package main
99
import (
1010
"bufio"
1111
"fmt"
12+
exec "internal/execabs"
1213
"internal/trace"
1314
"io"
1415
"io/ioutil"
1516
"net/http"
1617
"os"
17-
"os/exec"
1818
"path/filepath"
1919
"runtime"
2020
"sort"

src/go/build/build.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ import (
1212
"go/doc"
1313
"go/parser"
1414
"go/token"
15+
exec "internal/execabs"
1516
"internal/goroot"
1617
"internal/goversion"
1718
"io"
1819
"io/ioutil"
1920
"os"
20-
"os/exec"
2121
pathpkg "path"
2222
"path/filepath"
2323
"runtime"

src/go/build/deps_test.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ var depsRules = `
161161
reflect !< OS;
162162
163163
OS
164-
< golang.org/x/sys/cpu, internal/goroot;
164+
< golang.org/x/sys/cpu;
165165
166166
# FMT is OS (which includes string routines) plus reflect and fmt.
167167
# It does not include package log, which should be avoided in core packages.
@@ -177,6 +177,12 @@ var depsRules = `
177177
178178
log !< FMT;
179179
180+
OS, FMT
181+
< internal/execabs;
182+
183+
OS, internal/execabs
184+
< internal/goroot;
185+
180186
# Misc packages needing only FMT.
181187
FMT
182188
< flag,

src/go/internal/gccgoimporter/gccgoinstallation.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ package gccgoimporter
77
import (
88
"bufio"
99
"go/types"
10+
exec "internal/execabs"
1011
"os"
11-
"os/exec"
1212
"path/filepath"
1313
"strings"
1414
)

0 commit comments

Comments
 (0)