Inyección de código de Android Runtime

13

Estoy haciendo una investigación para una herramienta de análisis estático para ayudar a detectar malware en aplicaciones de Android. Me pregunto si es posible realizar una inyección de código en Android sin utilizar un cargador de clases. Sé que es posible cargar el código byte en tiempo de ejecución utilizando el cargador de clases Dex, pero me gustaría saber si es posible hacerlo sin usar un cargador de clases. He encontrado proyectos como enlace , que usan cosas como AspectJ para agregar el registro y el rastreo en tiempo de ejecución. Corríjame si me equivoco, pero creo que esto probablemente usa un cargador de clases en algún lugar de la biblioteca de AspectJ.

Estoy pensando en algo más en cuanto a sobrescribir / implementar un método en tiempo de ejecución con un código de byte arbitrario de una clase que ya está cargada, de modo que la próxima vez que se llame se realice una acción maliciosa / no declarada del original implementación de la fuente. es posible? Si es así, ¿cómo se haría para hacerlo?

Actualización: Intento aclarar un poco más mi pregunta.

No estoy interesado en llamar directamente al código nativo o usar Runtime.exec. Ya he examinado esas API de Java en mi herramienta. Permítame darle una idea de código en bruto de algo que estaba pensando.

public static void main(String[] args){
    hello(); // BENIGN
    evil("hello", getFile("com.blah.MyClass"));
    hello(); // MALWARE, or alternatively since it might not be loaded also BENIGN until next time application is run.
}

public static void hello(){System.out.println("Hi!");}

public static void evil(String methodName, File classFile){
    byte[] evilMethodImplementation = {0x...}; // some crafted byte code to replace the body of a method in a class file
    RandomAccessFile raf = new RandomAccessFile(classFile, "rw");
    raf.seek(findMethodBody(methodName, classFile)); // seek to the body contents of the method
    raf.write(evilMethodImplementation); // overwrite the current implementation with malicious implementation
    raf.close();
}

Esto es solo una idea de algo que estaba considerando para ver si era posible. Básicamente, quiero saber si es posible hacer una reflexión sin utilizar las interfaces de reflexión como una especie de truco desordenado que evitaría mi detección.

    
pregunta Ben Holland 08.02.2013 - 23:11
fuente

1 respuesta

12

Sí, absolutamente, hay otras formas de hacer inyección de código. Por ejemplo, una aplicación malintencionada puede ejecutar código nativo directamente, y eso no requiere ningún cargador de clases.

Más generalmente, en el modelo de seguridad de Android, el único límite de seguridad está en el nivel de proceso ( no en el nivel de JVM). Por lo tanto, nada en Android impide la inyección de código en un proceso que ya controla. Como indica la documentación de Android, el código no confiable no se puede aislar de manera segura dentro de la máquina virtual Dalvik . Eso es solo una consecuencia fundamental de la arquitectura de seguridad de Android.

(Como ejemplos adicionales, también puede invocar Runtime.getRuntime().exec() para ejecutar código nativo, deshabilitar Java Security Manager, llamar a setAccessible(., true) y luego asuma el proceso , explote las vulnerabilidades en cualquiera de las bibliotecas de Java, o utilice cualquiera de una serie de otros métodos.)

(Además, en Java, el compilador realiza algunas comprobaciones de seguridad y no las duplica la JVM. En consecuencia, el bytecode malicioso puede omitir estas comprobaciones. Estas verificaciones incluyen, por ejemplo, control de acceso para clases internas, seguridad excepcional, final campos, y otros. No sé si lo mismo se aplica a Dalvik también, pero aquí hay muchos detalles peludos que podrían permitir que el código de bytes malicioso ataque las bibliotecas de clases.)

    
respondido por el D.W. 09.02.2013 - 05:44
fuente

Lea otras preguntas en las etiquetas