2013-09-10 108 views
2

我试图使用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的解决方法。

回答

2

我听说三星正在将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的解决方案可能是您最好的选择。

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; 
} 
+0

什么返回值这种方法? – dkneller

+0

isSELinuxSupported返回true(如果存在SELinux)或为false – user1546570

+0

SELinux在我的一些设备上强制执行,但'ro.build.selinux'没有值,因此这是不可靠的。 –

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; 
} 
相关问题