在RunTime.exec上获取错误“uid 1000不允许su”(“su”)

时间:2013-05-17 14:20:22

标签: android

当我尝试从我的具有系统权限的程序运行su命令时,我在stderr上返回了此错误:

  

uid 1000不允许su

我正在为android.uid.system或android.uid.shell设置共享的uid,但它不会改变一件事。设备被假定为root。我真的不明白会发生什么。

以下是代码:

private boolean runAsRoot(String cmd, File workdir) throws IOException {
    Log.i(LOG_TAG, "Execute command as root: " + cmd);
    Process p = Runtime.getRuntime().exec(new String[] {"su", "-c", cmd});
    if (p == null) {
        Log.e(LOG_TAG, "cannot create process for " + cmd);
        return false;
    }

    int exit = -1;
    try {
        exit = p.waitFor();

        InputStreamReader isr;
        if (exit == 0) {
            isr = new InputStreamReader(p.getInputStream());
        } else {
            isr = new InputStreamReader(p.getErrorStream());
        }

        BufferedReader br = new BufferedReader(isr);
        StringBuilder sb = new StringBuilder();

        String line;
        while ((line = br.readLine()) != null) {
            if (sb.length() > 0) {
                sb.append('\n');
            }
            sb.append(line);
        }

        String string = sb.toString();

        Log.l(LOG_TAG, exit == 0 ? Level.INFO : Level.SEVERE, string);

    } catch (InterruptedException e) {
        Log.e(LOG_TAG, e);
    }

    return exit == 0;
}

2 个答案:

答案 0 :(得分:3)

最简单的方法是建立自己的纳米" sudo"像这样:

<强> sudo.c

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(int argc, char *argv[], char *envp[]) {
    int i;
    int n = 1;
    for (i = 1; i < argc; i++) {
        n += strlen(argv[i]) + 1;
    }
    char buf[n + 2];
    char* p = buf;
    for (i = 1; i < argc; i++) {
        strcpy(p, argv[i]);
        p += strlen(argv[i]);
        *p++ = i == argc - 1 ? 0 : ' ';
    }
    *p++ = 0;
    char* a[] = {"/system/bin/sh", "-c", buf, NULL};
    execve("/system/bin/sh", a, envp);
    fprintf(stderr, "sudo: /system/bin/sh  error:%s\n", strerror(errno));
    return 1;
}

编译并安装如下:

<强> make-sudo.sh

export NDK_ROOT=~/<path to android-ndk>
export GCC=$NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc
export SYS_ROOT=$NDK_ROOT/platforms/android-17/arch-arm
$GCC --sysroot $SYS_ROOT ./sudo.c -o ./sudo
adb root
adb shell "mount -o rw,remount /system"
adb shell "rm /system/xbin/sudo"
adb push  sudo /system/xbin/
adb shell "chmod 06755 /system/xbin/sudo"
adb shell "ls -l /system/xbin/sudo"
adb remount
rm ./sudo

警告: 这是一种简单但危险的方法,因为没有sudoers文件或任何其他黑/白名单允许所有其他应用程序使用sudo。它对我来说很有用,因为我的应用程序是嵌入式Android上唯一的应用程序而且不需要额外的安全性。

答案 1 :(得分:2)

你有一个标准/官方的android'su'程序,它不能用于此目的,而不是像superuser.apk那样被修改为允许这样做的程序。

您不能(从普通的第三方应用)将共享UID设置为特权用户,例如系统,甚至是半特权用户,例如shell。

您的设备可能尚未修改为完全允许root访问。