|
@@ -6,6 +6,7 @@ import (
|
|
|
"syscall"
|
|
|
|
|
|
"github.com/docker/engine-api/types"
|
|
|
+ "github.com/opencontainers/specs/specs-go"
|
|
|
libseccomp "github.com/seccomp/libseccomp-golang"
|
|
|
)
|
|
|
|
|
@@ -34,10 +35,9 @@ func arches() []types.Arch {
|
|
|
}
|
|
|
|
|
|
// DefaultProfile defines the whitelist for the default seccomp profile.
|
|
|
-var DefaultProfile = &types.Seccomp{
|
|
|
- DefaultAction: types.ActErrno,
|
|
|
- Architectures: arches(),
|
|
|
- Syscalls: []*types.Syscall{
|
|
|
+func DefaultProfile(rs *specs.Spec) *types.Seccomp {
|
|
|
+
|
|
|
+ syscalls := []*types.Syscall{
|
|
|
{
|
|
|
Name: "accept",
|
|
|
Action: types.ActAllow,
|
|
@@ -58,11 +58,6 @@ var DefaultProfile = &types.Seccomp{
|
|
|
Action: types.ActAllow,
|
|
|
Args: []*types.Arg{},
|
|
|
},
|
|
|
- {
|
|
|
- Name: "arch_prctl",
|
|
|
- Action: types.ActAllow,
|
|
|
- Args: []*types.Arg{},
|
|
|
- },
|
|
|
{
|
|
|
Name: "bind",
|
|
|
Action: types.ActAllow,
|
|
@@ -93,21 +88,6 @@ var DefaultProfile = &types.Seccomp{
|
|
|
Action: types.ActAllow,
|
|
|
Args: []*types.Arg{},
|
|
|
},
|
|
|
- {
|
|
|
- Name: "chown",
|
|
|
- Action: types.ActAllow,
|
|
|
- Args: []*types.Arg{},
|
|
|
- },
|
|
|
- {
|
|
|
- Name: "chown32",
|
|
|
- Action: types.ActAllow,
|
|
|
- Args: []*types.Arg{},
|
|
|
- },
|
|
|
- {
|
|
|
- Name: "chroot",
|
|
|
- Action: types.ActAllow,
|
|
|
- Args: []*types.Arg{},
|
|
|
- },
|
|
|
{
|
|
|
Name: "clock_getres",
|
|
|
Action: types.ActAllow,
|
|
@@ -123,18 +103,6 @@ var DefaultProfile = &types.Seccomp{
|
|
|
Action: types.ActAllow,
|
|
|
Args: []*types.Arg{},
|
|
|
},
|
|
|
- {
|
|
|
- Name: "clone",
|
|
|
- Action: types.ActAllow,
|
|
|
- Args: []*types.Arg{
|
|
|
- {
|
|
|
- Index: 0,
|
|
|
- Value: syscall.CLONE_NEWNS | syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC | syscall.CLONE_NEWUSER | syscall.CLONE_NEWPID | syscall.CLONE_NEWNET,
|
|
|
- ValueTwo: 0,
|
|
|
- Op: types.OpMaskedEqual,
|
|
|
- },
|
|
|
- },
|
|
|
- },
|
|
|
{
|
|
|
Name: "close",
|
|
|
Action: types.ActAllow,
|
|
@@ -255,11 +223,6 @@ var DefaultProfile = &types.Seccomp{
|
|
|
Action: types.ActAllow,
|
|
|
Args: []*types.Arg{},
|
|
|
},
|
|
|
- {
|
|
|
- Name: "fanotify_init",
|
|
|
- Action: types.ActAllow,
|
|
|
- Args: []*types.Arg{},
|
|
|
- },
|
|
|
{
|
|
|
Name: "fanotify_mark",
|
|
|
Action: types.ActAllow,
|
|
@@ -280,21 +243,6 @@ var DefaultProfile = &types.Seccomp{
|
|
|
Action: types.ActAllow,
|
|
|
Args: []*types.Arg{},
|
|
|
},
|
|
|
- {
|
|
|
- Name: "fchown",
|
|
|
- Action: types.ActAllow,
|
|
|
- Args: []*types.Arg{},
|
|
|
- },
|
|
|
- {
|
|
|
- Name: "fchown32",
|
|
|
- Action: types.ActAllow,
|
|
|
- Args: []*types.Arg{},
|
|
|
- },
|
|
|
- {
|
|
|
- Name: "fchownat",
|
|
|
- Action: types.ActAllow,
|
|
|
- Args: []*types.Arg{},
|
|
|
- },
|
|
|
{
|
|
|
Name: "fcntl",
|
|
|
Action: types.ActAllow,
|
|
@@ -640,16 +588,6 @@ var DefaultProfile = &types.Seccomp{
|
|
|
Action: types.ActAllow,
|
|
|
Args: []*types.Arg{},
|
|
|
},
|
|
|
- {
|
|
|
- Name: "lchown",
|
|
|
- Action: types.ActAllow,
|
|
|
- Args: []*types.Arg{},
|
|
|
- },
|
|
|
- {
|
|
|
- Name: "lchown32",
|
|
|
- Action: types.ActAllow,
|
|
|
- Args: []*types.Arg{},
|
|
|
- },
|
|
|
{
|
|
|
Name: "lgetxattr",
|
|
|
Action: types.ActAllow,
|
|
@@ -1193,11 +1131,6 @@ var DefaultProfile = &types.Seccomp{
|
|
|
Action: types.ActAllow,
|
|
|
Args: []*types.Arg{},
|
|
|
},
|
|
|
- {
|
|
|
- Name: "setdomainname",
|
|
|
- Action: types.ActAllow,
|
|
|
- Args: []*types.Arg{},
|
|
|
- },
|
|
|
{
|
|
|
Name: "setfsgid",
|
|
|
Action: types.ActAllow,
|
|
@@ -1238,11 +1171,6 @@ var DefaultProfile = &types.Seccomp{
|
|
|
Action: types.ActAllow,
|
|
|
Args: []*types.Arg{},
|
|
|
},
|
|
|
- {
|
|
|
- Name: "sethostname",
|
|
|
- Action: types.ActAllow,
|
|
|
- Args: []*types.Arg{},
|
|
|
- },
|
|
|
{
|
|
|
Name: "setitimer",
|
|
|
Action: types.ActAllow,
|
|
@@ -1608,27 +1536,332 @@ var DefaultProfile = &types.Seccomp{
|
|
|
Action: types.ActAllow,
|
|
|
Args: []*types.Arg{},
|
|
|
},
|
|
|
- // i386 specific syscalls
|
|
|
- {
|
|
|
- Name: "modify_ldt",
|
|
|
- Action: types.ActAllow,
|
|
|
- Args: []*types.Arg{},
|
|
|
- },
|
|
|
- // arm specific syscalls
|
|
|
- {
|
|
|
- Name: "breakpoint",
|
|
|
- Action: types.ActAllow,
|
|
|
- Args: []*types.Arg{},
|
|
|
- },
|
|
|
- {
|
|
|
- Name: "cacheflush",
|
|
|
- Action: types.ActAllow,
|
|
|
- Args: []*types.Arg{},
|
|
|
- },
|
|
|
- {
|
|
|
- Name: "set_tls",
|
|
|
- Action: types.ActAllow,
|
|
|
- Args: []*types.Arg{},
|
|
|
- },
|
|
|
- },
|
|
|
+ }
|
|
|
+
|
|
|
+ var arch string
|
|
|
+ var native, err = libseccomp.GetNativeArch()
|
|
|
+ if err == nil {
|
|
|
+ arch = native.String()
|
|
|
+ }
|
|
|
+ switch arch {
|
|
|
+ case "arm", "arm64":
|
|
|
+ syscalls = append(syscalls, []*types.Syscall{
|
|
|
+ {
|
|
|
+ Name: "breakpoint",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "cacheflush",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "set_tls",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ }...)
|
|
|
+ case "amd64", "x32":
|
|
|
+ syscalls = append(syscalls, []*types.Syscall{
|
|
|
+ {
|
|
|
+ Name: "arch_prctl",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ }...)
|
|
|
+ fallthrough
|
|
|
+ case "x86":
|
|
|
+ syscalls = append(syscalls, []*types.Syscall{
|
|
|
+ {
|
|
|
+ Name: "modify_ldt",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ }...)
|
|
|
+ }
|
|
|
+
|
|
|
+ capSysAdmin := false
|
|
|
+
|
|
|
+ var cap string
|
|
|
+ for _, cap = range rs.Process.Capabilities {
|
|
|
+ switch cap {
|
|
|
+ case "CAP_CHOWN":
|
|
|
+ syscalls = append(syscalls, []*types.Syscall{
|
|
|
+ {
|
|
|
+ Name: "chown",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "chown32",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "fchown",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "fchown32",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "fchownat",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "lchown",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "lchown32",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ }...)
|
|
|
+ case "CAP_DAC_READ_SEARCH":
|
|
|
+ syscalls = append(syscalls, []*types.Syscall{
|
|
|
+ {
|
|
|
+ Name: "name_to_handle_at",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "open_by_handle_at",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ }...)
|
|
|
+ case "CAP_IPC_LOCK":
|
|
|
+ syscalls = append(syscalls, []*types.Syscall{
|
|
|
+ {
|
|
|
+ Name: "mlock",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "mlock2",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "mlockall",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ }...)
|
|
|
+ case "CAP_SYS_ADMIN":
|
|
|
+ capSysAdmin = true
|
|
|
+ syscalls = append(syscalls, []*types.Syscall{
|
|
|
+ {
|
|
|
+ Name: "bpf",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "clone",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "fanotify_init",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "lookup_dcookie",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "mount",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "perf_event_open",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "setdomainname",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "sethostname",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "setns",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "umount",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "umount2",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "unshare",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ }...)
|
|
|
+ case "CAP_SYS_BOOT":
|
|
|
+ syscalls = append(syscalls, []*types.Syscall{
|
|
|
+ {
|
|
|
+ Name: "reboot",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ }...)
|
|
|
+ case "CAP_SYS_CHROOT":
|
|
|
+ syscalls = append(syscalls, []*types.Syscall{
|
|
|
+ {
|
|
|
+ Name: "chroot",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ }...)
|
|
|
+ case "CAP_SYS_MODULE":
|
|
|
+ syscalls = append(syscalls, []*types.Syscall{
|
|
|
+ {
|
|
|
+ Name: "delete_module",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "init_module",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "finit_module",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "query_module",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ }...)
|
|
|
+ case "CAP_SYS_PACCT":
|
|
|
+ syscalls = append(syscalls, []*types.Syscall{
|
|
|
+ {
|
|
|
+ Name: "acct",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ }...)
|
|
|
+ case "CAP_SYS_PTRACE":
|
|
|
+ syscalls = append(syscalls, []*types.Syscall{
|
|
|
+ {
|
|
|
+ Name: "kcmp",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "process_vm_readv",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "process_vm_writev",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "ptrace",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ }...)
|
|
|
+ case "CAP_SYS_RAWIO":
|
|
|
+ syscalls = append(syscalls, []*types.Syscall{
|
|
|
+ {
|
|
|
+ Name: "iopl",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "ioperm",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ }...)
|
|
|
+ case "CAP_SYS_TIME":
|
|
|
+ syscalls = append(syscalls, []*types.Syscall{
|
|
|
+ {
|
|
|
+ Name: "settimeofday",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "stime",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Name: "adjtimex",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ }...)
|
|
|
+ case "CAP_SYS_TTY_CONFIG":
|
|
|
+ syscalls = append(syscalls, []*types.Syscall{
|
|
|
+ {
|
|
|
+ Name: "vhangup",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ }...)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if !capSysAdmin {
|
|
|
+ syscalls = append(syscalls, []*types.Syscall{
|
|
|
+ {
|
|
|
+ Name: "clone",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{
|
|
|
+ {
|
|
|
+ Index: 0,
|
|
|
+ Value: syscall.CLONE_NEWNS | syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC | syscall.CLONE_NEWUSER | syscall.CLONE_NEWPID | syscall.CLONE_NEWNET,
|
|
|
+ ValueTwo: 0,
|
|
|
+ Op: types.OpMaskedEqual,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }...)
|
|
|
+ }
|
|
|
+
|
|
|
+ // We need some additional syscalls in this case see #22252
|
|
|
+ if !rs.Process.NoNewPrivileges {
|
|
|
+ syscalls = append(syscalls, []*types.Syscall{
|
|
|
+ {
|
|
|
+ Name: "fchown",
|
|
|
+ Action: types.ActAllow,
|
|
|
+ Args: []*types.Arg{},
|
|
|
+ },
|
|
|
+ }...)
|
|
|
+ }
|
|
|
+
|
|
|
+ return &types.Seccomp{
|
|
|
+ DefaultAction: types.ActErrno,
|
|
|
+ Architectures: arches(),
|
|
|
+ Syscalls: syscalls,
|
|
|
+ }
|
|
|
}
|