setpriv: Preliminary no_cap_ambient_raise support
Signed-off-by: Andy Lutomirski <luto@kernel.org>
diff --git a/sys-utils/setpriv.c b/sys-utils/setpriv.c
index e44b5f5..7907c9f 100644
--- a/sys-utils/setpriv.c
+++ b/sys-utils/setpriv.c
@@ -53,6 +53,15 @@
# define PR_CAP_AMBIENT_LOWER 3
#endif
+#ifndef SECURE_NO_CAP_AMBIENT_RAISE
+# define SECURE_NO_CAP_AMBIENT_RAISE 6
+# define SECURE_NO_CAP_AMBIENT_RAISE_LOCKED 7 /* make bit-6 immutable */
+# define SECBIT_NO_CAP_AMBIENT_RAISE \
+ (issecure_mask(SECURE_NO_CAP_AMBIENT_RAISE))
+# define SECBIT_NO_CAP_AMBIENT_RAISE_LOCKED \
+ (issecure_mask(SECURE_NO_CAP_AMBIENT_RAISE_LOCKED))
+#endif
+
#define SETPRIV_EXIT_PRIVERR 127 /* how we exit when we fail to set privs */
/*
@@ -226,6 +235,10 @@
bits &= ~SECBIT_KEEP_CAPS;
dump_one_secbit(&first, &bits, SECBIT_KEEP_CAPS_LOCKED,
"keep_caps_locked");
+ dump_one_secbit(&first, &bits, SECBIT_NO_CAP_AMBIENT_RAISE,
+ "no_cap_ambient_raise");
+ dump_one_secbit(&first, &bits, SECBIT_NO_CAP_AMBIENT_RAISE_LOCKED,
+ "no_cap_ambient_raise_locked");
if (bits) {
if (!first)
printf(",");
@@ -514,7 +527,9 @@
SECBIT_NO_SETUID_FIXUP |
SECBIT_NO_SETUID_FIXUP_LOCKED |
SECBIT_KEEP_CAPS |
- SECBIT_KEEP_CAPS_LOCKED))
+ SECBIT_KEEP_CAPS_LOCKED |
+ SECBIT_NO_CAP_AMBIENT_RAISE |
+ SECBIT_NO_CAP_AMBIENT_RAISE_LOCKED))
errx(SETPRIV_EXIT_PRIVERR,
_("unrecognized securebit set -- refusing to adjust"));
@@ -543,6 +558,10 @@
_("adjusting keep_caps does not make sense"));
else if (!strcmp(c + 1, "keep_caps_locked"))
bit = SECBIT_KEEP_CAPS_LOCKED; /* sigh */
+ else if (!strcmp(c + 1, "no_cap_ambient_raise"))
+ bit = SECBIT_NO_CAP_AMBIENT_RAISE;
+ else if (!strcmp(c + 1, "no_cap_ambient_raise_locked"))
+ bit = SECBIT_NO_CAP_AMBIENT_RAISE_LOCKED;
else
errx(EXIT_FAILURE, _("unrecognized securebit"));