2013-09-10 3 views
2

Я пытаюсь использовать SecureRandom обходной путь, который Google разместил в моем андроида приложения: http://android-developers.blogspot.com/2013/08/some-securerandom-thoughts.htmlКак определить, включен ли SELinux в приложении Android?

Эта работа вокруг включают написание (и чтение с)/DEV/urandom. Однако похоже, что Samsung включил SELinux таким образом, что не позволяет приложениям обращаться к/dev/urandom.

У меня нет одного из этих устройств, поэтому мне сложно тестировать решения, кроме того, чтобы выталкивать попытки обходных решений на рынке Android, но похоже, что это не ошибка, может ловить ловушку с помощью блока catch try. Также кажется, что File.canRead и canWrite возвращают true. Вы можете увидеть мои попытки обхода в методе supportedOnThisDevice в следующем классе: PRNGFixes.java

Я ищу надежный способ обнаружить, если я являюсь таким устройством, и если да, то не применить метод обхода Google SecureRandom ,

ответ

2

Я слышал, что Samsung начинает отправлять устройства с установленной политикой 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." Поэтому вам, возможно, потребуется проверить свойства системы или проверить ее через оболочку, чтобы точно узнать.

Если вы можете получить кто-то посылать вам их build.prop вы можете поймать ее, сравнив их ro.build.selinux собственность через System.getProperty("ro.build.selinux"), но вы также хотите, чтобы убедиться, что вы в состоянии получить доступ это более прямо в случае, если это ненадежно или getProperty(), поскольку это нарушено в будущих обновлениях.

Root (Пользователь системы на SELinux) - это еще один вариант, когда он доступен, но в любом случае решение на основе оболочки, вероятно, будет вашим лучшим выбором.

1
System.getProperty("ro.build.selinux") 

Не работает для меня на Samsung 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 находится в ENFORCE режиме - можно сделать через любой 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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^