Skip to content

Instantly share code, notes, and snippets.

@sfan5
Last active August 29, 2015 14:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sfan5/f4ff90009f991887073c to your computer and use it in GitHub Desktop.
Save sfan5/f4ff90009f991887073c to your computer and use it in GitHub Desktop.
A simple Android run-as replacement when the preinstalled one won't work (I'm looking at you Android 4.2)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <unistd.h>
#include <stdarg.h>
#include <stdbool.h>
// Link this with a libselinux.so from your Android device
// or extract the precompiled binary like this:
// cat precompiled.txt | base64 -d | xz -d > run-as
struct pkginfo {
int uid;
bool debuggable;
char dataDir[99];
char seinfo[99];
};
static inline void read_line(FILE *f, char *buf, int maxlen)
{
int c, i = 0;
do {
c = getc(f);
buf[i] = c;
i++;
} while(c != '\n' && c != '\r' && !feof(f) && i < maxlen);
i--;
buf[i] = '\0';
}
struct pkginfo get_pkginfo(const char *pkgname)
{
struct pkginfo info;
FILE *f;
char buf[256], name[99];
unsigned int d;
info.uid = 0;
info.debuggable = false;
info.dataDir[0] = '\0';
info.seinfo[0] = '\0';
f = fopen("/data/system/packages.list", "rb");
if(!f) {
fprintf(stderr, "Failed to open packages.list: %s\n", strerror(errno));
exit(1);
}
while(1) {
if(feof(f))
goto out;
read_line(f, buf, 256);
sscanf(buf, "%s %u %u %s %s", name, &info.uid, &d, info.dataDir, info.seinfo);
info.debuggable = (d == 1);
if(name == pkgname)
goto out;
}
out:
fclose(f);
return info;
}
extern int selinux_android_setcontext(uid_t uid, int isSystemServer, const char *seinfo, const char *name);
int main(int argc, char *argv[])
{
struct pkginfo info;
if(argc < 2) {
fprintf(stderr, "Usage: run-as <package-name> <command> [<args>]\n\n");
return 1;
}
info = get_pkginfo(argv[1]);
if (info.uid == 0) {
fprintf(stderr, "Package '%s' was not found\n", argv[1]);
return 1;
}
// Change our uid & gid
if(setresgid(info.uid,info.uid,info.uid) || setresuid(info.uid,info.uid,info.uid)) {
fprintf(stderr, "Failed to set uid/gid\n");
return 1;
}
if (selinux_android_setcontext(info.uid, 0, info.seinfo, argv[1]) < 0) {
fprintf(stderr, "Failed to set SELinux security context: %s\n", strerror(errno));
return 1;
}
// cd into the data directory
{
int ret;
do {
ret = chdir(info.dataDir);
} while (ret < 0 && errno == EINTR);
if (ret < 0) {
fprintf(stderr, "Could not cd to package's data directory: %s\n", strerror(errno));
return 1;
}
}
if (argc >= 3) {
if (execvp(argv[2], argv+2) < 0) {
fprintf(stderr, "exec failed for %s Error:%s\n", argv[2], strerror(errno));
return -errno;
}
}
// Execute shell if user didn't specify a command
execlp("/system/bin/sh", "sh", NULL);
fprintf(stderr, "exec failed\n");
return -errno;
}
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment