El panorama de la seguridad móvil deja entrever un constante avance en la complejidad de los códigos maliciosos móviles, entre los que se destacan aquellas familias dirigidas a comprometer especialmente dispositivos Android. Ya discutíamos algún tiempo atrás sobre la gran incidencia de los troyanos en el mundo del malware para esta plataforma, presentando posibles escenarios de evolución.

Veamos ahora, además de la ofuscación, qué técnicas son las más utilizadas por los cibercriminales para proteger sus creaciones en su afán de complicar el análisis a los profesionales de seguridad, con el objeto de prepararnos para su rápida identificación.

Antiemulación

Como es de esperar, los emuladores de Android presentan algunos atributos particulares que los distinguen de dispositivos reales. En particular, algunos atributos pertenecientes a la clase Build del sistema operativo denotarán la cadena «sdk», lo que permitirá a los cibercriminales conocer que están actuando en un entorno emulado y por tanto evadir la ejecución de las verdaderas actividades maliciosas.

[java]
public boolean checkEmulation()
return (Build.PRODUCT.contains(“sdk”) || Build.MODEL.contains(“sdk”));
}
[/java]

Las propiedades del sistema operativo también pueden analizarse con el objeto de identificar emulación. A través de las propiedades en la clase android.os.SystemProperties que puede ser accedida por reflexión, si un cibercriminal descubre que la propiedad ro.hardware guarda la cadena «goldfish», que ro.product.device es «generic», o que ro.kernel.qemu tiene el valor 1, entonces sabrá que se encuentra en un entorno emulado.

[java]
public boolean checkEmulation() {
Context context = getApplicationContext();
if ("goldfish".equals(getProperty(context,"ro.hardware")) //donde getProperty es el método encargado de la reflexión
|| "generic".equals(getProperty (context,"ro.product.device"))
|| "1".equals(getProperty (context,"ro.kernel.qemu"))
) {
return true;
}
return false;
}
[/java]

Como podemos imaginar, las funciones que hacen a la comunicación con la operadora telefónica también sufren mutaciones al trabajar sobre el emulador. Los métodos getSimOperatorName() y getNetworkOperatorName() de la clase TelephonyManager devolverán la cadena «Android» en caso de que la aplicación se ejecute en un emulador.

[java]
public boolean checkEmulation() {
TelephonyManager mng = (TelephonyManager) getApplicationContext().getSystemService("phone");
if (mng.getSimOperatorName().equals("Android") || mng.getNetworkOperatorName().equals("Android")) {
return true;
}
return false;
}
[/java]

Por supuesto, existen otras muchas maneras de detectar emulación. Por ejemplo, si el archivo /proc/cpuinfo contiene el texto «Goldfish», si existen archivos como /init.goldfish.rc o /sys/qemu_trace, o si se detecta el demonio qemu (qemud) corriendo entre los procesos del sistema, la ejecución de la aplicación podría alterarse para evadir la detección.

Antidebugging

Del mismo modo que con ejecutables compilados para otras plataformas, la manera más sencilla para evaluar si la aplicación está siendo depurada consiste en utilizar la clase android.os.Debug del sistema e invocar al método isDebuggerConnected().

[java]
public boolean checkDebugging(){
if (Debug.isDebuggerConnected()) {
return true;
}
return false;
}
[/java]

Otros dos métodos proporcionados en dicha clase que pueden ayudar a la detección de depuración son waitForDebugger() y waitingForDebugger(), ya que de este modo se puede manejar un hilo para alertar inmediatamente luego de que el depurador fue conectado.

Claro que existen paquetes ofuscados que brindan estas y otras funcionalidades de manera combinada a los creadores de malware, de forma que solo deban preocuparse por el uso de estas características. Paquetes como los descritos pueden observarse en muestras como Android/Secmider.B.

También es posible detectar depuradores a través del método Debug.threadCpuTimeNanos( ). El procedimiento consiste en invocar tal método y almacenar el resultado; luego, realizar algún tipo de operación intensiva para el CPU; invocar el método nuevamente y calcular la diferencia: si el intervalo es mayor de lo esperado en una ejecución en modo nativo, esto sugiere la presencia de algún depurador. No obstante, este método puede provocar errores ante un sistema bajo alta carga de procesamiento.

AntiAV

Entre las técnicas de protección de códigos maliciosos implementadas por los cibercriminales, es común observar su esfuerzo por saltear la protección brindada por soluciones de seguridad instaladas en los dispositivos.

La manera más sencilla de notar la presencia de estas herramientas en el sistema resulta la detección del paquete correspondiente según su denominación. Así, tenemos muestras como Android/Jagonca.C y Android/Jagonca.D, que tras ganar permisos de administrador en el sistema recorren una lista de los procesos activos e intentan destruir aquellos que se corresponden con paquetes de casas de seguridad conocidas.

img_av

En última instancia, si acaso estas técnicas no brindan resultados, siempre restará la posibilidad de dejar algún que otro mensaje desde el lado oscuro.

img_1

AntiLVL

Para verificar el licenciamiento de aplicaciones desarrolladas, Android provee un mecanismo conocido como License Verification Library (LVL). Esto permite a los creadores de un aplicativo verificar la licencia para determinar el acceso a su uso. Tal protección puede ser vulnerada por cibercriminales para alterar aplicaciones genuinas agregando contenido ilícito para luego redistribuirlas a través de mercados no oficiales.

Es el caso de la firma antes mencionada, Android/Secmider.B. En esta encontramos un paquete añadido, ofuscado, destinado a sobrescribir la licencia de una determinada aplicación a través del uso de reflexión para realizar hooks a los métodos encargados de obtener datos como el identificador del dispositivo o la firma.

img_2

Para evitar este tipo de ataque es recomendable generar políticas personalizadas y trabajar en la creación de robustos esquemas de protección.

¿Cómo nos afectan estas técnicas?

Es una realidad que las muestras de códigos maliciosos poseen cada vez mayores mecanismos para la evasión en Android del análisis. Es importante entender que, en un futuro no muy lejano, la comprensión de estas y otras técnicas será clave para la detección de malware y el estudio de su comportamiento.

analisis_de_malware