[PATCH v2 3/9] setpriv: dump user and group info
Tito
farmatito at tiscali.it
Sun Jul 2 15:02:52 UTC 2017
Hi,
just a few hints (untested).
Ciao,
Tito
On 07/02/2017 03:42 PM, Patrick Steinhardt wrote:
> setpriv from util-linux has an option to dump the current state
> regarding privilege settings via `--dump`. It prints out information on
> the real and effective user and group IDs, supplementary groups, the
> no-new-privs flag, the capability sets as well as secure bits.
>
> This patch is the start of supporting this mode. To make introduction of
> the `--dump` easier to reason about, its introduction has been split
> into multiple patches. This particular one introduces the ability to
> print out user and group information of the current process.
> ---
> util-linux/setpriv.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 69 insertions(+), 2 deletions(-)
>
> diff --git a/util-linux/setpriv.c b/util-linux/setpriv.c
> index d586f4bef..dabc6d355 100644
> --- a/util-linux/setpriv.c
> +++ b/util-linux/setpriv.c
> @@ -15,6 +15,14 @@
> //config: help
> //config: Run a program with different Linux privilege settings.
> //config: Requires kernel >= 3.5
> +//config:
> +//config:config FEATURE_SETPRIV_DUMP
> +//config: bool "Support dumping current privilege state"
> +//config: default y
> +//config: depends on SETPRIV
> +//config: help
> +//config: Enables the "--dump" switch to print out the current privilege
> +//config: state. This is helpful for diagnosing problems.
>
> //applet:IF_SETPRIV(APPLET(setpriv, BB_DIR_BIN, BB_SUID_DROP))
>
> @@ -24,6 +32,9 @@
> //usage: "[OPTIONS] PROG [ARGS]"
> //usage:#define setpriv_full_usage "\n\n"
> //usage: "Run PROG with different privilege settings\n"
> +//usage: IF_FEATURE_SETPRIV_DUMP(
> +//usage: "\n-d,--dump Show current capabilities"
> +//usage: )
> //usage: "\n--nnp,--no-new-privs Ignore setuid/setgid bits and file capabilities"
>
> //setpriv from util-linux 2.28:
> @@ -45,6 +56,7 @@
> // --apparmor-profile <pr> set AppArmor profile
>
> #include <sys/prctl.h>
> +#include <unistd.h>
> #include "libbb.h"
>
> #ifndef PR_SET_NO_NEW_PRIVS
> @@ -52,15 +64,61 @@
> #endif
>
> enum {
> + IF_FEATURE_SETPRIV_DUMP(OPTBIT_DUMP,)
> OPTBIT_NNP,
>
> - OPT_NNP = (1 << OPTBIT_NNP),
> + IF_FEATURE_SETPRIV_DUMP(OPT_DUMP = (1 << OPTBIT_DUMP),)
> + OPT_NNP = (1 << OPTBIT_NNP),
> };
>
> +#if ENABLE_FEATURE_SETPRIV_DUMP
> +static int dump(void)
> +{
> + uid_t ruid, euid, suid;
> + gid_t rgid, egid, sgid;
> + gid_t *gids;
> + int ngids;
> +
> + if (getresuid(&ruid, &euid, &suid) < 0)
> + bb_simple_perror_msg_and_die("getresgid");
> +
> + if (getresgid(&rgid, &egid, &sgid) < 0)
> + bb_simple_perror_msg_and_die("getresgid");
> +
> + if ((ngids = getgroups(0, NULL)) < 0)
> + bb_simple_perror_msg_and_die("getgroups");
Getgroups is expensive, maybe try to run it only once? see id.c and test.c
(eventually common code for a libbb function?)
n = 32;
*n = getgroups(*n, groups);
if (*n >= 0)
return *n;
/* Error */
if (errno == EINVAL) /* *n is too small? */
*n = getgroups(0, groups); /* get needed *n */
/* if *n >= 0, return -1 (got new *n), else return 0 (error): */
return -(*n >= 0);
> + gids = xmalloc(ngids * sizeof(*gids));
> + if ((ngids = getgroups(ngids, gids)) < 0)
> + bb_simple_perror_msg_and_die("getgroups");
> +
> + printf("uid: %d\n", ruid);
> + printf("euid: %d\n", euid);
> + printf("gid: %d\n", rgid);
> + printf("egid: %d\n", egid);
> +
> + printf("Supplementary groups: ");
> +
just ne line, more code fits on the screen.
printf("uid: %d\neuid: %d\ngid: %d\negid: %d\nSupplementary groups: ", ruid, euid, rgid, egid);
> + if (ngids == 0) {
> + printf("[none]");
> + } else {
> + int i;
> + for (i = 0; i < ngids; i++) {
> + if (i)
> + putchar(',');
> + printf("%d", gids[i]);
> + }
> + }
> + putchar('\n');
> +
> + free(gids);
> + return 0;
> +}
> +#endif /* FEATURE_SETPRIV_DUMP */
> +
> int setpriv_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
> int setpriv_main(int argc UNUSED_PARAM, char **argv)
> {
> static const char setpriv_longopts[] ALIGN1 =
> + IF_FEATURE_SETPRIV_DUMP("dump\0" No_argument "d")
> "nnp\0" No_argument "\xff"
> "no-new-privs\0" No_argument "\xff"
> ;
> @@ -68,11 +126,20 @@ int setpriv_main(int argc UNUSED_PARAM, char **argv)
>
> opt_complementary = "";
> applet_long_options = setpriv_longopts;
> - opts = getopt32(argv, "+");
> + opts = getopt32(argv, "+" IF_FEATURE_SETPRIV_DUMP("d"));
>
> argc -= optind;
> argv += optind;
>
> +#if ENABLE_FEATURE_SETPRIV_DUMP
> + if (opts & OPT_DUMP) {
> + if ((opts & ~OPT_DUMP) || argc)
applet name is not needed as it is added by bb_error_msg_and_die, shorter error message
would be nice.
> + bb_error_msg_and_die("setpriv: --dump is incompatible with all other options");
> +
> + return dump();
> + }
> +#endif
> +
> if (!argc)
> bb_error_msg_and_die("no program specified");
>
>
More information about the busybox
mailing list