summaryrefslogtreecommitdiff
path: root/profiles
diff options
context:
space:
mode:
authorRodrigo Campos <rodrigo@kinvolk.io>2021-06-25 15:51:06 +0200
committerRodrigo Campos <rodrigo@kinvolk.io>2021-07-08 17:11:53 +0200
commit5d244675bdb23e8fce427036c03517243f344cd4 (patch)
treec081b3cb08546c1a077926bcecb6bdbe52bf443e /profiles
parent5e4da6cc8269c9b766421f22f5824f3e23c89e76 (diff)
downloaddocker-5d244675bdb23e8fce427036c03517243f344cd4.tar.gz
seccomp: Sync fields with runtime-spec fields
The runtime spec we are using has support for these 3 fields[1], but moby doesn't have them in its seccomp struct. This patch just adds and copies them when they are in the profile. DefaultErrnoRet is implemented in the runc version moby is using (it is implemented since runc-rc95[2]) but if we create a container without this moby patch, we don't see an error nor the expected behavior. This is not clear for the user (the profile they specify is valid, the syntax is ok, but the wrong behavior is seen). This is because the DefaultErrnoRet field is not copied to the config passed ultimately to runc (i.e. is like the field was not specified). With this patch, we see the expected behavior. The other two fileds are in the runtime-spec but not yet in runc (a PR is open and targets 1.1.0 milestone). However, I took the liberty to copy them now too for two reasons: 1. If we don't add them now and end up using a runc version that supports them, then the error that the user will see is not clear at all: docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: listenerPath is not set: unknown. And it is not obvious to debug for the user, as the field _is_ set in the profile they specify (just not copied by moby to the profile moby specifies ultimately to runc). 2. When using a runc without seccomp notify support (like today), the error we see is the same with and without this moby patch (when using a seccomp profile with the new fields): docker: Error response from daemon: OCI runtime create failed: string SCMP_ACT_NOTIFY is not a valid action for seccomp: unknown. Then, it seems like a clear win to add them now: we don't have to do it later (that implies not clear errors to the user if we forget, like we did with DefaultErrnoRet) and the user sees the exact same error when using a runc version that doesn't support these fields. [1]: Note we are vendoring version 1c3f411f041711bbeecf35ff7e93461ea6789220 and this version has these 3 fields https://github.com/opencontainers/runtime-spec/blob/1c3f411f041711bbeecf35ff7e93461ea6789220/config-linux.md#seccomp [2]: https://github.com/opencontainers/runc/pull/2954/ [3]: https://github.com/opencontainers/runc/pull/2682 Signed-off-by: Rodrigo Campos <rodrigo@kinvolk.io>
Diffstat (limited to 'profiles')
-rw-r--r--profiles/seccomp/seccomp.go6
-rw-r--r--profiles/seccomp/seccomp_linux.go3
-rw-r--r--profiles/seccomp/seccomp_test.go41
3 files changed, 49 insertions, 1 deletions
diff --git a/profiles/seccomp/seccomp.go b/profiles/seccomp/seccomp.go
index 94a37367d0..4d12e9f6b7 100644
--- a/profiles/seccomp/seccomp.go
+++ b/profiles/seccomp/seccomp.go
@@ -11,7 +11,11 @@ import (
// Seccomp represents the config for a seccomp profile for syscall restriction.
type Seccomp struct {
- DefaultAction specs.LinuxSeccompAction `json:"defaultAction"`
+ DefaultAction specs.LinuxSeccompAction `json:"defaultAction"`
+ DefaultErrnoRet *uint `json:"defaultErrnoRet,omitempty"`
+ ListenerPath string `json:"listenerPath,omitempty"`
+ ListenerMetadata string `json:"listenerMetadata,omitempty"`
+
// Architectures is kept to maintain backward compatibility with the old
// seccomp profile.
Architectures []specs.Arch `json:"architectures,omitempty"`
diff --git a/profiles/seccomp/seccomp_linux.go b/profiles/seccomp/seccomp_linux.go
index 222fec6936..ed9ce472d8 100644
--- a/profiles/seccomp/seccomp_linux.go
+++ b/profiles/seccomp/seccomp_linux.go
@@ -107,6 +107,9 @@ func setupSeccomp(config *Seccomp, rs *specs.Spec) (*specs.LinuxSeccomp, error)
}
newConfig.DefaultAction = config.DefaultAction
+ newConfig.DefaultErrnoRet = config.DefaultErrnoRet
+ newConfig.ListenerPath = config.ListenerPath
+ newConfig.ListenerMetadata = config.ListenerMetadata
Loop:
// Loop through all syscall blocks and convert them to libcontainer format after filtering them
diff --git a/profiles/seccomp/seccomp_test.go b/profiles/seccomp/seccomp_test.go
index 506410d50b..e781141ecb 100644
--- a/profiles/seccomp/seccomp_test.go
+++ b/profiles/seccomp/seccomp_test.go
@@ -59,6 +59,47 @@ func TestLoadProfile(t *testing.T) {
assert.DeepEqual(t, expected, *p)
}
+func TestLoadProfileWithDefaultErrnoRet(t *testing.T) {
+ var profile = []byte(`{
+"defaultAction": "SCMP_ACT_ERRNO",
+"defaultErrnoRet": 6
+}`)
+ rs := createSpec()
+ p, err := LoadProfile(string(profile), &rs)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ expectedErrnoRet := uint(6)
+ expected := specs.LinuxSeccomp{
+ DefaultAction: "SCMP_ACT_ERRNO",
+ DefaultErrnoRet: &expectedErrnoRet,
+ }
+
+ assert.DeepEqual(t, expected, *p)
+}
+
+func TestLoadProfileWithListenerPath(t *testing.T) {
+ var profile = []byte(`{
+"defaultAction": "SCMP_ACT_ERRNO",
+"listenerPath": "/var/run/seccompaget.sock",
+"listenerMetadata": "opaque-metadata"
+}`)
+ rs := createSpec()
+ p, err := LoadProfile(string(profile), &rs)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ expected := specs.LinuxSeccomp{
+ DefaultAction: "SCMP_ACT_ERRNO",
+ ListenerPath: "/var/run/seccompaget.sock",
+ ListenerMetadata: "opaque-metadata",
+ }
+
+ assert.DeepEqual(t, expected, *p)
+}
+
// TestLoadLegacyProfile tests loading a seccomp profile in the old format
// (before https://github.com/docker/docker/pull/24510)
func TestLoadLegacyProfile(t *testing.T) {