summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorAlexei Starovoitov <ast@kernel.org>2025-02-14 06:35:32 +0300
committerAlexei Starovoitov <ast@kernel.org>2025-02-14 06:35:32 +0300
commit68a41544909eff32df9a84c89cd10ec328a1858c (patch)
tree0eee579fa9aabf4327140d49854d538b0cf1487d /include
parentb99f27e90268b1a814c13f8bd72ea1db448ea257 (diff)
parent60c2e1fa9168644db157665a44982861aa67dbef (diff)
downloadlinux-68a41544909eff32df9a84c89cd10ec328a1858c.tar.xz
Merge branch 'enable-writing-xattr-from-bpf-programs'
Song Liu says: ==================== Enable writing xattr from BPF programs Add support to set and remove xattr from BPF program. Also add security.bpf. xattr name prefix. kfuncs are added to set and remove xattrs with security.bpf. name prefix. Update kfuncs bpf_get_[file|dentry]_xattr to read xattrs with security.bpf. name prefix. Note that BPF programs can read user. xattrs, but not write and remove them. To pick the right version of kfunc to use, a remap logic is added to btf_kfunc_id_set. This helps move some kfunc specific logic off the verifier core code. Also use this remap logic to select bpf_dynptr_from_skb or bpf_dynptr_from_skb_rdonly. Cover letter of v1 and v2: Follow up discussion in LPC 2024 [1], that we need security.bpf xattr prefix. This set adds "security.bpf." xattr name prefix, and allows bpf kfuncs bpf_get_[file|dentry]_xattr() to read these xattrs. [1] https://lpc.events/event/18/contributions/1940/ --- Changes v11 => v12: 1. Drop btf_kfunc_id_set.remap and changes for bpf_dynptr_from_skb. (Alexei) 2. Minor refactoring in patch 1. (Matt Bobrowski) v11: https://lore.kernel.org/bpf/20250129205957.2457655-1-song@kernel.org/ Changes v10 => v11: 1. Add Acked-by from Christian Brauner. 2. Fix selftests build error like this one: https://github.com/kernel-patches/bpf/actions/runs/13022268618/job/36325472992 3. Rename some variables in the selftests. v10: https://lore.kernel.org/bpf/20250124202911.3264715-1-song@kernel.org/ Changes v9 => v10: 1. Refactor bpf_[set|remove]_dentry_xattr[_locked]. (Christian Brauner). v9: https://lore.kernel.org/bpf/20250110011342.2965136-1-song@kernel.org/ Changes v8 => v9 1. Fix build for CONFIG_DEBUG_INFO_BTF=n case. (kernel test robot) v8: https://lore.kernel.org/bpf/20250108225140.3467654-1-song@kernel.org/ Changes v7 => v8 1. Rebase and resolve conflicts. v7: https://lore.kernel.org/bpf/20241219221439.2455664-1-song@kernel.org/ Changes v6 => v7 1. Move btf_kfunc_id_remap() to the right place. (Bug reported by CI) v6: https://lore.kernel.org/bpf/20241219202536.1625216-1-song@kernel.org/ Changes v5 => v6 1. Hide _locked version of the kfuncs from vmlinux.h (Alexei) 2. Add remap logic to btf_kfunc_id_set and use that to pick the correct version of kfuncs to use. 3. Also use the remap logic for bpf_dynptr_from_skb[|_rdonly]. v5: https://lore.kernel.org/bpf/20241218044711.1723221-1-song@kernel.org/ Changes v4 => v5 1. Let verifier pick proper kfunc (_locked or not _locked) based on the calling context. (Alexei) 2. Remove the __failure test (6/6 of v4). v4: https://lore.kernel.org/bpf/20241217063821.482857-1-song@kernel.org/ Changes v3 => v4 1. Do write permission check with inode locked. (Jan Kara) 2. Fix some source_inline warnings. v3: https://lore.kernel.org/bpf/20241210220627.2800362-1-song@kernel.org/ Changes v2 => v3 1. Add kfuncs to set and remove xattr from BPF programs. v2: https://lore.kernel.org/bpf/20241016070955.375923-1-song@kernel.org/ Changes v1 => v2 1. Update comment of bpf_get_[file|dentry]_xattr. (Jiri Olsa) 2. Fix comment for return value of bpf_get_[file|dentry]_xattr. v1: https://lore.kernel.org/bpf/20241002214637.3625277-1-song@kernel.org/ ==================== Link: https://patch.msgid.link/20250130213549.3353349-1-song@kernel.org Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'include')
-rw-r--r--include/linux/bpf_lsm.h18
-rw-r--r--include/uapi/linux/xattr.h4
2 files changed, 22 insertions, 0 deletions
diff --git a/include/linux/bpf_lsm.h b/include/linux/bpf_lsm.h
index aefcd6564251..643809cc78c3 100644
--- a/include/linux/bpf_lsm.h
+++ b/include/linux/bpf_lsm.h
@@ -48,6 +48,11 @@ void bpf_lsm_find_cgroup_shim(const struct bpf_prog *prog, bpf_func_t *bpf_func)
int bpf_lsm_get_retval_range(const struct bpf_prog *prog,
struct bpf_retval_range *range);
+int bpf_set_dentry_xattr_locked(struct dentry *dentry, const char *name__str,
+ const struct bpf_dynptr *value_p, int flags);
+int bpf_remove_dentry_xattr_locked(struct dentry *dentry, const char *name__str);
+bool bpf_lsm_has_d_inode_locked(const struct bpf_prog *prog);
+
#else /* !CONFIG_BPF_LSM */
static inline bool bpf_lsm_is_sleepable_hook(u32 btf_id)
@@ -86,6 +91,19 @@ static inline int bpf_lsm_get_retval_range(const struct bpf_prog *prog,
{
return -EOPNOTSUPP;
}
+static inline int bpf_set_dentry_xattr_locked(struct dentry *dentry, const char *name__str,
+ const struct bpf_dynptr *value_p, int flags)
+{
+ return -EOPNOTSUPP;
+}
+static inline int bpf_remove_dentry_xattr_locked(struct dentry *dentry, const char *name__str)
+{
+ return -EOPNOTSUPP;
+}
+static inline bool bpf_lsm_has_d_inode_locked(const struct bpf_prog *prog)
+{
+ return false;
+}
#endif /* CONFIG_BPF_LSM */
#endif /* _LINUX_BPF_LSM_H */
diff --git a/include/uapi/linux/xattr.h b/include/uapi/linux/xattr.h
index 9854f9cff3c6..c7c85bb504ba 100644
--- a/include/uapi/linux/xattr.h
+++ b/include/uapi/linux/xattr.h
@@ -83,6 +83,10 @@ struct xattr_args {
#define XATTR_CAPS_SUFFIX "capability"
#define XATTR_NAME_CAPS XATTR_SECURITY_PREFIX XATTR_CAPS_SUFFIX
+#define XATTR_BPF_LSM_SUFFIX "bpf."
+#define XATTR_NAME_BPF_LSM (XATTR_SECURITY_PREFIX XATTR_BPF_LSM_SUFFIX)
+#define XATTR_NAME_BPF_LSM_LEN (sizeof(XATTR_NAME_BPF_LSM) - 1)
+
#define XATTR_POSIX_ACL_ACCESS "posix_acl_access"
#define XATTR_NAME_POSIX_ACL_ACCESS XATTR_SYSTEM_PREFIX XATTR_POSIX_ACL_ACCESS
#define XATTR_POSIX_ACL_DEFAULT "posix_acl_default"