3

我正在尝试使用 Google 在我的 android 应用程序中发布的 SecureRandom 解决方法: http ://android-developers.blogspot.com/2013/08/some-securerandom-thoughts.html

这项工作涉及写入(和读取)/dev/urandom。但是,三星似乎以阻止应用程序访问 /dev/urandom 的方式启用了 SELinux。

我没有这些设备之一,所以我很难测试解决方案,除了在 Android 市场上推出解决方法的尝试,但似乎这不是我可以捕获的错误尝试捕获块。File.canRead 和 canWrite 似乎也返回 true。您可以在以下类中的 supportedOnThisDevice 方法中看到我对解决方法的尝试: PRNGFixes.java

我正在寻找一种可靠的方法来检测我是否是这样的设备,如果是,请不要应用 Google SecureRandom 解决方法。

4

5 回答 5

3

这是我检查 SELinux 是否处于强制模式的方法 - 可以通过任何 Shell 脚本完成,而不依赖于 RootTools:

private static boolean isSELinuxEnforcing() {
    try {
        CommandCapture command = new CommandCapture(1, "getenforce");
        RootTools.getShell(false).add(command).waitForFinish();
        boolean isSELinuxEnforcing = command.toString().trim().equalsIgnoreCase("enforcing");
        return isSELinuxEnforcing;
    } catch (Exception e) {
        // handle exception
    }
    return false;
}
于 2014-11-24T12:58:56.853 回答
2

我听说三星开始出货将 SELinux 策略设置为 Enforce 的设备,但我不知道这是否属实。据我所知,4.3 上的大多数设备仍将其设置为允许的。

根据 Google 的说法,“SELinux 增强对用户和开发人员来说是不可见的,它增加了现有 Android 安全模型的稳健性,同时保持与现有应用程序的兼容性。” 因此,您可能需要检查系统属性或通过 shell 对其进行测试才能确定。

如果您可以让某人向您发送他们的 build.prop,您可以通过比较他们的 ro.build.selinux 属性来捕获它System.getProperty("ro.build.selinux"),但您还需要验证您是否能够更直接地访问它以防万一不可靠或 getProperty() 在未来的更新中被破坏。

Root(SELinux 上的系统用户)是另一个可用的选项,但无论哪种方式,基于 shell 的解决方案可能是您最好的选择。

于 2013-09-10T21:07:33.350 回答
1
System.getProperty("ro.build.selinux")

在三星 S4 Android 4.3 上对我不起作用。所以我写了这个

private static final int JELLY_BEAN_MR2 = 18;

public static boolean isSELinuxSupported() {
        // Didnt' work
        //String selinuxStatus = System.getProperty(PROPERTY_SELINUX_STATUS);
        //return selinuxStatus.equals("1") ? true : false;

        String selinuxFlag = getSelinuxFlag();

        if (!StringUtils.isEmpty(selinuxFlag)) {
            return selinuxFlag.equals("1") ? true : false;
        } else {
            // 4.3 or later ?
            if(Build.VERSION.SDK_INT >= JELLY_BEAN_MR2) {
                return true;
            }
            else {
                return false;
            }
        }       
}

public static String getSelinuxFlag() {
        String selinux = null;

        try {
            Class<?> c = Class.forName("android.os.SystemProperties");
            Method get = c.getMethod("get", String.class);
            selinux = (String) get.invoke(c, "ro.build.selinux");
        } catch (Exception ignored) {
        }

        return selinux;
}
于 2013-11-07T09:39:29.930 回答
1

如果您有权访问框架

import android.os.SELinux;

SELinux.isSELinuxEnforced();
于 2019-08-14T16:40:53.607 回答
0

Jellybean MR2 及更高版本的大多数设备都将在其设备上启用 SELinux,但如果您与 OEM 合作或进行平台工作,这可能不一定正确。

我用来验证的方法是使用 getenforce shell 命令:

public boolean isSeLinuxEnforcing() {
    StringBuffer output = new StringBuffer();
    Process p;
    try {
        p = Runtime.getRuntime().exec("getenforce");
        p.waitFor();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = "";
        while ((line = reader.readLine())!= null) {
            output.append(line);
        }
    } catch (Exception e) {
        Log.e(TAG, "OS does not support getenforce");
        // If getenforce is not available to the device, assume the device is not enforcing
        e.printStackTrace();
        return false;
    }
    String response = output.toString();
    if ("Enforcing".equals(response)) {
        return true;
    } else if ("Permissive".equals(response)) {
        return false;
    } else {
        Log.e(TAG, "getenforce returned unexpected value, unable to determine selinux!");
        // If getenforce is modified on this device, assume the device is not enforcing
        return false;
    }
}

似乎大多数设备仅在未以强制状态运行时才为 selinux 编写系统属性。您还可以检查属性:ro.boot.selinux以查看内核是否在当前构建中传递了许可参数。

于 2018-05-02T19:47:43.767 回答