如何检测SELinux是否在Android应用程序中启用?
我试图使用SecureRandom的解决办法,谷歌发表在我的Android应用程序: http://android-developers.blogspot.com/2013/08/some-securerandom-thoughts.html如何检测SELinux是否在Android应用程序中启用?
此解决涉及写入(和读取)的/ dev/urandom的。但是,它看起来像三星启用SELinux的方式,防止应用程序访问/ dev/urandom。
我没有这些设备之一,所以对我来说测试解决方案有点困难,除了推出Android市场上的解决方法之外的尝试,但似乎这不是一个错误,我可以用try catch块捕获。它也似乎File.canRead和canWrite返回true。您可以在工作区看到我尝试在supportedOnThisDevice方法在下面的类: PRNGFixes.java
我正在寻找一个可靠的方式,如果我是这样的设备来检测,如果是这样,不适用的谷歌SecureRandom的解决方法。
我听说三星正在将SELinux策略设置为Enforce的设备出货,但我不知道它是否正确。据我所知,4.3上的大多数设备仍然设置为宽容。
根据Google的说法,"SELinux reinforcement is invisible to users and developers, and adds robustness to the existing Android security model while maintaining compatibility with existing applications."因此,您可能需要检查系统属性或通过shell测试以确定。
如果你能有人给你他们的build.prop您可以通过通过System.getProperty("ro.build.selinux")
, 他们ro.build.selinux属性比较赶,但你还需要验证你能访问它更直接,以防万一它不可靠或getProperty()在未来的更新中被破坏。
根(SELinux上的系统用户)是可用时的另一种选择,但无论哪种方式,基于shell的解决方案可能是您最好的选择。
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;
}
这是我的检查方法是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;
}
什么返回值这种方法? – dkneller
isSELinuxSupported返回true(如果存在SELinux)或为false – user1546570
SELinux在我的一些设备上强制执行,但'ro.build.selinux'没有值,因此这是不可靠的。 –