Android 运行时代码注入

信息安全 应用安全 爪哇 安卓 注射
2021-08-31 12:43:59

我正在研究一种静态分析工具,以帮助检测 Android 应用程序中的恶意软件。我想知道是否可以在不使用类加载器的情况下在 Android 上执行代码注入。我知道可以使用 Dex 类加载器在运行时加载字节码,但我想知道是否可以在不使用类加载器的情况下执行此操作。我发现了像https://github.com/miktam/Disabler这样的项目,它们使用 AspectJ 之类的东西在运行时添加日志记录和跟踪。如果我错了,请纠正我,但我认为这可能在 AspectJ 库的某个深处使用了类加载器。

我正在考虑更多关于在运行时使用已经加载的类的任意字节码覆盖/实现方法,以便下次调用它时,它会从原始源实现中执行一些恶意/未声明的操作。这可能吗?如果是这样,人们将如何去做呢?


更新:试图进一步澄清我的问题。

我对直接调用本机代码或使用 Runtime.exec 不感兴趣。我已经在我的工具中检查了那些 Java API。让我对我在想的事情给出一个粗略的代码想法。

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();
}

这只是我正在考虑看看是否可能的想法。基本上我想知道它是否可能在不使用反射接口的情况下进行反射,因为它会绕过我的检测。

1个回答

是的,当然,还有其他方法可以进行代码注入。例如,恶意应用程序可以直接执行本机代码,并且不需要任何类加载器。

更一般地说,在 Android 安全模型中,唯一的安全边界是进程级别(而不是JVM 级别)。因此,Android 中没有任何东西可以阻止代码注入到您已经控制的进程中。正如 Android 文档所述,无法在 Dalvik VM 中安全地隔离不受信任的代码这只是 Android 安全架构的一个基本结果。

(作为其他示例,您还可以调用Runtime.getRuntime().exec()以执行本机代码、禁用 Java 安全管理器、调用setAccessible(., true)然后接管进程、利用任何 Java 库中的漏洞,或使用许多其他方法中的任何一种。 )

(此外,在 Java 中,一些安全检查由编译器完成,JVM 不会重复。因此,恶意字节码可以绕过这些检查。这些检查包括,例如,内部类的访问控制、异常安全、最终字段和其他人。我不知道 Dalvik 是否也是如此,但这里有许多毛茸茸的细节可能允许恶意字节码攻击类库。)