我很好奇可以使用哪些自动方法来确定在 Windows 或 PC 上运行的 Java 应用程序是否是恶意软件。(我什至不知道这样的应用程序可以利用哪些漏洞。有什么地方可以让我了解这些风险吗?)如果我有源代码,是否有特定的包或类可以比其他应用程序更有害地使用?也许他们可以建议恶意软件?
更新:感谢您的回复。我很想知道这是否可能,这听起来基本上是完全不可行的。很高兴知道。
如果甚至无法自动确定程序是否终止,我认为您不会在自动确定应用程序是否执行“顽皮的事情”方面获得太多优势。
问题的一部分当然是定义什么构成恶意软件,但大多数只是推断其他程序行为的证据非常困难/不可能。您可能有一些运气发现了特定的模式,但总的来说,您不能确信(我怀疑这可能是不可能的)您已经捕获了所有可能的攻击媒介。
在一般情况下,当攻击者只专注于剩余的 5% 时,捕获 95% 的向量并不值得。
好吧,总是有一个基本的哲学问题:什么是恶意软件?它是旨在造成损害的代码,或者至少是没有做它声称的代码的代码。你打算如何根据它使用的库来判断意图?
话虽如此,如果你至少大致知道程序应该做什么,你确实可以找到可疑的包,程序通常不需要访问的东西。当程序打算作为桌面应用程序运行时,就像网络连接一样。但是,网络连接可能只是自动更新功能的一部分。(自动更新本身是恶意软件吗?有时感觉就像是。)
另一个指标是,如果一个表面上不需要任何特权的程序拒绝在沙箱中运行。最大的威胁是如果它在不需要时尝试加载本机库。
但所有这些只有在你知道代码应该做什么的情况下才有意义。防病毒软件包可能使用与病毒非常相似的技术,唯一的区别是标签上的内容。
以下是关于如何绑定 Java 应用程序可以采取的可能操作的概述。基本上,您正在测试 java 应用程序是否“惰性”(不能采取有害行动),因此它可能不是恶意软件。
正如其他人所指出的那样,这不一定会告诉您恶意软件与否。该应用程序仍然可以做一些烦人的事情,比如弹出窗口。也许最好的指示是查看应用程序是否由您信任的作者进行了数字签名;如果不是 - 害怕。
您可以反汇编类文件以确定应用程序使用哪些 Java API;您正在寻找 java 应用程序使用操作系统的点。由于 java 使用虚拟机,因此存在明确定义的点,java 应用程序可能会采取潜在的有害行为——这些是各种操作系统调用的“网关”(例如打开套接字或读取文件)。
很难枚举所有 API,执行相同操作系统操作的不同功能应该需要相同的Permission。但是 java 的文档并没有提供详尽的列表。
java应用程序是否使用任何本机库——如果是这样,它是一个很大的危险信号。
JVM 不提供运行任意代码或使用本机系统 API 的能力;特别是它不提供修改注册表的能力(PC 恶意软件的典型操作)。Java 应用程序可以做到这一点的唯一方法是通过本机库。通常,用 java 编写的普通应用程序不需要使用本机代码(除非它需要使用设备)。
检查 System.loadLibrary() 或 System.load() 或 Runtime.loadLibrary() 或 Runtime.load()。这就是 VM 加载本机库的方式。
它使用网络还是文件系统?
寻找使用 java.io、java.net。
它是否进行系统调用(通过 Runtime.exec())
您可以检查 java.lang.Runtime.exec() 或 ProcessBuilder.exec() 的使用。
它是否尝试控制键盘/鼠标?
您还可以在受限制的策略 JVM 中运行应用程序(执行此操作的指令/工具并不像应有的那么简单)并查看失败的原因(请参阅Oracle 的安全教程)——请注意,反汇编是确定的唯一方法,仅仅因为该应用程序没有做任何有害的事情,并不意味着它不会在将来。
这绝对不容易,我惊讶地发现有多少地方需要查看(例如,几个 java 函数加载本地库,而不仅仅是一个)。