确定Java应用程序是否是恶意软件

时间:2011-03-22 16:14:59

标签: java security malware

我很好奇可以使用哪些自动方法来确定在Windows或PC上运行的Java应用程序是否是恶意软件。 (我甚至不知道这样的应用程序有哪些漏洞可用。有什么地方我可以了解风险吗?)如果我有源代码,是否有特定的软件包或类可以比其他更有害的使用?也许他们可能会建议恶意软件?

更新:感谢您的回复。我有兴趣知道这是否可行,而且它基本上听起来完全不可行。很高兴知道。

3 个答案:

答案 0 :(得分:4)

如果甚至无法自动确定whether a program terminates,我认为你不会在自动确定应用程序是否具有“顽皮的东西”方面有很大的影响力。

问题的一部分当然是定义什么构成恶意软件,但大多数只是简单地推断出其他程序行为的证据是非常困难/不可能的。你可能有一些运气发现特定的模式,但总的来说你不能确信(我怀疑这是不可能的)你已经抓住了所有可能的攻击媒介。

在一般领域,当攻击者只关注其余的5%时,捕获95%的载体并不值得。

答案 1 :(得分:2)

嗯,总有一个基本的哲学问题:什么是恶意软件?它的代码旨在造成损害,或者至少代码不符合它的要求。你打算如何基于它使用的库判断意图?

话虽如此,如果你至少大致知道该程序应该做什么,你确实可以找到可疑包,这是程序通常不需要访问的东西。与程序打算作为桌面应用程序运行时的网络连接一样。但是,网络连接可能只是自动更新功能的一部分。 (autoupdate本身是恶意软件吗?有时感觉就像是。)

另一个指标是,如果一个程序表面上不需要任何特殊权限,则拒绝在沙箱中运行。最大的威胁是如果它在不需要的情况下尝试加载本机库。

但是如果你知道代码应该做什么,那么所有这些才有意义。防病毒软件包可能使用与病毒非常相似的技术,唯一的区别在于标签上的内容。

答案 2 :(得分:0)

以下是如何绑定Java应用程序可能采取的操作的概要。基本上你正在测试java应用程序是否“惰性”(不能采取有害行为),因此它可能不是商城软件。

正如其他人所指出的那样,这并不一定会告诉你商品。该应用程序仍然可以做像弹出窗口这样烦人的事情。也许最好的指示是查看应用程序是否由您信任的作者进行数字签名;如果不是 - 请害怕。

您可以反汇编类文件以确定应用程序使用哪些Java API;您正在寻找Java应用程序使用操作系统的点。由于java使用虚拟机,因此有一些定义明确的点,java应用程序可能会采取可能有害的操作 - 这些是各种OS调用的“网关”(例如打开套接字或读取文件)。

难以枚举所有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's security tutorial) - 请注意,反汇编是只有这样才能确定,只是因为应用程序没有做任何有害的事情,并不意味着它将来也不会。

这绝对不容易,我很惊讶地发现需要查看多少个地方(例如,几个java函数加载本机库,而不仅仅是一个)。