Received: by 2002:a05:6602:18e:0:0:0:0 with SMTP id m14csp7088602ioo; Thu, 2 Jun 2022 22:31:49 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw01LIcEpa1eyw5ntmG8QV72pWfDQAFsrDKu2saLHmJ+9wvAreycw8rpWRO4L/eaD8T+jJg X-Received: by 2002:a17:906:730a:b0:6fd:ebc2:cfc with SMTP id di10-20020a170906730a00b006fdebc20cfcmr7309471ejc.751.1654234309640; Thu, 02 Jun 2022 22:31:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1654234309; cv=none; d=google.com; s=arc-20160816; b=JAZBC+pJMl8JE9zbOGBiSC4M+04HSDXRYMub6eJblCMB9gN0b4YZ4xgq34l3wLTvSq O1OBzO5Z++7kRXWwQiODPth5TO1yb3kRXIh0F+ROMN+ALlsFJaRVxpRe+1jKajLj3OFZ 4e/NztrWI2FZ8TwdXaYdqQEJ11AppNSqt8TVzuDZW//gjN71IEmb3K/BAx7g6wTX7s+3 ui9IjbWN4TRUMoqQv9UPbyiw+o6eUhqP7Gxk2Vv9kV+9dyXovVVKHNYOxD2XLaxMH0Gj c8wpzrXLcT7kGHRcIvBpsDZZBLbYJLcCGU/3UTBHuxbpwsj1nE4yDmZRf+bcjjlTdsyW 7Wwg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=SupLG1r6yaWRZRYmnOGKbr+RRM/xHL3l4PjX6sGwZ5M=; b=I+ljJF2EK1myVPhajXZ5dD4c18Mq+EGp1j7wUBAKORUvu7iSG8jAgE+5oyE6n1EfRV MJ+JYrZGoOAoAE+D1zgPOl5ZpqnG4Q6Q5hj1eGLSI05A927lRlFp6EDIZPoPCS5zIdlp xDooaOLgv94EivV+kjUXKKnopAfgglA6W2t0Nrq6tSwqhnQoimamsY6qsjSBS325iPDP g/Sqyzx38kPQf4pCZzfz6P634Bc+eLrgaMTEx8NcvlMS2nY7DdNlpsUfaxPfIR0sCDvT pKs+qqiX1sGrabP8ZRpXpG4mTYTEsDNz9dYVIPo6ilgHvQwVLJCBsV2oX8y1q6j7Gr3Z D1Xg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=FTG5+aDn; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id n27-20020a1709062bdb00b007038cb015cbsi5966213ejg.274.2022.06.02.22.31.24; Thu, 02 Jun 2022 22:31:49 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=FTG5+aDn; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233977AbiFBKlX (ORCPT + 99 others); Thu, 2 Jun 2022 06:41:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56710 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232717AbiFBKlS (ORCPT ); Thu, 2 Jun 2022 06:41:18 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EEFEE2B194B; Thu, 2 Jun 2022 03:41:16 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 7B820B80DAF; Thu, 2 Jun 2022 10:41:15 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C25D1C385A5; Thu, 2 Jun 2022 10:41:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1654166474; bh=QjUiVyKZNsZkKxCa1CLkhlWoj32OkZtXUL2hEbSq5To=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=FTG5+aDnmbwhXJwH72p6338p68jxKp6xoWgm2zpfxEoP8YIs0J566s2gzPhUOEW+i D6CMaBW6wumkAwZElzLiqvibA0qYBi1xYoLOSKexLQmSycbskXKhd+rV/Ve0nRXe08 1hRippsHY3jPQZszwobu3qaPIRgWFLAfvf7x8s9ZNpYg/KowbNWA3yrHRH26jKcguM ieHSieHZaWtTu3+o1k50sj/lxo5lA3Rnq3QqI2VZs0a4+MNCfMY+Cvo2UVz3/ghI1/ LDA/fWcRsSmeOM8SPAHljfQl59DWtJpy7KcQaDw0IlS86Z/w2GogyWYTtGzqoF4WQS KLd98FLRlHIQA== Date: Thu, 2 Jun 2022 12:41:07 +0200 From: Christian Brauner To: Kees Cook Cc: Jan Kiszka , "Serge E. Hallyn" , Al Viro , Laurent Vivier , linux-fsdevel@vger.kernel.org, Christoph Hellwig , Sargun Dhillon , Jann Horn , Henning Schild , Andrei Vagin , Matthew Bobrowski , linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, containers@lists.linux.dev, Christian Brauner Subject: Re: [PATCH v2 2/2] binfmt_misc: enable sandboxed mounts Message-ID: <20220602104107.6b3d3udhslvhg6ew@wittgenstein> References: <20211216112659.310979-1-brauner@kernel.org> <20211216112659.310979-2-brauner@kernel.org> <20211226133140.GA8064@mail.hallyn.com> <0e817424-51db-fe0b-a00e-ac7933e8ac1d@siemens.com> <20220530081358.b3tvgvo63mq5o2oo@wittgenstein> <202205311219.725ED1C69@keescook> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <202205311219.725ED1C69@keescook> X-Spam-Status: No, score=-7.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, May 31, 2022 at 12:24:37PM -0700, Kees Cook wrote: > On Mon, May 30, 2022 at 10:13:58AM +0200, Christian Brauner wrote: > > On Sun, May 29, 2022 at 09:35:40PM +0200, Jan Kiszka wrote: > > > On 26.12.21 14:31, Serge E. Hallyn wrote: > > > > On Thu, Dec 16, 2021 at 12:26:59PM +0100, Christian Brauner wrote: > > > >> From: Christian Brauner > > > >> > > > >> Enable unprivileged sandboxes to create their own binfmt_misc mounts. > > > >> This is based on Laurent's work in [1] but has been significantly > > > >> reworked to fix various issues we identified in earlier versions. > > > >> > > > >> While binfmt_misc can currently only be mounted in the initial user > > > >> namespace, binary types registered in this binfmt_misc instance are > > > >> available to all sandboxes (Either by having them installed in the > > > >> sandbox or by registering the binary type with the F flag causing the > > > >> interpreter to be opened right away). So binfmt_misc binary types are > > > >> already delegated to sandboxes implicitly. > > > >> > > > >> However, while a sandbox has access to all registered binary types in > > > >> binfmt_misc a sandbox cannot currently register its own binary types > > > >> in binfmt_misc. This has prevented various use-cases some of which were > > > >> already outlined in [1] but we have a range of issues associated with > > > >> this (cf. [3]-[5] below which are just a small sample). > > > >> > > > >> Extend binfmt_misc to be mountable in non-initial user namespaces. > > > >> Similar to other filesystem such as nfsd, mqueue, and sunrpc we use > > > >> keyed superblock management. The key determines whether we need to > > > >> create a new superblock or can reuse an already existing one. We use the > > > >> user namespace of the mount as key. This means a new binfmt_misc > > > >> superblock is created once per user namespace creation. Subsequent > > > >> mounts of binfmt_misc in the same user namespace will mount the same > > > >> binfmt_misc instance. We explicitly do not create a new binfmt_misc > > > >> superblock on every binfmt_misc mount as the semantics for > > > >> load_misc_binary() line up with the keying model. This also allows us to > > > >> retrieve the relevant binfmt_misc instance based on the caller's user > > > >> namespace which can be done in a simple (bounded to 32 levels) loop. > > > >> > > > >> Similar to the current binfmt_misc semantics allowing access to the > > > >> binary types in the initial binfmt_misc instance we do allow sandboxes > > > >> access to their parent's binfmt_misc mounts if they do not have created > > > >> a separate binfmt_misc instance. > > > >> > > > >> Overall, this will unblock the use-cases mentioned below and in general > > > >> will also allow to support and harden execution of another > > > >> architecture's binaries in tight sandboxes. For instance, using the > > > >> unshare binary it possible to start a chroot of another architecture and > > > >> configure the binfmt_misc interpreter without being root to run the > > > >> binaries in this chroot and without requiring the host to modify its > > > >> binary type handlers. > > > >> > > > >> Henning had already posted a few experiments in the cover letter at [1]. > > > >> But here's an additional example where an unprivileged container > > > >> registers qemu-user-static binary handlers for various binary types in > > > >> its separate binfmt_misc mount and is then seamlessly able to start > > > >> containers with a different architecture without affecting the host: > > > >> > > > >> root [lxc monitor] /var/snap/lxd/common/lxd/containers f1 > > > >> 1000000 \_ /sbin/init > > > >> 1000000 \_ /lib/systemd/systemd-journald > > > >> 1000000 \_ /lib/systemd/systemd-udevd > > > >> 1000100 \_ /lib/systemd/systemd-networkd > > > >> 1000101 \_ /lib/systemd/systemd-resolved > > > >> 1000000 \_ /usr/sbin/cron -f > > > >> 1000103 \_ /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only > > > >> 1000000 \_ /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers > > > >> 1000104 \_ /usr/sbin/rsyslogd -n -iNONE > > > >> 1000000 \_ /lib/systemd/systemd-logind > > > >> 1000000 \_ /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,9600 vt220 > > > >> 1000107 \_ dnsmasq --conf-file=/dev/null -u lxc-dnsmasq --strict-order --bind-interfaces --pid-file=/run/lxc/dnsmasq.pid --liste > > > >> 1000000 \_ [lxc monitor] /var/lib/lxc f1-s390x > > > >> 1100000 \_ /usr/bin/qemu-s390x-static /sbin/init > > > >> 1100000 \_ /usr/bin/qemu-s390x-static /lib/systemd/systemd-journald > > > >> 1100000 \_ /usr/bin/qemu-s390x-static /usr/sbin/cron -f > > > >> 1100103 \_ /usr/bin/qemu-s390x-static /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-ac > > > >> 1100000 \_ /usr/bin/qemu-s390x-static /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers > > > >> 1100104 \_ /usr/bin/qemu-s390x-static /usr/sbin/rsyslogd -n -iNONE > > > >> 1100000 \_ /usr/bin/qemu-s390x-static /lib/systemd/systemd-logind > > > >> 1100000 \_ /usr/bin/qemu-s390x-static /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,9600 vt220 > > > >> 1100000 \_ /usr/bin/qemu-s390x-static /sbin/agetty -o -p -- \u --noclear --keep-baud pts/0 115200,38400,9600 vt220 > > > >> 1100000 \_ /usr/bin/qemu-s390x-static /sbin/agetty -o -p -- \u --noclear --keep-baud pts/1 115200,38400,9600 vt220 > > > >> 1100000 \_ /usr/bin/qemu-s390x-static /sbin/agetty -o -p -- \u --noclear --keep-baud pts/2 115200,38400,9600 vt220 > > > >> 1100000 \_ /usr/bin/qemu-s390x-static /sbin/agetty -o -p -- \u --noclear --keep-baud pts/3 115200,38400,9600 vt220 > > > >> 1100000 \_ /usr/bin/qemu-s390x-static /lib/systemd/systemd-udevd > > > >> > > > >> [1]: https://lore.kernel.org/all/20191216091220.465626-1-laurent@vivier.eu > > > >> [2]: https://discuss.linuxcontainers.org/t/binfmt-misc-permission-denied > > > >> [3]: https://discuss.linuxcontainers.org/t/lxd-binfmt-support-for-qemu-static-interpreters > > > >> [4]: https://discuss.linuxcontainers.org/t/3-1-0-binfmt-support-service-in-unprivileged-guest-requires-write-access-on-hosts-proc-sys-fs-binfmt-misc > > > >> [5]: https://discuss.linuxcontainers.org/t/qemu-user-static-not-working-4-11 > > > >> > > > >> Link: https://lore.kernel.org/r/20191216091220.465626-2-laurent@vivier.eu (origin) > > > >> Link: https://lore.kernel.org/r/20211028103114.2849140-2-brauner@kernel.org (v1) > > > >> Cc: Sargun Dhillon > > > >> Cc: Serge Hallyn > > > > > > > > (one typo below) > > > > > > > > Acked-by: Serge Hallyn > > > > > > > > > > What happened to this afterwards? Any remaining issues? > > > > Not that we know. I plan to queue this up for 5.20. > > Hello! > > Thanks for the thread-ping -- I hadn't had a chance to read through this > before, but since it's touching binfmt, it popped up on my radar. :) > > I like it overall, though I'd rather see it split up more (there's > some refactoring built into the patches that would be nice to split out > just to make review easier), but since others have already reviewed it, > that's probably overkill. > > I'd really like to see some self-tests for this, though. Especially Yeah, I had started writing them but decoupled the upstreaming. Imho, you can start queueing this up. I'd like this to have very long exposure in -next. I'll follow up with selftests in the next weeks. (I'm out for a conference this week.) > around the cred logic changes and the namespace fallback logic. I'd like > to explicitly document and test what the expectations are around the > mounts, etc. > > Finally, I'd prefer this went via the execve tree. I mentioned this yesterday to you but just so there's a paper trail: The series and this iteration preceeds the maintainer entry. That's the only reason this originally wasn't aimed at that tree when the series was sent. You've been in Cc from the start though. :) I'd like to step up and maintain the binfmt_misc fs going forward. There are other tweaks it could use. Christian