summaryrefslogtreecommitdiffstats
path: root/sdcard
diff options
context:
space:
mode:
authorJorge Lucangeli Obes <jorgelo@google.com>2016-07-18 16:06:38 +0000
committerandroid-build-merger <android-build-merger@google.com>2016-07-18 16:06:38 +0000
commitfe4f764e7542715d0ca42d3af4c465a4ed1d3e66 (patch)
tree12d664fff4653d94bbb7a186eab96a38ee857855 /sdcard
parentc067116ad5fa2ae8d9659bf10ba089475bc0decc (diff)
parent97f49e5cb3a04dc15c9fa04074102f9d29b21936 (diff)
downloadsystem_core-fe4f764e7542715d0ca42d3af4c465a4ed1d3e66.tar.gz
system_core-fe4f764e7542715d0ca42d3af4c465a4ed1d3e66.tar.bz2
system_core-fe4f764e7542715d0ca42d3af4c465a4ed1d3e66.zip
Merge \"Use Minijail for privilege dropping.\"
am: 97f49e5cb3 Change-Id: I032ea3fcdac1a16bf36d43731b8533214264fee2
Diffstat (limited to 'sdcard')
-rw-r--r--sdcard/Android.mk2
-rw-r--r--sdcard/sdcard.cpp24
2 files changed, 15 insertions, 11 deletions
diff --git a/sdcard/Android.mk b/sdcard/Android.mk
index f87e2d5ea..992b51c6f 100644
--- a/sdcard/Android.mk
+++ b/sdcard/Android.mk
@@ -5,7 +5,7 @@ include $(CLEAR_VARS)
LOCAL_SRC_FILES := sdcard.cpp fuse.cpp
LOCAL_MODULE := sdcard
LOCAL_CFLAGS := -Wall -Wno-unused-parameter -Werror
-LOCAL_SHARED_LIBRARIES := libbase liblog libcutils libpackagelistparser
+LOCAL_SHARED_LIBRARIES := libbase liblog libcutils libminijail libpackagelistparser
LOCAL_SANITIZE := integer
LOCAL_CLANG := true
diff --git a/sdcard/sdcard.cpp b/sdcard/sdcard.cpp
index dd0c433e2..e82f29ed4 100644
--- a/sdcard/sdcard.cpp
+++ b/sdcard/sdcard.cpp
@@ -36,6 +36,9 @@
#include <cutils/multiuser.h>
#include <packagelistparser/packagelistparser.h>
+#include <libminijail.h>
+#include <scoped_minijail.h>
+
#include <private/android_filesystem_config.h>
// README
@@ -204,6 +207,15 @@ static int fuse_setup(struct fuse* fuse, gid_t gid, mode_t mask) {
return 0;
}
+static void drop_privs(uid_t uid, gid_t gid) {
+ ScopedMinijail j(minijail_new());
+ minijail_set_supplementary_gids(j.get(), sizeof(kGroups) / sizeof(kGroups[0]), kGroups);
+ minijail_change_gid(j.get(), gid);
+ minijail_change_uid(j.get(), uid);
+ /* minijail_enter() will abort if priv-dropping fails. */
+ minijail_enter(j.get());
+}
+
static void* start_handler(void* data) {
struct fuse_handler* handler = static_cast<fuse_handler*>(data);
handle_fuse_requests(handler);
@@ -299,16 +311,8 @@ static void run(const char* source_path, const char* label, uid_t uid,
}
}
- /* Drop privs. */
- if (setgroups(sizeof(kGroups) / sizeof(kGroups[0]), kGroups) < 0) {
- PLOG(FATAL) << "cannot setgroups";
- }
- if (setgid(gid) < 0) {
- PLOG(FATAL) << "cannot setgid";
- }
- if (setuid(uid) < 0) {
- PLOG(FATAL) << "cannot setuid";
- }
+ // Will abort if priv-dropping fails.
+ drop_privs(uid, gid);
if (multi_user) {
fs_prepare_dir(global.obb_path, 0775, uid, gid);