Android Runtime Code Injection

13

Sto facendo ricerche per uno strumento di analisi statica per aiutare a rilevare il malware nelle applicazioni Android. Mi chiedo se è possibile eseguire l'iniezione di codice su Android senza utilizzare un caricatore di classe. So che è possibile caricare il codice byte in fase di esecuzione utilizzando il caricatore di classe Dex, ma mi piacerebbe sapere se è possibile farlo senza usare un programma di caricamento classi. Ho trovato progetti come link , che usano cose come AspectJ per aggiungere logging e tracing in fase di esecuzione. Correggetemi se ho torto, ma penso che questo probabilmente usi un caricatore di classe da qualche parte nella libreria AspectJ.

Sto pensando a qualcosa di più sulla linea di sovrascrivere / implementare un metodo in fase di esecuzione con un byte byte arbitrario di una classe che è già stata caricata, in modo che la prossima volta che viene chiamata esegua un'azione dannosa / non dichiarata dall'originale implementazione sorgente. È possibile? Se sì, come si farebbe a farlo?

Aggiornamento: cerco di chiarire la mia domanda un po 'di più.

Non mi interessa chiamare il codice nativo direttamente o utilizzare Runtime.exec. Ho già esaminato quelle API Java nel mio strumento. Lasciami dare un'idea approssimativa del codice di qualcosa che stavo 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();
}

Questa è solo un'idea di qualcosa che stavo considerando per vedere se fosse possibile. Fondamentalmente voglio sapere se è possibile fare Reflection senza utilizzare le interfacce di riflessione come una sorta di disordinato hacking che bypasserebbe il mio rilevamento.

    
posta Ben Holland 08.02.2013 - 23:11
fonte

1 risposta

12

Sì, assolutamente, ci sono altri modi per fare l'iniezione di codice. Ad esempio, un'app dannosa può eseguire direttamente il codice nativo e non richiede alcun caricatore di classi.

Più in generale, nel modello di sicurezza Android, l'unico limite di sicurezza è a livello di processo ( non a livello di JVM). Pertanto, nulla in Android impedisce l'iniezione di codice in un processo già controllato. Poiché lo stato dei documenti Android, il codice non affidabile non può essere isolato in modo sicuro all'interno della Dalvik VM . Questa è solo una conseguenza fondamentale dell'architettura di sicurezza di Android.

(Come esempi aggiuntivi, potresti anche essere in grado di invocare Runtime.getRuntime().exec() per eseguire codice nativo, disabilitare Java Security Manager, chiamare setAccessible(., true) e quindi prendere in carico il processo , sfruttare le vulnerabilità in una qualsiasi delle librerie Java o utilizzare uno qualsiasi dei numerosi altri metodi.)

(Inoltre, in Java, alcuni controlli di sicurezza vengono eseguiti dal compilatore e non vengono duplicati dalla JVM. Di conseguenza, bytecode malevolo può ignorare questi controlli.Questi controlli includono, ad esempio, il controllo di accesso per le classi interne, la sicurezza delle eccezioni, finale campi e altri Non so se lo stesso vale anche per Dalvik, ma ci sono molti dettagli pelosi che potrebbero consentire al bytecode malevolo di attaccare le librerie di classi.)

    
risposta data 09.02.2013 - 05:44
fonte

Leggi altre domande sui tag