Las vulnerabilidades en el almacenamiento en caché de la clave ofuscado? licencias de Android

StackOverflow https://stackoverflow.com/questions/4414449

  •  08-10-2019
  •  | 
  •  

Pregunta

Estoy almacenamiento en caché de autenticación de un usuario para siempre el Android Market servidor de licencias de ping pong devuelve un GRANT_ACCESS.

¿Alguien ve ninguna vulnerabilidad con esta estrategia? Creo que es muy fuerte, ya que estoy ofuscar una clave, y la única manera de anular la obstrucción es conocer la sal. Ahora, alguien podría concebiblemente abrir el apk y buscar la sal, pero esto no es realmente el nivel de agrietamiento Creo que es demasiado importante como para preocuparse.

Como se puede ver, se está añadiendo información específica dispositivo para la técnica de ofuscación.

// Try to use more data here. ANDROID_ID is a single point of attack. 
String deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID); 
obfuscator = new AESObfuscator(SALT, getPackageName(), deviceId); 
mChecker = new LicenseChecker(this, new ServerManagedPolicy(this, obfuscator), BASE64_PUBLIC_KEY ); 

A continuación, la creación de la persistió datos:

 public void allow() {
   SharedPreferences settings = getSharedPreferences(PREFERENCES_EULA, 0);
   SharedPreferences.Editor editor = settings.edit();
   String uid = UUID.randomUUID().toString();
   if(!settings.contains(ACCESS_KEY)) {
     editor.putString(ACCESS_KEY,uid);       
     editor.commit();
   } 
   if(!settings.contains(OBFU_ACCESS_KEY)) {
     String obfu = obfuscator.obfuscate(uid);
     editor.putString(OBFU_ACCESS_KEY,obfu); 
     editor.commit();
   }

Entonces, utiliza otro método para comprobar el estado del contenido almacenado en caché:

boolean isCachedLicense() {
  SharedPreferences settings = getSharedPreferences(PREFERENCES_EULA, 0);
  if(settings.contains(ACCESS_KEY) && settings.contains(OBFU_ACCESS_KEY)) {
    String accessKey = settings.getString(ACCESS_KEY, "");
    String obAccessKey = settings.getString(OBFU_ACCESS_KEY, "");
    try {
      if(accessKey.equals(obfuscator.unobfuscate(obAccessKey))) {
              return true;
      } else {
              return false;
      }
    } catch (ValidationException e) {
       e.printStackTrace();
       return false;
    }
  } else {
       return false;
  }
} 

Por último, he comprobado si isCachedLicense en los siguientes lugares del LicenseCheckerCallback: @Override dontAllow y @override applicationError. Si isCachedLicense es cierto, entonces dejo que el usuario hacia adelante.

Además, el código fuente completo se encuentra en aquí .

¿Fue útil?

Solución

La ofuscación con sal es en general una estrategia débil. El atacante sólo tiene que averiguar la sal, que es bastante sencillo una vez que usted sabe lo que está buscando, y se puede hacer sin acceso directo a la aplicación. Una vez que se descubre la sal (por cualquier persona), todos de nuestra base de instalación se ha visto comprometida.

Su mejor apuesta es, en lugar de utilizar un algoritmo de ofuscación con una llave fija, para usar una biblioteca de cifrado probada + algoritmo con una clave que es única para el usuario o el dispositivo que se está ejecutando en.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top