spiegel_podman/libpod/oci_conmon_exec_linux.go
Chris Evich dd73a9c0f1
Fix capability copying
The previous commit replaced setProcessCapabilitiesExec() with a
simplified 3-line inline check.  This only copies container capabilities
when pspec.Capabilities is nil. It doesn't handle --privileged exec
(which needs the full bounding set) and doesn't handle the case where a
non-root exec user matches the container user (which needs
ambient/inheritable caps set). The original method handles both cases
properly.

Also backport commit 68b2450, 6668ac9 but set tags only to support linux
builds (FreeBSD will never again be built from this branch).

Signed-off-by: Chris Evich <cevich@redhat.com>
2026-03-30 15:13:31 -04:00

50 lines
1.6 KiB
Go

//go:build linux
package libpod
import (
"github.com/containers/common/pkg/capabilities"
"github.com/opencontainers/runc/libcontainer/user"
spec "github.com/opencontainers/runtime-spec/specs-go"
)
func (c *Container) setProcessCapabilitiesExec(options *ExecOptions, user string, execUser *user.ExecUser, pspec *spec.Process) error {
// implementation from bare 6668ac9 assumed a non-nil, preserve pre-backport
// behavior so that there can be no nil dereference problems here.
if pspec.Capabilities == nil {
pspec.Capabilities = c.config.Spec.Process.Capabilities
}
if pspec.Capabilities == nil {
pspec.Capabilities = &spec.LinuxCapabilities{}
}
ctrSpec, err := c.specFromState()
if err != nil {
return err
}
allCaps, err := capabilities.BoundingSet()
if err != nil {
return err
}
if options.Privileged {
pspec.Capabilities.Bounding = allCaps
} else {
pspec.Capabilities.Bounding = ctrSpec.Process.Capabilities.Bounding
}
// Always unset the inheritable capabilities similarly to what the Linux kernel does
// They are used only when using capabilities with uid != 0.
pspec.Capabilities.Inheritable = []string{}
if execUser.Uid == 0 {
pspec.Capabilities.Effective = pspec.Capabilities.Bounding
pspec.Capabilities.Permitted = pspec.Capabilities.Bounding
} else if user == c.config.User {
pspec.Capabilities.Effective = ctrSpec.Process.Capabilities.Effective
pspec.Capabilities.Inheritable = ctrSpec.Process.Capabilities.Effective
pspec.Capabilities.Permitted = ctrSpec.Process.Capabilities.Effective
pspec.Capabilities.Ambient = ctrSpec.Process.Capabilities.Effective
}
return nil
}