Skip to content

Commit b9a4909

Browse files
committed
[draft] Switch to github.com/moby/sys/capability v0.4.0
This removes the last unversioned package in runc's direct dependencies. Draft pending moby/sys#176 merge and v0.4.0 release. Signed-off-by: Kir Kolyshkin <[email protected]>
1 parent 54fd6f9 commit b9a4909

File tree

17 files changed

+605
-406
lines changed

17 files changed

+605
-406
lines changed

go.mod

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ require (
1515
github.com/cyphar/filepath-securejoin v0.3.4
1616
github.com/docker/go-units v0.5.0
1717
github.com/godbus/dbus/v5 v5.1.0
18+
github.com/moby/sys/capability v0.4.0
1819
github.com/moby/sys/mountinfo v0.7.2
1920
github.com/moby/sys/user v0.3.0
2021
github.com/moby/sys/userns v0.1.0
@@ -23,7 +24,6 @@ require (
2324
github.com/opencontainers/selinux v1.11.1
2425
github.com/seccomp/libseccomp-golang v0.10.0
2526
github.com/sirupsen/logrus v1.9.3
26-
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635
2727
github.com/urfave/cli v1.22.16
2828
github.com/vishvananda/netlink v1.3.0
2929
golang.org/x/net v0.24.0
@@ -37,3 +37,5 @@ require (
3737
github.com/vishvananda/netns v0.0.4 // indirect
3838
golang.org/x/exp v0.0.0-20230224173230-c95f2b4c22f2 // indirect
3939
)
40+
41+
replace github.com/moby/sys/capability => github.com/kolyshkin/sys/capability v0.0.0-20241101015351-c61ae8843acf

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtL
3131
github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
3232
github.com/jsimonetti/rtnetlink/v2 v2.0.1 h1:xda7qaHDSVOsADNouv7ukSuicKZO7GgVUCXxpaIEIlM=
3333
github.com/jsimonetti/rtnetlink/v2 v2.0.1/go.mod h1:7MoNYNbb3UaDHtF8udiJo/RH6VsTKP1pqKLUTVCvToE=
34+
github.com/kolyshkin/sys/capability v0.0.0-20241101015351-c61ae8843acf h1:qB1RsE/PtOILqvmNPCOLtF/HSjERLAIQ0L9nIvtO9Mw=
35+
github.com/kolyshkin/sys/capability v0.0.0-20241101015351-c61ae8843acf/go.mod h1:4g9IK291rVkms3LKCDOoYlnV8xKwoDTpIrNEE35Wq0I=
3436
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
3537
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
3638
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -73,8 +75,6 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
7375
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
7476
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
7577
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
76-
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI=
77-
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
7878
github.com/urfave/cli v1.22.16 h1:MH0k6uJxdwdeWQTwhSO42Pwr4YLrNLwBtg1MRgTqPdQ=
7979
github.com/urfave/cli v1.22.16/go.mod h1:EeJR6BKodywf4zciqrdw6hpCPk68JO9z5LazXZMn5Po=
8080
github.com/vishvananda/netlink v1.3.0 h1:X7l42GfcV4S6E4vHTsw48qbrV+9PVojNfIhZcwQdrZk=

libcontainer/capabilities/capabilities.go

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,42 +3,38 @@
33
package capabilities
44

55
import (
6+
"fmt"
67
"sort"
78
"strings"
89
"sync"
910

11+
"github.com/moby/sys/capability"
1012
"github.com/opencontainers/runc/libcontainer/configs"
1113
"github.com/sirupsen/logrus"
12-
"github.com/syndtr/gocapability/capability"
1314
)
1415

1516
const allCapabilityTypes = capability.CAPS | capability.BOUNDING | capability.AMBIENT
1617

17-
var (
18-
capTypes = []capability.CapType{
19-
capability.BOUNDING,
20-
capability.PERMITTED,
21-
capability.INHERITABLE,
22-
capability.EFFECTIVE,
23-
capability.AMBIENT,
24-
}
18+
func capToStr(c capability.Cap) string {
19+
return "CAP_" + strings.ToUpper(c.String())
20+
}
2521

26-
capMap = sync.OnceValue(func() map[string]capability.Cap {
27-
cm := make(map[string]capability.Cap, capability.CAP_LAST_CAP+1)
28-
for _, c := range capability.List() {
29-
if c > capability.CAP_LAST_CAP {
30-
continue
31-
}
32-
cm["CAP_"+strings.ToUpper(c.String())] = c
33-
}
34-
return cm
35-
})
36-
)
22+
var capMap = sync.OnceValues(func() (map[string]capability.Cap, error) {
23+
list, err := capability.ListSupported()
24+
if err != nil {
25+
return nil, err
26+
}
27+
cm := make(map[string]capability.Cap, len(list))
28+
for _, c := range list {
29+
cm[capToStr(c)] = c
30+
}
31+
return cm, nil
32+
})
3733

3834
// KnownCapabilities returns the list of the known capabilities.
3935
// Used by `runc features`.
4036
func KnownCapabilities() []string {
41-
list := capability.List()
37+
list := capability.ListKnown()
4238
res := make([]string, len(list))
4339
for i, c := range list {
4440
res[i] = "CAP_" + strings.ToUpper(c.String())
@@ -50,11 +46,12 @@ func KnownCapabilities() []string {
5046
// or Capabilities that are unavailable in the current environment are ignored,
5147
// printing a warning instead.
5248
func New(capConfig *configs.Capabilities) (*Caps, error) {
53-
var (
54-
err error
55-
c Caps
56-
)
49+
var c Caps
5750

51+
_, err := capMap()
52+
if err != nil {
53+
return nil, err
54+
}
5855
unknownCaps := make(map[string]struct{})
5956
c.caps = map[capability.CapType][]capability.Cap{
6057
capability.BOUNDING: capSlice(capConfig.Bounding, unknownCaps),
@@ -76,7 +73,7 @@ func New(capConfig *configs.Capabilities) (*Caps, error) {
7673
// equivalent, and returns them as a slice. Unknown or unavailable capabilities
7774
// are not returned, but appended to unknownCaps.
7875
func capSlice(caps []string, unknownCaps map[string]struct{}) []capability.Cap {
79-
cm := capMap()
76+
cm, _ := capMap()
8077
out := make([]capability.Cap, 0, len(caps))
8178
for _, c := range caps {
8279
if v, ok := cm[c]; !ok {
@@ -113,9 +110,36 @@ func (c *Caps) ApplyBoundingSet() error {
113110

114111
// Apply sets all the capabilities for the current process in the config.
115112
func (c *Caps) ApplyCaps() error {
116-
c.pid.Clear(allCapabilityTypes)
117-
for _, g := range capTypes {
113+
c.pid.Clear(capability.CAPS | capability.BOUNDS)
114+
for _, g := range []capability.CapType{
115+
capability.EFFECTIVE,
116+
capability.PERMITTED,
117+
capability.INHERITABLE,
118+
capability.BOUNDING,
119+
} {
118120
c.pid.Set(g, c.caps[g]...)
119121
}
120-
return c.pid.Apply(allCapabilityTypes)
122+
if err := c.pid.Apply(capability.CAPS | capability.BOUNDS); err != nil {
123+
return fmt.Errorf("can't apply capabilities: %v", err)
124+
}
125+
126+
// Old version of capability package used to ignore errors from setting
127+
// ambient capabilities, which is now fixed (see
128+
// https://github.com/kolyshkin/capability/pull/3).
129+
//
130+
// To maintain backward compatibility, set ambient caps one by one and
131+
// don't return any errors, only warn.
132+
ambs := c.caps[capability.AMBIENT]
133+
err := capability.ResetAmbient()
134+
if err != nil {
135+
return fmt.Errorf("can't reset ambient capabilities: %v", err)
136+
}
137+
for _, a := range ambs {
138+
err := capability.SetAmbient(true, a)
139+
if err != nil {
140+
logrus.Warnf("can't raise ambient capability %s: %v", capToStr(a), err)
141+
}
142+
}
143+
144+
return nil
121145
}

libcontainer/capabilities/capabilities_linux_test.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,20 @@ import (
55
"os"
66
"testing"
77

8+
"github.com/moby/sys/capability"
89
"github.com/opencontainers/runc/libcontainer/configs"
910
"github.com/sirupsen/logrus"
1011
"github.com/sirupsen/logrus/hooks/test"
11-
"github.com/syndtr/gocapability/capability"
1212
)
1313

14+
var capTypes = []capability.CapType{
15+
capability.BOUNDING,
16+
capability.PERMITTED,
17+
capability.INHERITABLE,
18+
capability.EFFECTIVE,
19+
capability.AMBIENT,
20+
}
21+
1422
func TestNew(t *testing.T) {
1523
cs := []string{"CAP_CHOWN", "CAP_UNKNOWN", "CAP_UNKNOWN2"}
1624
conf := configs.Capabilities{

tests/integration/capabilities.bats

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,17 @@ function teardown() {
116116
[[ "${output}" == *"CapBnd: 0000000400000021"* ]]
117117
[[ "${output}" == *"CapAmb: 0000000400000001"* ]]
118118
}
119+
120+
@test "runc run [ambient caps not set in inheritable result in a warning]" {
121+
update_config ' .process.capabilities.inheritable = ["CAP_KILL"]
122+
| .process.capabilities.ambient = ["CAP_KILL", "CAP_CHOWN"]'
123+
runc run test_amb
124+
[ "$status" -eq 0 ]
125+
# This should result in CAP_KILL set in ambient,
126+
# and a warning about inability to set CAP_CHOWN.
127+
#
128+
# CAP_CHOWN is 0, the bit mask is 0x1 (1 << 0)
129+
# CAP_KILL is 5, the bit mask is 0x20 (1 << 5).
130+
[[ "$output" == *"can't raise ambient capability CAP_CHOWN: "* ]]
131+
[[ "${output}" == *"CapAmb: 0000000000000020"* ]]
132+
}

vendor/github.com/moby/sys/capability/CHANGELOG.md

Lines changed: 90 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/syndtr/gocapability/LICENSE renamed to vendor/github.com/moby/sys/capability/LICENSE

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/moby/sys/capability/README.md

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)