aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuis Hector Chavez <lhchavez@google.com>2017-06-30 21:35:57 +0000
committerandroid-build-merger <android-build-merger@google.com>2017-06-30 21:35:57 +0000
commit3b361c5622af10a346adf190a628568994a98374 (patch)
treee22a98309e9828cd95d3d19c606544a14e19e341
parent04db2854a766df8273ca48e5d4f1763e634098f2 (diff)
parentab5309116f52311d444a0e4fe8ae030044cbb28d (diff)
downloadminijail-3b361c5622af10a346adf190a628568994a98374.tar.gz
minijail: Add support for dropping caps with static binaries am: fe5fb8ea50 am: 5302f58f1c
am: ab5309116f Change-Id: If3edf723305edeef2a602e7c71fa70ee797fc096
-rw-r--r--libminijail.c8
-rw-r--r--minijail0.c54
2 files changed, 41 insertions, 21 deletions
diff --git a/libminijail.c b/libminijail.c
index b119542..6381c30 100644
--- a/libminijail.c
+++ b/libminijail.c
@@ -2011,9 +2011,11 @@ int minijail_run_internal(struct minijail *j, const char *filename,
}
if (!use_preload) {
- if (j->flags.use_caps && j->caps != 0)
- die("non-empty capabilities are not supported without "
- "LD_PRELOAD");
+ if (j->flags.use_caps && j->caps != 0 &&
+ !j->flags.set_ambient_caps) {
+ die("non-empty, non-ambient capabilities are not "
+ "supported without LD_PRELOAD");
+ }
}
/*
diff --git a/minijail0.c b/minijail0.c
index 017c1bf..fb98163 100644
--- a/minijail0.c
+++ b/minijail0.c
@@ -523,44 +523,62 @@ static int parse_args(struct minijail *j, int argc, char *argv[],
free((void *)filter_path);
}
+ /*
+ * There should be at least one additional unparsed argument: the
+ * executable name.
+ */
if (argc == optind) {
usage(argv[0]);
exit(1);
}
- return optind;
-}
-
-int main(int argc, char *argv[])
-{
- struct minijail *j = minijail_new();
- const char *dl_mesg = NULL;
- int exit_immediately = 0;
- ElfType elftype = ELFERROR;
- int consumed = parse_args(j, argc, argv, &exit_immediately, &elftype);
- argc -= consumed;
- argv += consumed;
-
- if (elftype == ELFERROR) {
+ if (*elftype == ELFERROR) {
/*
* -T was not specified.
* Get the path to the program adjusted for changing root.
*/
- char *program_path = minijail_get_original_path(j, argv[0]);
+ char *program_path =
+ minijail_get_original_path(j, argv[optind]);
/* Check that we can access the target program. */
if (access(program_path, X_OK)) {
fprintf(stderr,
"Target program '%s' is not accessible.\n",
- argv[0]);
- return 1;
+ argv[optind]);
+ exit(1);
}
/* Check if target is statically or dynamically linked. */
- elftype = get_elf_linkage(program_path);
+ *elftype = get_elf_linkage(program_path);
free(program_path);
}
+ /*
+ * Setting capabilities need either a dynamically-linked binary, or the
+ * use of ambient capabilities for them to be able to survive an
+ * execve(2).
+ */
+ if (caps && *elftype == ELFSTATIC && !ambient_caps) {
+ fprintf(stderr, "Can't run statically-linked binaries with "
+ "capabilities (-c) without also setting "
+ "ambient capabilities. Try passing "
+ "--ambient.\n");
+ exit(1);
+ }
+
+ return optind;
+}
+
+int main(int argc, char *argv[])
+{
+ struct minijail *j = minijail_new();
+ const char *dl_mesg = NULL;
+ int exit_immediately = 0;
+ ElfType elftype = ELFERROR;
+ int consumed = parse_args(j, argc, argv, &exit_immediately, &elftype);
+ argc -= consumed;
+ argv += consumed;
+
if (elftype == ELFSTATIC) {
/*
* Target binary is statically linked so we cannot use