aboutsummaryrefslogtreecommitdiffhomepage
path: root/container/init.go
diff options
context:
space:
mode:
Diffstat (limited to 'container/init.go')
-rw-r--r--container/init.go45
1 files changed, 29 insertions, 16 deletions
diff --git a/container/init.go b/container/init.go
index 76a77828..78c95439 100644
--- a/container/init.go
+++ b/container/init.go
@@ -186,19 +186,24 @@ func initEntrypoint(k syscallDispatcher, msg message.Msg) {
if err := k.setDumpable(ext.SUID_DUMP_USER); err != nil {
k.fatalf(msg, "cannot set SUID_DUMP_USER: %v", err)
}
- if err := k.writeFile(fhs.Proc+"self/uid_map",
- append([]byte{}, strconv.Itoa(param.Uid)+" "+strconv.Itoa(param.HostUid)+" 1\n"...),
- 0); err != nil {
+ if err := k.writeFile(
+ fhs.Proc+"self/uid_map",
+ []byte(strconv.Itoa(param.Uid)+" "+strconv.Itoa(param.HostUid)+" 1\n"),
+ 0,
+ ); err != nil {
k.fatalf(msg, "%v", err)
}
- if err := k.writeFile(fhs.Proc+"self/setgroups",
+ if err := k.writeFile(
+ fhs.Proc+"self/setgroups",
[]byte("deny\n"),
- 0); err != nil && !os.IsNotExist(err) {
+ 0,
+ ); err != nil && !os.IsNotExist(err) {
k.fatalf(msg, "%v", err)
}
if err := k.writeFile(fhs.Proc+"self/gid_map",
- append([]byte{}, strconv.Itoa(param.Gid)+" "+strconv.Itoa(param.HostGid)+" 1\n"...),
- 0); err != nil {
+ []byte(strconv.Itoa(param.Gid)+" "+strconv.Itoa(param.HostGid)+" 1\n"),
+ 0,
+ ); err != nil {
k.fatalf(msg, "%v", err)
}
if err := k.setDumpable(ext.SUID_DUMP_DISABLE); err != nil {
@@ -323,11 +328,16 @@ func initEntrypoint(k syscallDispatcher, msg message.Msg) {
}
}
+ var keepCaps []uintptr
+ if param.Privileged {
+ keepCaps = append(keepCaps, CAP_SYS_ADMIN, CAP_SETPCAP)
+ }
+
if err := k.capAmbientClearAll(); err != nil {
k.fatalf(msg, "cannot clear the ambient capability set: %v", err)
}
- for i := uintptr(0); i <= lastcap; i++ {
- if param.Privileged && i == CAP_SYS_ADMIN {
+ for i := range lastcap + 1 {
+ if slices.Contains(keepCaps, i) {
continue
}
if err := k.capBoundingSetDrop(i); err != nil {
@@ -336,20 +346,23 @@ func initEntrypoint(k syscallDispatcher, msg message.Msg) {
}
var keep [2]uint32
- if param.Privileged {
- keep[capToIndex(CAP_SYS_ADMIN)] |= capToMask(CAP_SYS_ADMIN)
-
- if err := k.capAmbientRaise(CAP_SYS_ADMIN); err != nil {
- k.fatalf(msg, "cannot raise CAP_SYS_ADMIN: %v", err)
- }
+ for _, c := range keepCaps {
+ keep[capToIndex(c)] |= capToMask(c)
}
+
if err := k.capset(
&capHeader{_LINUX_CAPABILITY_VERSION_3, 0},
- &[2]capData{{0, keep[0], keep[0]}, {0, keep[1], keep[1]}},
+ &[2]capData{{keep[0], keep[0], keep[0]}, {keep[1], keep[1], keep[1]}},
); err != nil {
k.fatalf(msg, "cannot capset: %v", err)
}
+ for _, c := range keepCaps {
+ if err := k.capAmbientRaise(c); err != nil {
+ k.fatalf(msg, "cannot raise %#x: %v", c, err)
+ }
+ }
+
if !param.SeccompDisable {
rules := param.SeccompRules
if len(rules) == 0 { // non-empty rules slice always overrides presets