From e6ccc740d8a5becc9d900b3fb459fbda0bd1c915 Mon Sep 17 00:00:00 2001 From: Pogobanane Date: Sun, 10 Jul 2022 15:29:55 +0200 Subject: [PATCH] darwin: impl SecureSymlinkChown --- pkgs/sops-install-secrets/darwin.go | 52 ++++++++++++++++++----------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/pkgs/sops-install-secrets/darwin.go b/pkgs/sops-install-secrets/darwin.go index af1ff35..6e1c2de 100644 --- a/pkgs/sops-install-secrets/darwin.go +++ b/pkgs/sops-install-secrets/darwin.go @@ -3,29 +3,43 @@ package main -func SecureSymlinkChown(symlinkToCheck, expectedTarget string, owner, group int) error { - //fd, err := unix.Open(symlinkToCheck, unix.O_CLOEXEC|unix.O_PATH|unix.O_NOFOLLOW, 0) - //if err != nil { - // return fmt.Errorf("Failed to open %s: %w", symlinkToCheck, err) - //} - //defer unix.Close(fd) +import ( + "fmt" + "os" - //buf := make([]byte, len(expectedTarget)+1) // oversize by one to detect trunc - //n, err := unix.Readlinkat(fd, "", buf) - //if err != nil { - // return fmt.Errorf("couldn't readlinkat %s", symlinkToCheck) - //} - //if n > len(expectedTarget) || string(buf[:n]) != expectedTarget { - // return fmt.Errorf("symlink %s does not point to %s", symlinkToCheck, expectedTarget) - //} - //err = unix.Fchownat(fd, "", owner, group, unix.AT_EMPTY_PATH) - //if err != nil { - // return fmt.Errorf("cannot change owner of '%s' to %d/%d: %w", symlinkToCheck, owner, group, err) - //} + "golang.org/x/sys/unix" +) + +func SecureSymlinkChown(symlinkToCheck string, expectedTarget string, owner, group int) error { + // not sure what O_PATH is needed for anyways + fd, err := unix.Open(symlinkToCheck, unix.O_CLOEXEC|unix.O_SYMLINK|unix.O_NOFOLLOW, 0) + if err != nil { + return fmt.Errorf("Failed to open %s: %w", symlinkToCheck, err) + } + defer unix.Close(fd) + + buf := make([]byte, len(expectedTarget)+1) // oversize by one to detect trunc + n, err := unix.Readlinkat(fd, "", buf) + if err != nil { + return fmt.Errorf("couldn't readlinkat %s", symlinkToCheck) + } + if n > len(expectedTarget) || string(buf[:n]) != expectedTarget { + return fmt.Errorf("symlink %s does not point to %s", symlinkToCheck, expectedTarget) + } + err = unix.Fchownat(fd, "", owner, group, unix.AT_SYMLINK_NOFOLLOW) + if err != nil { + return fmt.Errorf("cannot change owner of '%s' to %d/%d: %w", symlinkToCheck, owner, group, err) + } return nil } -func MountSecretFs(mountpoint string, keysGid int) error { +// NUMSECTORS=128000 # a sector is 512 bytes +// mydev=`hdiutil attach -nomount ram://$NUMSECTORS` +// newfs_hfs $mydev +// mkdir /tmp/mymount +// mount -t hfs $mydev /tmp/mymount + +func MountSecretFs(mountpoint string, keysGid int, userMode bool) error { //if err := os.MkdirAll(mountpoint, 0751); err != nil { // return fmt.Errorf("Cannot create directory '%s': %w", mountpoint, err) //}