From ccca0b55ca899e31ed1a440b61e76c67d15e6275 Mon Sep 17 00:00:00 2001 From: ubeddulla khan Date: Thu, 15 Oct 2026 14:41:24 +0530 Subject: [PATCH 1/2] internal/driver: create temp files with owner-only permissions newTempFile opened files with mode 0666, so after the usual umask they end up world- or group-readable (0644) in shared directories such as os.TempDir(). The files hold fetched and converted profile data and the generated report output, so on a multi-user host another local user can read them. Open them with 0600 instead, matching os.CreateTemp. --- internal/driver/tempfile.go | 2 +- internal/driver/tempfile_test.go | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/internal/driver/tempfile.go b/internal/driver/tempfile.go index b6c8776ff8..ed48368bf8 100644 --- a/internal/driver/tempfile.go +++ b/internal/driver/tempfile.go @@ -24,7 +24,7 @@ import ( // newTempFile returns a new output file in dir with the provided prefix and suffix. func newTempFile(dir, prefix, suffix string) (*os.File, error) { for index := 1; index < 10000; index++ { - switch f, err := os.OpenFile(filepath.Join(dir, fmt.Sprintf("%s%03d%s", prefix, index, suffix)), os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666); { + switch f, err := os.OpenFile(filepath.Join(dir, fmt.Sprintf("%s%03d%s", prefix, index, suffix)), os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600); { case err == nil: return f, nil case !os.IsExist(err): diff --git a/internal/driver/tempfile_test.go b/internal/driver/tempfile_test.go index 70043534c1..41f27e4fc2 100644 --- a/internal/driver/tempfile_test.go +++ b/internal/driver/tempfile_test.go @@ -2,10 +2,31 @@ package driver import ( "os" + "runtime" "sync" "testing" ) +func TestNewTempFilePermissions(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("file permission bits are not meaningful on Windows") + } + f, err := newTempFile(t.TempDir(), "profile", ".tmp") + if err != nil { + t.Fatalf("newTempFile(): got %v, want no error", err) + } + defer f.Close() + fi, err := f.Stat() + if err != nil { + t.Fatalf("Stat(): got %v, want no error", err) + } + // Temp files can hold profile data, so they must not be readable or + // writable by group or other users. + if perm := fi.Mode().Perm(); perm&0077 != 0 { + t.Errorf("newTempFile() created a file with mode %#o, want no group/other access", perm) + } +} + func TestNewTempFile(t *testing.T) { const n = 100 // Line up ready to execute goroutines with a read-write lock. From 40f3d3ffcc342003ed9d9ec270eb40eedaa13f56 Mon Sep 17 00:00:00 2001 From: ubeddulla khan Date: Fri, 16 Oct 2026 18:54:29 +0530 Subject: [PATCH 2/2] internal/driver: fold temp file permission check into TestNewTempFile --- internal/driver/tempfile_test.go | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/internal/driver/tempfile_test.go b/internal/driver/tempfile_test.go index 41f27e4fc2..1f38e72ac8 100644 --- a/internal/driver/tempfile_test.go +++ b/internal/driver/tempfile_test.go @@ -7,26 +7,6 @@ import ( "testing" ) -func TestNewTempFilePermissions(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip("file permission bits are not meaningful on Windows") - } - f, err := newTempFile(t.TempDir(), "profile", ".tmp") - if err != nil { - t.Fatalf("newTempFile(): got %v, want no error", err) - } - defer f.Close() - fi, err := f.Stat() - if err != nil { - t.Fatalf("Stat(): got %v, want no error", err) - } - // Temp files can hold profile data, so they must not be readable or - // writable by group or other users. - if perm := fi.Mode().Perm(); perm&0077 != 0 { - t.Errorf("newTempFile() created a file with mode %#o, want no group/other access", perm) - } -} - func TestNewTempFile(t *testing.T) { const n = 100 // Line up ready to execute goroutines with a read-write lock. @@ -66,6 +46,13 @@ func TestNewTempFile(t *testing.T) { break } names[name] = true + // Temp files can hold profile data, so they must not be accessible + // by group or other users. + if fi, err := os.Stat(name); err != nil { + t.Errorf("Stat(%s): got error %v, want no error", name, err) + } else if perm := fi.Mode().Perm(); runtime.GOOS != "windows" && perm&0077 != 0 { + t.Errorf("temp file %s has mode %#o, want no group/other access", name, perm) + } } if err := cleanupTempFiles(); err != nil { t.Errorf("cleanupTempFiles(): got error %v, want no error", err)