mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-04 04:06:26 +00:00
d1d991efaf
Reuse the existing extended permissions infrastructure to support policies based on the netlink message types. A new policy capability "netlink_xperm" is introduced. When disabled, the previous behaviour is preserved. That is, netlink_send will rely on the permission mappings defined in nlmsgtab.c (e.g, nlmsg_read for RTM_GETADDR on NETLINK_ROUTE). When enabled, the mappings are ignored and the generic "nlmsg" permission is used instead. The new "nlmsg" permission is an extended permission. The 16 bits of the extended permission are mapped to the nlmsg_type field. Example policy on Android, preventing regular apps from accessing the device's MAC address and ARP table, but allowing this access to privileged apps, looks as follows: allow netdomain self:netlink_route_socket { create read getattr write setattr lock append connect getopt setopt shutdown nlmsg }; allowxperm netdomain self:netlink_route_socket nlmsg ~{ RTM_GETLINK RTM_GETNEIGH RTM_GETNEIGHTBL }; allowxperm priv_app self:netlink_route_socket nlmsg { RTM_GETLINK RTM_GETNEIGH RTM_GETNEIGHTBL }; The constants in the example above (e.g., RTM_GETLINK) are explicitly defined in the policy. It is possible to generate policies to support kernels that may or may not have the capability enabled by generating a rule for each scenario. For instance: allow domain self:netlink_audit_socket nlmsg_read; allow domain self:netlink_audit_socket nlmsg; allowxperm domain self:netlink_audit_socket nlmsg { AUDIT_GET }; The approach of defining a new permission ("nlmsg") instead of relying on the existing permissions (e.g., "nlmsg_read", "nlmsg_readpriv" or "nlmsg_tty_audit") has been preferred because: 1. This is similar to the other extended permission ("ioctl"); 2. With the new extended permission, the coarse-grained mapping is not necessary anymore. It could eventually be removed, which would be impossible if the extended permission was defined below these. 3. Having a single extra extended permission considerably simplifies the implementation here and in libselinux. Signed-off-by: Thiébaud Weksteen <tweek@google.com> Signed-off-by: Bram Bonné <brambonne@google.com> [PM: manual merge fixes for sock_skip_has_perm()] Signed-off-by: Paul Moore <paul@paul-moore.com>
25 lines
628 B
C
25 lines
628 B
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
#ifndef _SELINUX_POLICYCAP_H_
|
|
#define _SELINUX_POLICYCAP_H_
|
|
|
|
/* Policy capabilities */
|
|
enum {
|
|
POLICYDB_CAP_NETPEER,
|
|
POLICYDB_CAP_OPENPERM,
|
|
POLICYDB_CAP_EXTSOCKCLASS,
|
|
POLICYDB_CAP_ALWAYSNETWORK,
|
|
POLICYDB_CAP_CGROUPSECLABEL,
|
|
POLICYDB_CAP_NNP_NOSUID_TRANSITION,
|
|
POLICYDB_CAP_GENFS_SECLABEL_SYMLINKS,
|
|
POLICYDB_CAP_IOCTL_SKIP_CLOEXEC,
|
|
POLICYDB_CAP_USERSPACE_INITIAL_CONTEXT,
|
|
POLICYDB_CAP_NETLINK_XPERM,
|
|
__POLICYDB_CAP_MAX
|
|
};
|
|
#define POLICYDB_CAP_MAX (__POLICYDB_CAP_MAX - 1)
|
|
|
|
extern const char *const selinux_policycap_names[__POLICYDB_CAP_MAX];
|
|
|
|
#endif /* _SELINUX_POLICYCAP_H_ */
|