我想检测给定程序是否可以执行恶意操作,例如分叉,进程间管道,输入/输出重定向,文件处理等。
实际上我正在开发一个程序来检查java代码,并且不希望编码器以任何方式损害我的代码检查系统。
我应该在代码中查找哪些包以确保这一点?
在此先感谢...!
答案 0 :(得分:1)
您的检查是在编译时还是在运行时?
如果在运行时检查,则可以使用具有权限的安全管理器。看看Security Manager Tutorial。有很多权限。您可以禁止文件访问,甚至打开框架。
对于基类,您必须小心java.lang.Runtime
和java.lang.System
,java.lang.ProcessBuilder
。这些创建java.lang.Process
。此外,java.io.File
,java.io.FileDescriptor
甚至套接字和java.nio.*
也可以在操作系统/文件系统上运行。
我也不允许反思java.lang.reflect.*
,java.lang.Class
的某些方法也是反思的。按名称加载类可能会解决您的检查问题。 java.beans.*
中的某些类也使用反射。
根据您的需要,您甚至可能希望用户代码在sandbox中运行。但这对你来说可能太过分了。检查类使用情况(常量池)可能是一种简单的方法。
正如Colin HEBERT之前指出的那样,native
也很危险。但其中一些肯定是需要的,比如Object
的方法。
答案 1 :(得分:0)
java.lang.Runtime
和java.lang.System
中提供了大部分操作系统互动功能。请注意,这些不需要导入,因为它们位于java.lang
包中。
但是......如果您只是在分析代码,为什么还要关心它包含的调用?也许您应该查看Java Security而不是调用哪些类。
答案 2 :(得分:0)
您应该考虑检查标记为“原生”的所有方法。
答案 3 :(得分:0)
简答:java.lang。我相信这是唯一的“开箱即用”软件包,其中包含可以访问操作系统功能的类。好吧,我在这里假设您不包含I / O作为“与操作系统相关”的东西。如果你这样做,那么你还必须包括java.io,javax.swing和其他几个包。
更长的答案:程序员可以编写自己的JNI函数,与操作系统交互并将它们放入他喜欢的任何软件包中。试图找出这个可能非常棘手。好吧,我想你可以说任何“原生”功能都会自动被怀疑。