|
@@ -240,7 +240,8 @@ func (pb *PluginBroker) loadNotificationPlugin(name string, binaryPath string) (
|
|
|
return nil, err
|
|
|
}
|
|
|
cmd := exec.Command(binaryPath)
|
|
|
- cmd.SysProcAttr, err = getProccessAtr(pb.pluginProcConfig.User, pb.pluginProcConfig.Group)
|
|
|
+ cmd.SysProcAttr, err = getProcessAtr(pb.pluginProcConfig.User, pb.pluginProcConfig.Group)
|
|
|
+ cmd.SysProcAttr.Credential.NoSetGroups = true
|
|
|
if err != nil {
|
|
|
return nil, errors.Wrap(err, "while getting process attributes")
|
|
|
}
|
|
@@ -350,10 +351,18 @@ func pluginIsValid(path string) error {
|
|
|
return errors.Wrap(err, fmt.Sprintf("plugin at %s does not exist", path))
|
|
|
}
|
|
|
|
|
|
- // check if it is owned by root
|
|
|
+ // check if it is owned by current user
|
|
|
+ currentUser, err := user.Current()
|
|
|
+ if err != nil {
|
|
|
+ return errors.Wrap(err, "while getting current user")
|
|
|
+ }
|
|
|
+ procAttr, err := getProcessAtr(currentUser.Username, currentUser.Username)
|
|
|
+ if err != nil {
|
|
|
+ return errors.Wrap(err, "while getting process attributes")
|
|
|
+ }
|
|
|
stat := details.Sys().(*syscall.Stat_t)
|
|
|
- if stat.Uid != 0 || stat.Gid != 0 {
|
|
|
- return fmt.Errorf("plugin at %s is not owned by root user and group", path)
|
|
|
+ if stat.Uid != procAttr.Credential.Uid || stat.Gid != procAttr.Credential.Gid {
|
|
|
+ return fmt.Errorf("plugin at %s is not owned by %s user and group", path, currentUser.Username)
|
|
|
}
|
|
|
|
|
|
if (int(details.Mode()) & 2) != 0 {
|
|
@@ -387,7 +396,7 @@ func getPluginTypeAndSubtypeFromPath(path string) (string, string, error) {
|
|
|
return strings.Join(parts[:len(parts)-1], "-"), parts[len(parts)-1], nil
|
|
|
}
|
|
|
|
|
|
-func getProccessAtr(username string, groupname string) (*syscall.SysProcAttr, error) {
|
|
|
+func getProcessAtr(username string, groupname string) (*syscall.SysProcAttr, error) {
|
|
|
u, err := user.Lookup(username)
|
|
|
if err != nil {
|
|
|
return nil, err
|