All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Mickaël Salaün" <mic@digikod.net>
To: Tingmao Wang <m@maowtm.org>
Cc: Song Liu <song@kernel.org>,
	linux-fsdevel@vger.kernel.org,
	 linux-security-module@vger.kernel.org, bpf@vger.kernel.org,
	linux-kernel@vger.kernel.org,  kernel-team@meta.com,
	andrii@kernel.org, eddyz87@gmail.com, ast@kernel.org,
	 daniel@iogearbox.net, martin.lau@linux.dev,
	viro@zeniv.linux.org.uk,  brauner@kernel.org, jack@suse.cz,
	kpsingh@kernel.org, mattbobrowski@google.com,
	 amir73il@gmail.com, repnop@google.com, jlayton@kernel.org,
	josef@toxicpanda.com,  gnoack@google.com
Subject: Re: [PATCH bpf-next 2/4] landlock: Use path_parent()
Date: Mon, 2 Jun 2025 19:35:47 +0200	[thread overview]
Message-ID: <20250602.Oqu6piethung@digikod.net> (raw)
In-Reply-To: <027d5190-b37a-40a8-84e9-4ccbc352bcdf@maowtm.org>

On Sat, May 31, 2025 at 02:51:22PM +0100, Tingmao Wang wrote:
> On 5/28/25 23:26, Song Liu wrote:
> > Use path_parent() to walk a path up to its parent.
> > 
> > While path_parent() has an extra check with path_connected() than existing
> > code, there is no functional changes intended for landlock.
> > 
> > Signed-off-by: Song Liu <song@kernel.org>
> > ---
> >  security/landlock/fs.c | 34 +++++++++++++++++-----------------
> >  1 file changed, 17 insertions(+), 17 deletions(-)
> > 
> > diff --git a/security/landlock/fs.c b/security/landlock/fs.c
> > index 6fee7c20f64d..32a24758ad6e 100644
> > --- a/security/landlock/fs.c
> > +++ b/security/landlock/fs.c
> > @@ -837,7 +837,6 @@ static bool is_access_to_paths_allowed(
> >  	 * restriction.
> >  	 */
> >  	while (true) {
> > -		struct dentry *parent_dentry;
> >  		const struct landlock_rule *rule;
> >  
> >  		/*
> > @@ -896,19 +895,17 @@ static bool is_access_to_paths_allowed(
> >  		if (allowed_parent1 && allowed_parent2)
> >  			break;
> >  jump_up:
> > -		if (walker_path.dentry == walker_path.mnt->mnt_root) {
> > -			if (follow_up(&walker_path)) {
> > -				/* Ignores hidden mount points. */
> > -				goto jump_up;
> > -			} else {
> > -				/*
> > -				 * Stops at the real root.  Denies access
> > -				 * because not all layers have granted access.
> > -				 */
> > -				break;
> > -			}
> > -		}
> > -		if (unlikely(IS_ROOT(walker_path.dentry))) {
> > +		switch (path_parent(&walker_path)) {
> > +		case PATH_PARENT_CHANGED_MOUNT:
> > +			/* Ignores hidden mount points. */
> > +			goto jump_up;
> > +		case PATH_PARENT_REAL_ROOT:
> > +			/*
> > +			 * Stops at the real root.  Denies access
> > +			 * because not all layers have granted access.
> > +			 */
> > +			goto walk_done;
> > +		case PATH_PARENT_DISCONNECTED_ROOT:
> >  			/*
> >  			 * Stops at disconnected root directories.  Only allows
> >  			 * access to internal filesystems (e.g. nsfs, which is
> 
> I was looking at the existing handling of disconnected root in Landlock
> and I realized that the comment here confused me a bit:
> 
> /*
>  * Stops at disconnected root directories.  Only allows
>  * access to internal filesystems (e.g. nsfs, which is
>  * reachable through /proc/<pid>/ns/<namespace>).
>  */
> 
> In the original code, this was under a
> 
>     if (unlikely(IS_ROOT(walker_path.dentry)))
> 
> which means that it only stops walking if we found out we're disconnected
> after reaching a filesystem boundary.  However if before we got to this
> point, we have already collected enough rules to allow access, access
> would be allowed, even if we're currently disconnected.  Demo:
> 
> / # cd /
> / # cp /linux/samples/landlock/sandboxer .
> / # mkdir a b
> / # mkdir a/foo
> / # echo baz > a/foo/bar
> / # mount --bind a b
> / # LL_FS_RO=/ LL_FS_RW=/ ./sandboxer bash
> Executing the sandboxed command...
> / # cd /b/foo
> /b/foo # cat bar
> baz
> /b/foo # mv /a/foo /foo
> /b/foo # cd ..     # <- We're now disconnected
> bash: cd: ..: No such file or directory
> /b/foo # cat bar
> baz                # <- but landlock still lets us read the file
> 
> However, I think this patch will change this behavior due to the use of
> path_connected
> 
> root@10a8fff999ce:/# mkdir a b
> root@10a8fff999ce:/# mkdir a/foo
> root@10a8fff999ce:/# echo baz > a/foo/bar
> root@10a8fff999ce:/# mount --bind a b
> root@10a8fff999ce:/# LL_FS_RO=/ LL_FS_RW=/ ./sandboxer bash
> Executing the sandboxed command...
> bash: cannot set terminal process group (191): Inappropriate ioctl for device
> bash: no job control in this shell
> root@10a8fff999ce:/# cd /b/foo
> root@10a8fff999ce:/b/foo# cat bar
> baz
> root@10a8fff999ce:/b/foo# mv /a/foo /foo
> root@10a8fff999ce:/b/foo# cd ..
> bash: cd: ..: No such file or directory
> root@10a8fff999ce:/b/foo# cat bar
> cat: bar: Permission denied

This is a good test case, we should add a test for that.

> 
> I'm not sure if the original behavior was intentional, but since this
> technically counts as a functional changes, just pointing this out.

This is indeed an issue.

> 
> Also I'm slightly worried about the performance overhead of doing
> path_connected for every hop in the iteration (but ultimately it's
> Mickaël's call).

Yes, we need to check with a benchmark.  We might want to keep the
walker_path.dentry == walker_path.mnt->mnt_root check inlined.

> At least for Landlock, I think if we want to block all
> access to disconnected files, as long as we eventually realize we have
> been disconnected (by doing the "if dentry == path.mnt" check once when we
> reach root), and in that case deny access, we should be good.
> 
> 
> > @@ -918,12 +915,15 @@ static bool is_access_to_paths_allowed(
> >  				allowed_parent1 = true;
> >  				allowed_parent2 = true;
> >  			}
> > +			goto walk_done;
> > +		case PATH_PARENT_SAME_MOUNT:
> >  			break;
> > +		default:
> > +			WARN_ON_ONCE(1);
> > +			goto walk_done;
> >  		}
> > -		parent_dentry = dget_parent(walker_path.dentry);
> > -		dput(walker_path.dentry);
> > -		walker_path.dentry = parent_dentry;
> >  	}
> > +walk_done:
> >  	path_put(&walker_path);
> >  
> >  	if (!allowed_parent1) {
> 
> 

  parent reply	other threads:[~2025-06-02 17:35 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-05-28 22:26 [PATCH bpf-next 0/4] bpf path iterator Song Liu
2025-05-28 22:26 ` [PATCH bpf-next 1/4] namei: Introduce new helper function path_parent() Song Liu
2025-05-28 22:26 ` [PATCH bpf-next 2/4] landlock: Use path_parent() Song Liu
2025-05-31 13:51   ` Tingmao Wang
2025-06-02 13:36     ` Song Liu
2025-06-03  0:10       ` Song Liu
2025-06-03 12:47         ` Mickaël Salaün
2025-06-02 17:35     ` Mickaël Salaün [this message]
2025-06-02 22:56       ` Tingmao Wang
2025-05-28 22:26 ` [PATCH bpf-next 3/4] bpf: Introduce path iterator Song Liu
2025-05-28 22:37   ` Al Viro
2025-05-29 11:58     ` Jan Kara
2025-05-29 16:53       ` Song Liu
2025-05-29 16:57         ` Alexei Starovoitov
2025-05-29 17:05           ` Song Liu
2025-05-30 14:20             ` Mickaël Salaün
2025-06-02  9:41               ` Christian Brauner
2025-06-03  9:46               ` Jan Kara
2025-06-03 12:49                 ` Mickaël Salaün
2025-06-03 21:13                   ` Jan Kara
2025-05-29 17:38         ` Al Viro
2025-05-29 18:00           ` Song Liu
2025-05-29 18:35             ` Al Viro
2025-05-29 19:46               ` Song Liu
2025-05-29 20:15                 ` Al Viro
2025-05-29 21:07                   ` Song Liu
2025-05-29 21:45                     ` Al Viro
2025-05-29 22:13                       ` Song Liu
2025-05-29 23:10                         ` Al Viro
2025-05-30  0:42                           ` Song Liu
2025-05-30 12:20                             ` Mickaël Salaün
2025-05-30 18:43                               ` Al Viro
2025-05-31  8:39                                 ` Mickaël Salaün
2025-06-02  9:32                                 ` Christian Brauner
2025-05-30 18:55                               ` Song Liu
2025-05-31  8:40                                 ` Mickaël Salaün
2025-05-31 14:05                                 ` Tingmao Wang
2025-06-01 23:33                                   ` Song Liu
2025-06-04  0:58                             ` Tingmao Wang
2025-06-02  9:30                           ` Christian Brauner
2025-06-02  9:27             ` Christian Brauner
2025-06-02 13:27               ` Song Liu
2025-06-02 15:40                 ` Alexei Starovoitov
2025-06-02 21:39                   ` Song Liu
2025-05-28 22:26 ` [PATCH bpf-next 4/4] selftests/bpf: Add tests for bpf " Song Liu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250602.Oqu6piethung@digikod.net \
    --to=mic@digikod.net \
    --cc=amir73il@gmail.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=brauner@kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=eddyz87@gmail.com \
    --cc=gnoack@google.com \
    --cc=jack@suse.cz \
    --cc=jlayton@kernel.org \
    --cc=josef@toxicpanda.com \
    --cc=kernel-team@meta.com \
    --cc=kpsingh@kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-security-module@vger.kernel.org \
    --cc=m@maowtm.org \
    --cc=martin.lau@linux.dev \
    --cc=mattbobrowski@google.com \
    --cc=repnop@google.com \
    --cc=song@kernel.org \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.