]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: allow setting security attributes on processes
authorJason A. Donenfeld <Jason@zx2c4.com>
Sat, 27 Apr 2019 09:45:11 +0000 (11:45 +0200)
committerAlex Brainman <alex.brainman@gmail.com>
Sun, 28 Apr 2019 05:44:03 +0000 (05:44 +0000)
This allows creating processes that can only be debugged/accessed by
certain tokens, according to a particular security descriptor. We
already had everything ready for this but just neglected to pass through
the value from the user-accessible SysProcAttr.

Change-Id: I4a3fcc9f5078aa0058b26c103355c984093ae03f
Reviewed-on: https://go-review.googlesource.com/c/go/+/174197
Run-TryBot: Jason Donenfeld <Jason@zx2c4.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
src/syscall/exec_windows.go

index c78bad8e00680912c08fb4047aeab12fe31edbac..8d6141c0ca6f3914ddb222d8126136739fcedcc7 100644 (file)
@@ -219,10 +219,12 @@ type ProcAttr struct {
 }
 
 type SysProcAttr struct {
-       HideWindow    bool
-       CmdLine       string // used if non-empty, else the windows command line is built by escaping the arguments passed to StartProcess
-       CreationFlags uint32
-       Token         Token // if set, runs new process in the security context represented by the token
+       HideWindow        bool
+       CmdLine           string // used if non-empty, else the windows command line is built by escaping the arguments passed to StartProcess
+       CreationFlags     uint32
+       Token             Token               // if set, runs new process in the security context represented by the token
+       ProcessAttributes *SecurityAttributes // if set, applies these security attributes as the descriptor for the new process
+       ThreadAttributes  *SecurityAttributes // if set, applies these security attributes as the descriptor for the main thread of the new process
 }
 
 var zeroProcAttr ProcAttr
@@ -323,9 +325,9 @@ func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle
 
        flags := sys.CreationFlags | CREATE_UNICODE_ENVIRONMENT
        if sys.Token != 0 {
-               err = CreateProcessAsUser(sys.Token, argv0p, argvp, nil, nil, true, flags, createEnvBlock(attr.Env), dirp, si, pi)
+               err = CreateProcessAsUser(sys.Token, argv0p, argvp, sys.ProcessAttributes, sys.ThreadAttributes, true, flags, createEnvBlock(attr.Env), dirp, si, pi)
        } else {
-               err = CreateProcess(argv0p, argvp, nil, nil, true, flags, createEnvBlock(attr.Env), dirp, si, pi)
+               err = CreateProcess(argv0p, argvp, sys.ProcessAttributes, sys.ThreadAttributes, true, flags, createEnvBlock(attr.Env), dirp, si, pi)
        }
        if err != nil {
                return 0, 0, err