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