diff --git a/internal/client/supervisor/windows/native_windows.go b/internal/client/supervisor/windows/native_windows.go index f9b978c..dbe28a3 100644 --- a/internal/client/supervisor/windows/native_windows.go +++ b/internal/client/supervisor/windows/native_windows.go @@ -572,15 +572,39 @@ func openTokenForAttempt(contextName ExecutionContext, candidate *SessionCandida // privileges, disables the built-in Administrators SID, and verifies medium // integrity before the token is returned to the launch path. func createRestrictedMediumToken(source winapi.Token) (winapi.Token, error) { - adminSID, err := winapi.CreateWellKnownSid(winapi.WinBuiltinAdministratorsSid) - if err != nil { - return 0, err + // A full administrator token may carry several built-in groups that grant + // privileged access even after the administrator SID is hidden. Disable the + // complete known privilege-bearing built-in set before forcing medium + // integrity; membership itself is retained in the token evidence, but these + // groups cannot authorize the normal command. + disabledTypes := []winapi.WELL_KNOWN_SID_TYPE{ + winapi.WinBuiltinAdministratorsSid, + winapi.WinBuiltinPowerUsersSid, + winapi.WinBuiltinAccountOperatorsSid, + winapi.WinBuiltinSystemOperatorsSid, + winapi.WinBuiltinPrintOperatorsSid, + winapi.WinBuiltinBackupOperatorsSid, + winapi.WinBuiltinRemoteDesktopUsersSid, + winapi.WinBuiltinNetworkConfigurationOperatorsSid, + winapi.WinBuiltinPerfMonitoringUsersSid, + winapi.WinBuiltinPerfLoggingUsersSid, + winapi.WinBuiltinDCOMUsersSid, + winapi.WinBuiltinCryptoOperatorsSid, + winapi.WinBuiltinHyperVAdminsSid, + winapi.WinBuiltinRemoteManagementUsersSid, + } + disabled := make([]winapi.SIDAndAttributes, len(disabledTypes)) + for index, sidType := range disabledTypes { + sid, err := winapi.CreateWellKnownSid(sidType) + if err != nil { + return 0, err + } + disabled[index] = winapi.SIDAndAttributes{Sid: sid} } - disabled := winapi.SIDAndAttributes{Sid: adminSID} var restricted winapi.Token result, _, callErr := procCreateRestrictedToken.Call( uintptr(source), disableMaxPrivilege, - 1, uintptr(unsafe.Pointer(&disabled)), + uintptr(len(disabled)), uintptr(unsafe.Pointer(&disabled[0])), 0, 0, 0, 0, uintptr(unsafe.Pointer(&restricted)),