diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-03-27 19:40:19 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-03-27 19:40:19 +0900 |
| commit | 184e9db2b2ee960e7c7b2014aec72a28d9110bcc (patch) | |
| tree | 180c6a67f09d5b3c9c2cd0600c30113435a3428c /sandbox/init.go | |
| parent | 605d018be266a9e0d5c8256d647e3a61fa6df79a (diff) | |
sandbox: support privileged container
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'sandbox/init.go')
| -rw-r--r-- | sandbox/init.go | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/sandbox/init.go b/sandbox/init.go index 0d14e5f8..a03868bf 100644 --- a/sandbox/init.go +++ b/sandbox/init.go @@ -223,17 +223,30 @@ func Init(prepare func(prefix string), setVerbose func(verbose bool)) { if _, _, errno := syscall.Syscall(PR_SET_NO_NEW_PRIVS, 1, 0, 0); errno != 0 { log.Fatalf("prctl(PR_SET_NO_NEW_PRIVS): %v", errno) } + if _, _, errno := syscall.Syscall(syscall.SYS_PRCTL, PR_CAP_AMBIENT, PR_CAP_AMBIENT_CLEAR_ALL, 0); errno != 0 { log.Fatalf("cannot clear the ambient capability set: %v", errno) } for i := uintptr(0); i <= LastCap(); i++ { + if params.Privileged && i == CAP_SYS_ADMIN { + continue + } if _, _, errno := syscall.Syscall(syscall.SYS_PRCTL, syscall.PR_CAPBSET_DROP, i, 0); errno != 0 { log.Fatalf("cannot drop capability from bonding set: %v", errno) } } + + var keep [2]uint32 + if params.Privileged { + keep[capToIndex(CAP_SYS_ADMIN)] |= capToMask(CAP_SYS_ADMIN) + + if _, _, errno := syscall.Syscall(syscall.SYS_PRCTL, PR_CAP_AMBIENT, PR_CAP_AMBIENT_RAISE, CAP_SYS_ADMIN); errno != 0 { + log.Fatalf("cannot raise CAP_SYS_ADMIN: %v", errno) + } + } if err := capset( &capHeader{_LINUX_CAPABILITY_VERSION_3, 0}, - &[2]capData{{0, 0, 0}, {0, 0, 0}}, + &[2]capData{{0, keep[0], keep[0]}, {0, keep[1], keep[1]}}, ); err != nil { log.Fatalf("cannot capset: %v", err) } |
