Received: by 10.223.185.116 with SMTP id b49csp5484046wrg; Tue, 27 Feb 2018 14:17:18 -0800 (PST) X-Google-Smtp-Source: AH8x227XzwwqhQXr0VHEaX8Ak+HlJHm8Vzmrmy9ivHb3Qg6MkP1y/oUxuVslnls2hLXejUn0V/N7 X-Received: by 2002:a17:902:b686:: with SMTP id c6-v6mr15594236pls.339.1519769838558; Tue, 27 Feb 2018 14:17:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519769838; cv=none; d=google.com; s=arc-20160816; b=domqXQnaCMEg3eFWzKhs/ADkY5w6so6V5NY/6BIPynKaifhjUZfYOhVV23YnuNmbDh /+OnQP3wEiCvTY8P3HGh9NQfvJU2F0aGXvGpOxi8cg2PsMgeOBYKCUKgY3PcIBMpxcQF ivQaFfgptBUXhf/nNeHla7wOem8xWFo31HfAT4P0nAnpuStx2F0DG47QH4qCAfMgtN2v wwEVzGgFd+za65UdXBKlxHozIRVKmxtAbcm1AGlFPp31gv15UBdTNcI74ixR03d5FyCD PbVcVNVveEpJb5AA4KLvRHqwXGJEfGb0zV9ydn2QBYHdO+4mLY54AJMq6+PlR/agoETJ S86A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:arc-authentication-results; bh=JwqwJyPD/Ksh4IvsaSPXijax4wJshlXK7xL7pE8z4s4=; b=pCuZgMJanH00jCAc1BMdxWaz/ptdqi8ZAWZIL4KXLe1yfC4FNML8cNdVr3hn959+Bz WOd/YNkeWoq3qZymrl5nk0jmwcnksb3JlhwWsJodec57VZMLerVi0SMZ7hU3yl5lEfsn B2/Rrbk8vbrPl03OYtC4OpoiTmuazgeTLTXGBx4/7vgwwt4fRHlWH6Gmlgosms8HhnzD NYyD5yW/aqxU61BokvF8JKy6xSjWJpjjWz0NZRloOqlRYhRGl1beXV73JB3SFKZHByor PFbozAxG4ur5HC+pdtcAne67ITzHOiUPKXH92XP+fvdTm+iC5U2EebscZAa0ZtnZssMh 1qtQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b61-v6si117361plc.385.2018.02.27.14.17.03; Tue, 27 Feb 2018 14:17:18 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751886AbeB0WQO (ORCPT + 99 others); Tue, 27 Feb 2018 17:16:14 -0500 Received: from smtp-sh.infomaniak.ch ([128.65.195.4]:42732 "EHLO smtp-sh.infomaniak.ch" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751552AbeB0WQM (ORCPT ); Tue, 27 Feb 2018 17:16:12 -0500 Received: from smtp7.infomaniak.ch (smtp7.infomaniak.ch [83.166.132.30]) by smtp-sh.infomaniak.ch (8.14.5/8.14.5) with ESMTP id w1RMF4LI011038 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 Feb 2018 23:15:04 +0100 Received: from ns3096276.ip-94-23-54.eu (ns3096276.ip-94-23-54.eu [94.23.54.103]) (authenticated bits=0) by smtp7.infomaniak.ch (8.14.5/8.14.5) with ESMTP id w1RMF2fw108845 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Tue, 27 Feb 2018 23:15:02 +0100 Subject: Re: [PATCH bpf-next v8 08/11] landlock: Add ptrace restrictions To: Andy Lutomirski Cc: LKML , Alexei Starovoitov , Arnaldo Carvalho de Melo , Casey Schaufler , Daniel Borkmann , David Drysdale , "David S . Miller" , "Eric W . Biederman" , James Morris , Jann Horn , Jonathan Corbet , Michael Kerrisk , Kees Cook , Paul Moore , Sargun Dhillon , "Serge E . Hallyn" , Shuah Khan , Tejun Heo , Thomas Graf , Tycho Andersen , Will Drewry , Kernel Hardening , Linux API , LSM List , Network Development References: <20180227004121.3633-1-mic@digikod.net> <20180227004121.3633-9-mic@digikod.net> From: =?UTF-8?Q?Micka=c3=abl_Sala=c3=bcn?= Message-ID: <0e7d0512-12a3-568d-aa55-3def4b91c6d0@digikod.net> Date: Tue, 27 Feb 2018 23:14:58 +0100 User-Agent: MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="juzjA3tOq9X7GzHiBhdEjTC1LSPJGxe5L" X-Antivirus: Dr.Web (R) for Unix mail servers drweb plugin ver.6.0.2.8 X-Antivirus-Code: 0x100000 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --juzjA3tOq9X7GzHiBhdEjTC1LSPJGxe5L Content-Type: multipart/mixed; boundary="mHkglwZfixZ6jp0eTeXn92TrtSd9RNwPP"; protected-headers="v1" From: =?UTF-8?Q?Micka=c3=abl_Sala=c3=bcn?= To: Andy Lutomirski Cc: LKML , Alexei Starovoitov , Arnaldo Carvalho de Melo , Casey Schaufler , Daniel Borkmann , David Drysdale , "David S . Miller" , "Eric W . Biederman" , James Morris , Jann Horn , Jonathan Corbet , Michael Kerrisk , Kees Cook , Paul Moore , Sargun Dhillon , "Serge E . Hallyn" , Shuah Khan , Tejun Heo , Thomas Graf , Tycho Andersen , Will Drewry , Kernel Hardening , Linux API , LSM List , Network Development Message-ID: <0e7d0512-12a3-568d-aa55-3def4b91c6d0@digikod.net> Subject: Re: [PATCH bpf-next v8 08/11] landlock: Add ptrace restrictions References: <20180227004121.3633-1-mic@digikod.net> <20180227004121.3633-9-mic@digikod.net> In-Reply-To: --mHkglwZfixZ6jp0eTeXn92TrtSd9RNwPP Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: quoted-printable On 27/02/2018 06:01, Andy Lutomirski wrote: >=20 >=20 >> On Feb 26, 2018, at 8:17 PM, Andy Lutomirski wro= te: >> >>> On Tue, Feb 27, 2018 at 12:41 AM, Micka=C3=ABl Sala=C3=BCn wrote: >>> A landlocked process has less privileges than a non-landlocked proces= s >>> and must then be subject to additional restrictions when manipulating= >>> processes. To be allowed to use ptrace(2) and related syscalls on a >>> target process, a landlocked process must have a subset of the target= >>> process' rules. >>> >>> Signed-off-by: Micka=C3=ABl Sala=C3=BCn >>> Cc: Alexei Starovoitov >>> Cc: Andy Lutomirski >>> Cc: Daniel Borkmann >>> Cc: David S. Miller >>> Cc: James Morris >>> Cc: Kees Cook >>> Cc: Serge E. Hallyn >>> --- >>> >>> Changes since v6: >>> * factor out ptrace check >>> * constify pointers >>> * cleanup headers >>> * use the new security_add_hooks() >>> --- >>> security/landlock/Makefile | 2 +- >>> security/landlock/hooks_ptrace.c | 124 ++++++++++++++++++++++++++++++= +++++++++ >>> security/landlock/hooks_ptrace.h | 11 ++++ >>> security/landlock/init.c | 2 + >>> 4 files changed, 138 insertions(+), 1 deletion(-) >>> create mode 100644 security/landlock/hooks_ptrace.c >>> create mode 100644 security/landlock/hooks_ptrace.h >>> >>> diff --git a/security/landlock/Makefile b/security/landlock/Makefile >>> index d0f532a93b4e..605504d852d3 100644 >>> --- a/security/landlock/Makefile >>> +++ b/security/landlock/Makefile >>> @@ -3,4 +3,4 @@ obj-$(CONFIG_SECURITY_LANDLOCK) :=3D landlock.o >>> landlock-y :=3D init.o chain.o task.o \ >>> tag.o tag_fs.o \ >>> enforce.o enforce_seccomp.o \ >>> - hooks.o hooks_cred.o hooks_fs.o >>> + hooks.o hooks_cred.o hooks_fs.o hooks_ptrace.o >>> diff --git a/security/landlock/hooks_ptrace.c b/security/landlock/hoo= ks_ptrace.c >>> new file mode 100644 >>> index 000000000000..f1b977b9c808 >>> --- /dev/null >>> +++ b/security/landlock/hooks_ptrace.c >>> @@ -0,0 +1,124 @@ >>> +/* >>> + * Landlock LSM - ptrace hooks >>> + * >>> + * Copyright =C2=A9 2017 Micka=C3=ABl Sala=C3=BCn >>> + * >>> + * This program is free software; you can redistribute it and/or mod= ify >>> + * it under the terms of the GNU General Public License version 2, a= s >>> + * published by the Free Software Foundation. >>> + */ >>> + >>> +#include >>> +#include >>> +#include /* ARRAY_SIZE */ >>> +#include >>> +#include /* struct task_struct */ >>> +#include >>> + >>> +#include "common.h" /* struct landlock_prog_set */ >>> +#include "hooks.h" /* landlocked() */ >>> +#include "hooks_ptrace.h" >>> + >>> +static bool progs_are_subset(const struct landlock_prog_set *parent,= >>> + const struct landlock_prog_set *child) >>> +{ >>> + size_t i; >>> + >>> + if (!parent || !child) >>> + return false; >>> + if (parent =3D=3D child) >>> + return true; >>> + >>> + for (i =3D 0; i < ARRAY_SIZE(child->programs); i++) { >> >> ARRAY_SIZE(child->programs) seems misleading. Is there no define >> NUM_LANDLOCK_PROG_TYPES or similar? >> >>> + struct landlock_prog_list *walker; >>> + bool found_parent =3D false; >>> + >>> + if (!parent->programs[i]) >>> + continue; >>> + for (walker =3D child->programs[i]; walker; >>> + walker =3D walker->prev) { >>> + if (walker =3D=3D parent->programs[i]) { >>> + found_parent =3D true; >>> + break; >>> + } >>> + } >>> + if (!found_parent) >>> + return false; >>> + } >>> + return true; >>> +} >> >> If you used seccomp, you'd get this type of check for free, and it >> would be a lot easier to comprehend. AFAICT the only extra leniency >> you're granting is that you're agnostic to the order in which the >> rules associated with different program types were applied, which >> could easily be added to seccomp. >=20 > On second thought, this is all way too complicated. I think the correc= t logic is either "if you are filtered by Landlock, you cannot ptrace any= thing" or to delete this patch entirely. This does not fit a lot of use cases like running a container constrained with some Landlock programs. We should not deny users the ability to debug their stuff. This patch add the minimal protection which are needed to have meaningful Landlock security policy. Without it, they may be easily bypassable, hence useless. > If something like Tycho's notifiers goes in, then it's not obvious that= , just because you have the same set of filters, you have the same privil= ege. Similarly, if a feature that lets a filter query its cgroup goes in= (and you proposed this once!) then the logic you implemented here is wro= ng. I don't get your point. Please take a look at the tests (patch 10). >=20 > Or you could just say that it's the responsibility of a Landlock user t= o properly filter ptrace() just like it's the responsibility of seccomp u= sers to filter ptrace if needed. A user should be able to enforce a security policy on ptrace as well, but this patch enforce a minimal set of security boundaries. It will be easy to add a new Landlock program type to get this kind of access contro= l. >=20 > I take this as further evidence that Landlock makes much more sense as = part of seccomp than as a totally separate thing. We've very carefully r= eviewed these things for seccomp. Please don't make us do it again from = scratch. >=20 Landlock is more complex than seccomp, because of its different goal. seccomp is less restrictive because it is more simple, but this patch follow the same logic with the knowledge of the Landlock internals. --mHkglwZfixZ6jp0eTeXn92TrtSd9RNwPP-- --juzjA3tOq9X7GzHiBhdEjTC1LSPJGxe5L Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCgAdFiEEUysCyY8er9Axt7hqIt7+33O9apUFAlqV2GIACgkQIt7+33O9 apXEyQf+KURddBvKxYNuwM6u0k7oFAC+stSeLTkBHdfBXv7UEvAgfPpBAVmyqYv4 mx2gBn85Ey1redPA1W9ezeX6AzuDTcu/mDlpp/h7+CeTG2eSGp4XGVxHCBbuQLKT CsWq4syeo1cHy11YKv/GPDDo1ZxwJlr7ICu5WYBQMy37fj3kqE5iHcmW7InBYKWa +POKR3oY+nU9iNxO1qj/LgdXC3dSR6xJZfK0q27uAE293cEzeHZ2+yx8zOGRCVkq dhKz87tLb3RI0Wwt8dT0ihQNBwWG63bD+rZ4KCjUiZI/QeBps5LpLsRa5tQMKOKN PoF3ZlCcpZkDhVYdyKuumxBEnrtxFA== =9JFP -----END PGP SIGNATURE----- --juzjA3tOq9X7GzHiBhdEjTC1LSPJGxe5L--