From nobody Tue Mar 3 05:27:29 2026 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3277C36D4EF for ; Mon, 2 Mar 2026 20:52:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772484725; cv=none; b=RCEwYeprSCvJFhVdghsUMWyzZlKp0yT7wsyDdswQJkLkxlFOmZG+mVXdbcNAQKZrGYsD24cdqpvA3KDMK/8iZQJVSz8vwYRu7BtFnrqhI5EgJzHPiLHGIK2vpizNICtAnqYq3IH8Ax5XpSxPH862bzpYvHHezIQF0lrSbBfpEPo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772484725; c=relaxed/simple; bh=fyVdGruDK05tDwLUbs7lBhZnVKzfazeuNEZwdWYZ1ho=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RnA6F7DpikHR0qR7AnM33w2Ub9Hf9X5w/gXOY70LzE1XDhIKXMdgpZ40N6WEcZkz2ADmiKichKKntcwL79101ata7kNGvaBfr6UEp29ONL5vX2FORw50VPGqsvNM7Zao8BJfjOiaWHZ/B5aIXaI7sS9plx3sjKxQXjzIRqd9ODA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=lvuQ/dCg; arc=none smtp.client-ip=209.85.128.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="lvuQ/dCg" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-48373a4bca3so29902995e9.0 for ; Mon, 02 Mar 2026 12:52:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772484722; x=1773089522; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=BSqJR1m2w2fT1WInc8r5MDvmoPSQo5tv0QZsx0+DkJs=; b=lvuQ/dCgnUtzLiC818M0y3ou9ppeIZ9pf9JDExEXIDCzcrVDC4OE/mE8mWbwaCvybA AnJtwDE5sn/FxYM4WQu9daq1JdSrtXgDr+nX0g1hb3GKqoLJTNvcBFvZWmknEVQutJRi zD02BeXEqOEeAI7Qilozk6IqyLKMWpqZg66ssr/3iMg2FH6I0CDZRRm0YUDPYCS0I0cm sbQ6MzsZF3Td42bdWn0G3CqIcVLZURwVkjx9u8wcR3GZyJD3CYKuMtAy77uLpPCJ9Fcg t07sqytVbIbl0pezSz4+0miLb0norAndSQzs8j7+svZL9Nxi1PTJnlqEEe0jkOB2usDs 66Sg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772484722; x=1773089522; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=BSqJR1m2w2fT1WInc8r5MDvmoPSQo5tv0QZsx0+DkJs=; b=awZCaGIJkL0UfolGjMivprgAWsYBoiDDv13jU/PYG95Fnv/ih4X3mTDbkIW3Mj0GkD pmvMIwy9gfXVqU6hvrOnS+iwwUjvGq4nDt95MmeAPyMnflQbkV73KLse6eNTL8YiMXl1 8+QekCjpKMui6KFYeICYQdx953zRyfkfsPKkzz6b5hEfWG7XENp93LaUO/24E7Jmq9Mg 5pQQLUaIEJds7ynwaUXgm1ti01n8GNfTxqSjntXJSzMndLQsS1TQDpXPIaiK6NdvAkhj 3mxWQdOQct3D32wi/yBp2JnZEWYYDgAlsc4QKpvHZ3Gld6JxPZAepoWkssW2LLY2D6Q2 vLvw== X-Gm-Message-State: AOJu0YzO9aj9r+lCAf4iIe8iM+MGkCwZYTL+zr6ARU4DQsUg33ILzjC4 2SsKxrNtzIiBvv92ZzDjLGjpcmSE9n72rxLfcJ0mvud/QmFS2tyigGa9q/EXhzxb X-Gm-Gg: ATEYQzzhvv3ob+tt7HHmNbeQpy/yj96jtw4OXGBc0mawHhekcfKtLGYnC+doipU3ykF TU6A2yo3ewK0KSOqHeQ6co7kH61VkK/uabi80rsfMe3wIlAN8aUr2t9h9VZVZDP8G7zAPaj5f0a II11dOl7FaMD9BoCTjLHqH0ZAHF2aVKO9iKrkfAqOImZC0SjfdQGI66O8zLJcZPskSkpnR3EjHU fLucyvqMPDoyF30gbUOgWjYrJbrK78W+7GM0JV3As1lSm08GGkd7o4qoP9f/IHMWz61oboa1myr Z+5b9QjJbn5kaCYOejamMnj7oBxbbFw2tVCPHLgrhXsbMPPFj4LRbGaiga+NcW+06wGm7XC6oP5 SWhg7kHzykOopaQaGBhXUPxeVzEp40rGBAn3gj31LSbNIgcBY8NkYRX/ZV2/WtfGxFvCzzUVJx1 uOud5oQBGPYlLVnOmW9tU6w2CYG+tPW5o= X-Received: by 2002:a05:600c:1e2a:b0:471:1765:839c with SMTP id 5b1f17b1804b1-483c9bbc268mr195357195e9.20.1772484722230; Mon, 02 Mar 2026 12:52:02 -0800 (PST) Received: from [127.0.1.1] ([2a01:4b00:f03c:ba00:3081:348a:50c4:2d80]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-485126705e5sm898705e9.5.2026.03.02.12.52.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 12:52:01 -0800 (PST) From: Jamie Hill-Daniel X-Google-Original-From: Jamie Hill-Daniel Date: Mon, 02 Mar 2026 20:51:51 +0000 Subject: [PATCH 1/2] seccomp: Allow using `SECCOMP_MODE_STRICT` with `SECCOMP_MODE_FILTER` Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260302-seccomp-combined-v1-1-c0cb7acb0f97@hill-daniel.co.uk> References: <20260302-seccomp-combined-v1-0-c0cb7acb0f97@hill-daniel.co.uk> In-Reply-To: <20260302-seccomp-combined-v1-0-c0cb7acb0f97@hill-daniel.co.uk> To: Kees Cook , Andy Lutomirski , Will Drewry , Shuah Khan Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, bpf@vger.kernel.org, Jamie Hill-Daniel X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1772484719; l=4298; i=jamie@hill-daniel.co.uk; s=20260302; h=from:subject:message-id; bh=fyVdGruDK05tDwLUbs7lBhZnVKzfazeuNEZwdWYZ1ho=; b=MjzO+lE8seZZoVfwFmC4PeNeR12hHqRiqTTe376K+OInXk4e6jV1cy45AGGv4qUAX2PPi6ywJ QzyUS8n/qN0AkmEWBdiKmL8kGIw7wK08pTX62s4xLgX5EbD86FrIPKz X-Developer-Key: i=jamie@hill-daniel.co.uk; a=ed25519; pk=ovqCXSlFUjrT82WuRtIuXB13U5n1yfxM6o0M5O5J2tA= It is currently impossible to enable `SECCOMP_MODE_STRICT` if `SECCOMP_MODE_FILTER` is enabled, and vice-versa. This makes using seccomp difficult in environments such as Docker, which installs a seccomp filter by default. Introduce a new internal `SECCOMP_MODE_COMBINED` that runs `strict` checks, followed by any installed filters. Link: https://github.com/moby/moby/issues/42082 Signed-off-by: Jamie Hill-Daniel --- kernel/seccomp.c | 46 ++++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/kernel/seccomp.c b/kernel/seccomp.c index 25f62867a16d..8201a050d358 100644 --- a/kernel/seccomp.c +++ b/kernel/seccomp.c @@ -33,6 +33,8 @@ =20 /* Not exposed in headers: strictly internal use only. */ #define SECCOMP_MODE_DEAD (SECCOMP_MODE_FILTER + 1) +/* Run SECCOMP_MODE_STRICT checks, followed by SECCOMP_MODE_FILTER */ +#define SECCOMP_MODE_COMBINED (SECCOMP_MODE_DEAD + 1) =20 #ifdef CONFIG_SECCOMP_FILTER #include @@ -432,14 +434,21 @@ static u32 seccomp_run_filters(const struct seccomp_d= ata *sd, } #endif /* CONFIG_SECCOMP_FILTER */ =20 -static inline bool seccomp_may_assign_mode(unsigned long seccomp_mode) +/** + * seccomp_needs_combined: internal function for checking if requested mode + * needs to be upgraded to `SECCOMP_MODE_COMBINED`. + * + */ +static inline bool seccomp_needs_combined(unsigned long seccomp_mode) { assert_spin_locked(¤t->sighand->siglock); =20 - if (current->seccomp.mode && current->seccomp.mode !=3D seccomp_mode) - return false; + if ((current->seccomp.mode =3D=3D SECCOMP_MODE_STRICT || + current->seccomp.mode =3D=3D SECCOMP_MODE_FILTER) && + current->seccomp.mode !=3D seccomp_mode) + return true; =20 - return true; + return false; } =20 void __weak arch_seccomp_spec_mitigate(struct task_struct *task) { } @@ -1407,6 +1416,9 @@ int __secure_computing(void) WARN_ON_ONCE(1); do_exit(SIGKILL); return -1; + case SECCOMP_MODE_COMBINED: + __secure_computing_strict(this_syscall); + return __seccomp_filter(this_syscall, false); default: BUG(); } @@ -1421,30 +1433,23 @@ long prctl_get_seccomp(void) /** * seccomp_set_mode_strict: internal function for setting strict seccomp * - * Once current->seccomp.mode is non-zero, it may not be changed. + * Once current->seccomp.mode is non-zero, it may only be changed to `COMB= INED` or `DEAD`. * - * Returns 0 on success or -EINVAL on failure. */ -static long seccomp_set_mode_strict(void) +static void seccomp_set_mode_strict(void) { - const unsigned long seccomp_mode =3D SECCOMP_MODE_STRICT; - long ret =3D -EINVAL; + unsigned long seccomp_mode =3D SECCOMP_MODE_STRICT; =20 spin_lock_irq(¤t->sighand->siglock); =20 - if (!seccomp_may_assign_mode(seccomp_mode)) - goto out; + if (seccomp_needs_combined(seccomp_mode)) + seccomp_mode =3D SECCOMP_MODE_COMBINED; =20 #ifdef TIF_NOTSC disable_TSC(); #endif seccomp_assign_mode(current, seccomp_mode, 0); - ret =3D 0; - -out: spin_unlock_irq(¤t->sighand->siglock); - - return ret; } =20 #ifdef CONFIG_SECCOMP_FILTER @@ -1956,7 +1961,7 @@ static bool has_duplicate_listener(struct seccomp_fil= ter *new_child) static long seccomp_set_mode_filter(unsigned int flags, const char __user *filter) { - const unsigned long seccomp_mode =3D SECCOMP_MODE_FILTER; + long seccomp_mode =3D SECCOMP_MODE_FILTER; struct seccomp_filter *prepared =3D NULL; long ret =3D -EINVAL; int listener =3D -1; @@ -2016,8 +2021,8 @@ static long seccomp_set_mode_filter(unsigned int flag= s, =20 spin_lock_irq(¤t->sighand->siglock); =20 - if (!seccomp_may_assign_mode(seccomp_mode)) - goto out; + if (seccomp_needs_combined(seccomp_mode)) + seccomp_mode =3D SECCOMP_MODE_COMBINED; =20 if (has_duplicate_listener(prepared)) { ret =3D -EBUSY; @@ -2105,7 +2110,8 @@ static long do_seccomp(unsigned int op, unsigned int = flags, case SECCOMP_SET_MODE_STRICT: if (flags !=3D 0 || uargs !=3D NULL) return -EINVAL; - return seccomp_set_mode_strict(); + seccomp_set_mode_strict(); + return 0; case SECCOMP_SET_MODE_FILTER: return seccomp_set_mode_filter(flags, uargs); case SECCOMP_GET_ACTION_AVAIL: --=20 2.53.0