mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH RFC -next 00/12] landlock: Add READ_METADATA and WRITE_METADATA access rights
@ 2026-09-24 10:48 Cai Xinchen
  2026-09-24 10:48 ` [PATCH RFC -next 01/12] fs: pass struct path to notify_change() Cai Xinchen
                   ` (14 more replies)
  0 siblings, 15 replies; 20+ messages in thread
From: Cai Xinchen @ 2026-09-24 10:48 UTC (permalink / raw)
  To: mic, gnoack, paul, jmorris, serge, corbet, skhan
  Cc: rdunlap, gregkh, rafael, dakr, dlemoal, hch, axboe, viro,
	brauner, jack, dhowells, code, linkinjeon, sj1557.seo,
	yuezhang.mo, hirofumi, cel, jlayton, neil, okorniev, Dai.Ngo,
	tom, miklos, amir73il, senozhatsky, chenxiaosong, zohar,
	roberto.sassu, dmitry.kasatkin, eric.snowberg,
	stephen.smalley.work, omosnacek, casey, nanx95726, djwong,
	daniel, linux-security-module, linux-doc, linux-kernel,
	driver-core, linux-block, linux-fsdevel, netfs, ecryptfs, exfat,
	linux-nfs, linux-unionfs, linux-cifs, linux-integrity, selinux,
	linux-kselftest, xiujianfeng, caixinchen1, lujialin4

This series adds two new Landlock filesystem access rights,
LANDLOCK_ACCESS_FS_READ_METADATA and LANDLOCK_ACCESS_FS_WRITE_METADATA,
which control access to file and directory metadata such as inode
attributes (mode, ownership, timestamps), extended attributes and POSIX
ACLs.  It picks up the work from the "landlock: add chmod and chown
support" series [1] and follows the coarse-grained grouping discussed in
that thread [2]: instead of separate chmod/chown rights, metadata
operations are grouped into one read and one write right.

Landlock evaluates access rights on a per-path basis, but the metadata
related LSM hooks (inode_getattr, inode_setattr, inode_setxattr,
inode_getxattr, inode_listxattr, inode_removexattr, inode_set_acl,
inode_get_acl, inode_remove_acl) only receive the dentry of the accessed
object.  Patches 1-7 therefore first pass struct path instead of dentry
through the metadata-related VFS helpers and LSM hooks.  This is a pure
refactoring with no behavior change, split so that every patch builds
and works on its own:

  1: notify_change() and its callers
  2: inode_setsecctx hook (must come before 3: the SELinux and Smack
     implementations call __vfs_setxattr_locked internally)
  3: xattr helpers, which also drops a redundant EVM xattr size sanity
     check whose vfs_getxattr() call only has a dentry and therefore
     cannot be migrated to the new path-based signature
  4: POSIX ACL helpers
  5: inode_setattr hook
  6: inode xattr hooks
  7: inode POSIX ACL hooks

Two deliberate scoping decisions for this refactor:

- The hooks consistently take struct path rather than struct file.  The
  VFS call sites involved (chmod(2), chown(2), utimensat(2), xattr(2)
  and ACL syscalls) operate on paths, and several of them (lstat(2),
  lchown(2), llistxattr(2), ...) have no struct file to begin with.

- struct inode_operations->setattr still receives (idmap, dentry, attr).
  Only the VFS boundary (notify_change()) and the LSM hook layer see the
  path, which keeps the refactor contained to fs/attr.c and the LSM
  infrastructure instead of touching every filesystem.

Patches 8-12 then implement the new rights, their tests, the sandboxer
sample and the documentation.  Semantics:

- READ_METADATA covers stat(2) and friends, getxattr(2) and friends,
  listxattr(2) and friends, and POSIX ACL reads.
- WRITE_METADATA covers chmod(2), chown(2), utimensat(2), setxattr(2),
  removexattr(2) and friends, and POSIX ACL set and remove.
- Only explicit metadata changes requested by user space are restricted.
  Implicit changes performed by the kernel (e.g. timestamp updates on
  write(2), size changes on truncate(2)) are not, and neither are
  chmod(2)/chown(2) calls that change nothing (e.g. chown(2) with
  (-1, -1), which never reaches the hook), matching the SELinux
  inode_setattr behavior.
- Kernel-internal accesses performed with override_creds() (e.g.
  overlayfs, cachefiles) and kernel threads without a Landlock domain
  (e.g. nfsd, ksmbd) are not restricted.

The Landlock ABI version is incremented from 11 to 12.

The series is based on linux-next commit 5c4d4169604b ("Add linux-next
specific files for 20260921").

Testing: each patch has been built for aarch64 (gcc, -Werror) and the
landlock selftests (445 tests, including the new ones) pass in QEMU on
aarch64; base_test reports ABI v12.

[1] https://lore.kernel.org/all/20220827111215.131442-1-xiujianfeng@huawei.com/
[2] https://lore.kernel.org/all/abc960a1-e66e-792e-6869-cfd201c29dbe@digikod.net/

Assisted-by: opencode: glm-5.3

Cai Xinchen (12):
  fs: pass struct path to notify_change()
  LSM: pass struct path to the inode_setsecctx hook
  fs: pass struct path to xattr helpers
  fs: pass struct path to POSIX ACL helpers
  LSM: pass struct path to the inode_setattr hook
  LSM: pass struct path to the inode xattr hooks
  LSM: pass struct path to the inode posix acl hooks
  landlock: Add READ_METADATA and WRITE_METADATA access rights
  landlock: Implement metadata access hooks
  selftests/landlock: Add tests for metadata access rights
  samples/landlock: Add metadata rights to sandboxer
  Documentation: Update landlock doc for metadata rights

 Documentation/userspace-api/landlock.rst     |  11 +-
 drivers/base/devtmpfs.c                      |   6 +-
 drivers/block/zloop.c                        |   4 +-
 fs/attr.c                                    |  20 +-
 fs/cachefiles/interface.c                    |   6 +-
 fs/cachefiles/xattr.c                        |  32 +-
 fs/coredump.c                                |   2 +-
 fs/ecryptfs/inode.c                          |  34 +-
 fs/exfat/file.c                              |   3 +-
 fs/fat/file.c                                |   3 +-
 fs/inode.c                                   |   7 +-
 fs/internal.h                                |  17 +-
 fs/namei.c                                   |   7 +-
 fs/nfsd/nfs4ctl.h                            |   4 +-
 fs/nfsd/nfs4state.c                          |  14 +-
 fs/nfsd/nfs4xdr.c                            |   2 +-
 fs/nfsd/state.h                              |   2 +-
 fs/nfsd/vfs.c                                |  73 +++--
 fs/open.c                                    |  18 +-
 fs/overlayfs/copy_up.c                       |   4 +-
 fs/overlayfs/inode.c                         |   4 +-
 fs/overlayfs/overlayfs.h                     |  39 ++-
 fs/overlayfs/xattrs.c                        |  13 +-
 fs/posix_acl.c                               |  46 +--
 fs/smb/server/smb2pdu.c                      |  77 ++---
 fs/smb/server/smb_common.c                   |   2 -
 fs/smb/server/smbacl.c                       |  21 +-
 fs/smb/server/tests/smbacl_kunit.c           |   6 +-
 fs/smb/server/vfs.c                          | 111 +++----
 fs/smb/server/vfs.h                          |  39 +--
 fs/smb/server/vfs_cache.c                    |   3 +-
 fs/utimes.c                                  |   3 +-
 fs/xattr.c                                   |  96 +++---
 include/linux/fs.h                           |   6 +-
 include/linux/landlock.h                     |   4 +-
 include/linux/lsm_hook_defs.h                |  29 +-
 include/linux/posix_acl.h                    |  21 +-
 include/linux/security.h                     |  65 ++--
 include/linux/xattr.h                        |  22 +-
 include/uapi/linux/landlock.h                |  26 +-
 samples/landlock/sandboxer.c                 |  17 +-
 security/commoncap.c                         |  22 +-
 security/integrity/evm/evm_crypto.c          |   8 +-
 security/integrity/evm/evm_main.c            |  36 ++-
 security/integrity/ima/ima_appraise.c        |  17 +-
 security/landlock/fs.c                       |  86 ++++++
 security/landlock/limits.h                   |   2 +-
 security/landlock/syscalls.c                 |   2 +-
 security/security.c                          |  99 +++---
 security/selinux/hooks.c                     |  49 +--
 security/smack/smack_lsm.c                   |  62 ++--
 tools/testing/selftests/landlock/base_test.c |   2 +-
 tools/testing/selftests/landlock/fs_test.c   | 309 ++++++++++++++++++-
 53 files changed, 999 insertions(+), 614 deletions(-)

-- 
2.18.0.huawei.25


^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2026-09-26  8:38 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-24 10:48 [PATCH RFC -next 00/12] landlock: Add READ_METADATA and WRITE_METADATA access rights Cai Xinchen
2026-09-24 10:48 ` [PATCH RFC -next 01/12] fs: pass struct path to notify_change() Cai Xinchen
2026-09-24 10:48 ` [PATCH RFC -next 02/12] LSM: pass struct path to the inode_setsecctx hook Cai Xinchen
2026-09-24 10:48 ` [PATCH RFC -next 03/12] fs: pass struct path to xattr helpers Cai Xinchen
2026-09-24 11:12   ` Amir Goldstein
2026-09-24 10:48 ` [PATCH RFC -next 04/12] fs: pass struct path to POSIX ACL helpers Cai Xinchen
2026-09-24 10:48 ` [PATCH RFC -next 05/12] LSM: pass struct path to the inode_setattr hook Cai Xinchen
2026-09-24 10:48 ` [PATCH RFC -next 06/12] LSM: pass struct path to the inode xattr hooks Cai Xinchen
2026-09-24 10:48 ` [PATCH RFC -next 07/12] LSM: pass struct path to the inode posix acl hooks Cai Xinchen
2026-09-24 10:48 ` [PATCH RFC -next 08/12] landlock: Add READ_METADATA and WRITE_METADATA access rights Cai Xinchen
2026-09-24 10:48 ` [PATCH RFC -next 09/12] landlock: Implement metadata access hooks Cai Xinchen
2026-09-26  8:38   ` Günther Noack
2026-09-24 10:48 ` [PATCH RFC -next 10/12] selftests/landlock: Add tests for metadata access rights Cai Xinchen
2026-09-24 10:48 ` [PATCH RFC -next 11/12] samples/landlock: Add metadata rights to sandboxer Cai Xinchen
2026-09-24 10:48 ` [PATCH RFC -next 12/12] Documentation: Update landlock doc for metadata rights Cai Xinchen
2026-09-25 15:33 ` [PATCH RFC -next 00/12] landlock: Add READ_METADATA and WRITE_METADATA access rights Christian Brauner
2026-09-25 17:07   ` Paul Moore
2026-09-25 18:03 ` Justin Suess
2026-09-26  7:56   ` Günther Noack
2026-09-26  8:27 ` Günther Noack

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®