diff options
Diffstat (limited to 'container/landlock.go')
| -rw-r--r-- | container/landlock.go | 259 |
1 files changed, 0 insertions, 259 deletions
diff --git a/container/landlock.go b/container/landlock.go deleted file mode 100644 index a8007692..00000000 --- a/container/landlock.go +++ /dev/null @@ -1,259 +0,0 @@ -package container - -import ( - "strings" - "syscall" - "unsafe" - - "hakurei.app/ext" -) - -// include/uapi/linux/landlock.h - -const ( - LANDLOCK_CREATE_RULESET_VERSION = 1 << iota -) - -// LandlockAccessFS is bitmask of handled filesystem actions. -type LandlockAccessFS uint64 - -const ( - LANDLOCK_ACCESS_FS_EXECUTE LandlockAccessFS = 1 << iota - LANDLOCK_ACCESS_FS_WRITE_FILE - LANDLOCK_ACCESS_FS_READ_FILE - LANDLOCK_ACCESS_FS_READ_DIR - LANDLOCK_ACCESS_FS_REMOVE_DIR - LANDLOCK_ACCESS_FS_REMOVE_FILE - LANDLOCK_ACCESS_FS_MAKE_CHAR - LANDLOCK_ACCESS_FS_MAKE_DIR - LANDLOCK_ACCESS_FS_MAKE_REG - LANDLOCK_ACCESS_FS_MAKE_SOCK - LANDLOCK_ACCESS_FS_MAKE_FIFO - LANDLOCK_ACCESS_FS_MAKE_BLOCK - LANDLOCK_ACCESS_FS_MAKE_SYM - LANDLOCK_ACCESS_FS_REFER - LANDLOCK_ACCESS_FS_TRUNCATE - LANDLOCK_ACCESS_FS_IOCTL_DEV - - _LANDLOCK_ACCESS_FS_DELIM -) - -// String returns a space-separated string of [LandlockAccessFS] flags. -func (f LandlockAccessFS) String() string { - switch f { - case LANDLOCK_ACCESS_FS_EXECUTE: - return "execute" - - case LANDLOCK_ACCESS_FS_WRITE_FILE: - return "write_file" - - case LANDLOCK_ACCESS_FS_READ_FILE: - return "read_file" - - case LANDLOCK_ACCESS_FS_READ_DIR: - return "read_dir" - - case LANDLOCK_ACCESS_FS_REMOVE_DIR: - return "remove_dir" - - case LANDLOCK_ACCESS_FS_REMOVE_FILE: - return "remove_file" - - case LANDLOCK_ACCESS_FS_MAKE_CHAR: - return "make_char" - - case LANDLOCK_ACCESS_FS_MAKE_DIR: - return "make_dir" - - case LANDLOCK_ACCESS_FS_MAKE_REG: - return "make_reg" - - case LANDLOCK_ACCESS_FS_MAKE_SOCK: - return "make_sock" - - case LANDLOCK_ACCESS_FS_MAKE_FIFO: - return "make_fifo" - - case LANDLOCK_ACCESS_FS_MAKE_BLOCK: - return "make_block" - - case LANDLOCK_ACCESS_FS_MAKE_SYM: - return "make_sym" - - case LANDLOCK_ACCESS_FS_REFER: - return "fs_refer" - - case LANDLOCK_ACCESS_FS_TRUNCATE: - return "fs_truncate" - - case LANDLOCK_ACCESS_FS_IOCTL_DEV: - return "fs_ioctl_dev" - - default: - var c []LandlockAccessFS - for i := LandlockAccessFS(1); i < _LANDLOCK_ACCESS_FS_DELIM; i <<= 1 { - if f&i != 0 { - c = append(c, i) - } - } - if len(c) == 0 { - return "NULL" - } - s := make([]string, len(c)) - for i, v := range c { - s[i] = v.String() - } - return strings.Join(s, " ") - } -} - -// LandlockAccessNet is bitmask of handled network actions. -type LandlockAccessNet uint64 - -const ( - LANDLOCK_ACCESS_NET_BIND_TCP LandlockAccessNet = 1 << iota - LANDLOCK_ACCESS_NET_CONNECT_TCP - - _LANDLOCK_ACCESS_NET_DELIM -) - -// String returns a space-separated string of [LandlockAccessNet] flags. -func (f LandlockAccessNet) String() string { - switch f { - case LANDLOCK_ACCESS_NET_BIND_TCP: - return "bind_tcp" - - case LANDLOCK_ACCESS_NET_CONNECT_TCP: - return "connect_tcp" - - default: - var c []LandlockAccessNet - for i := LandlockAccessNet(1); i < _LANDLOCK_ACCESS_NET_DELIM; i <<= 1 { - if f&i != 0 { - c = append(c, i) - } - } - if len(c) == 0 { - return "NULL" - } - s := make([]string, len(c)) - for i, v := range c { - s[i] = v.String() - } - return strings.Join(s, " ") - } -} - -// LandlockScope is bitmask of scopes restricting a Landlock domain from accessing outside resources. -type LandlockScope uint64 - -const ( - LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET LandlockScope = 1 << iota - LANDLOCK_SCOPE_SIGNAL - - _LANDLOCK_SCOPE_DELIM -) - -// String returns a space-separated string of [LandlockScope] flags. -func (f LandlockScope) String() string { - switch f { - case LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET: - return "abstract_unix_socket" - - case LANDLOCK_SCOPE_SIGNAL: - return "signal" - - default: - var c []LandlockScope - for i := LandlockScope(1); i < _LANDLOCK_SCOPE_DELIM; i <<= 1 { - if f&i != 0 { - c = append(c, i) - } - } - if len(c) == 0 { - return "NULL" - } - s := make([]string, len(c)) - for i, v := range c { - s[i] = v.String() - } - return strings.Join(s, " ") - } -} - -// RulesetAttr is equivalent to struct landlock_ruleset_attr. -type RulesetAttr struct { - // Bitmask of handled filesystem actions. - HandledAccessFS LandlockAccessFS - // Bitmask of handled network actions. - HandledAccessNet LandlockAccessNet - // Bitmask of scopes restricting a Landlock domain from accessing outside - // resources (e.g. IPCs). - Scoped LandlockScope -} - -// String returns a user-facing description of [RulesetAttr]. -func (rulesetAttr *RulesetAttr) String() string { - if rulesetAttr == nil { - return "NULL" - } - elems := make([]string, 0, 3) - if rulesetAttr.HandledAccessFS > 0 { - elems = append(elems, "fs: "+rulesetAttr.HandledAccessFS.String()) - } - if rulesetAttr.HandledAccessNet > 0 { - elems = append(elems, "net: "+rulesetAttr.HandledAccessNet.String()) - } - if rulesetAttr.Scoped > 0 { - elems = append(elems, "scoped: "+rulesetAttr.Scoped.String()) - } - if len(elems) == 0 { - return "0" - } - return strings.Join(elems, ", ") -} - -// Create loads the ruleset into the kernel. -func (rulesetAttr *RulesetAttr) Create(flags uintptr) (fd int, err error) { - var pointer, size uintptr - // NULL needed for abi version - if rulesetAttr != nil { - pointer = uintptr(unsafe.Pointer(rulesetAttr)) - size = unsafe.Sizeof(*rulesetAttr) - } - - rulesetFd, _, errno := syscall.Syscall( - ext.SYS_LANDLOCK_CREATE_RULESET, - pointer, size, - flags, - ) - fd = int(rulesetFd) - err = errno - if fd < 0 { - return - } - - if rulesetAttr != nil { // not a fd otherwise - syscall.CloseOnExec(fd) - } - return fd, nil -} - -// LandlockGetABI returns the ABI version supported by the kernel. -func LandlockGetABI() (int, error) { - return (*RulesetAttr)(nil).Create(LANDLOCK_CREATE_RULESET_VERSION) -} - -// LandlockRestrictSelf applies a loaded ruleset to the calling thread. -func LandlockRestrictSelf(rulesetFd int, flags uintptr) error { - r, _, errno := syscall.Syscall( - ext.SYS_LANDLOCK_RESTRICT_SELF, - uintptr(rulesetFd), - flags, - 0, - ) - if r != 0 { - return errno - } - return nil -} |
