当前位置: 首页 > 面试题库 >

针对Java应用程序中恶意代码的沙盒

唐俊楚
2023-03-14
问题内容

在允许用户提交自己的代码以由服务器运行的模拟服务器环境中,将任何用户提交的代码在沙箱中运行显然是有利的,这与浏览器中的Applet不同。我希望能够利用JVM本身,而不是添加另一个VM层来隔离这些提交的组件。

使用现有的Java沙箱模型似乎可以实现这种限制,但是是否有一种动态的方法可以仅对正在运行的应用程序的用户提交的部分启用此限制?


问题答案:
  1. 在自己的线程中运行不受信任的代码。例如,这可以防止无限循环等问题,并使以后的步骤变得更容易。让主线程等待线程完成,如果花费的时间太长,请使用Thread.stop将其杀死。Thread.stop已过时,但由于不受信任的代码不应访问任何资源,因此可以安全地将其杀死。

  2. 在该线程上设置一个SecurityManager。创建一个SecurityManager的子类,该子类重写checkPermission(Permission perm)以简单地为除少数几个之外的所有权限抛出SecurityException。这里列出了方法及其所需的权限:Java TM 6 SDK 中的权限。

  3. 使用自定义的ClassLoader加载不受信任的代码。你的类加载器将被调用所有不受信任代码使用的类,因此你可以执行诸如禁用对单个JDK类的访问之类的操作。要做的事情是拥有允许的JDK类的白名单。

  4. 你可能要在单独的JVM中运行不受信任的代码。尽管前面的步骤可以确保代码安全,但是孤立的代码仍然可以做一件令人讨厌的事情:分配尽可能多的内存,这将导致主应用程序的可见内存增加。

JSR 121:“应用程序隔离API规范”旨在解决此问题,但不幸的是它尚未实现。

这是一个非常详细的主题,而我大部分时间都是在写这些。

但是无论如何,一些不完善的,自己动手使用的风险,可能是错误的(伪)代码:

类加载器

class MyClassLoader extends ClassLoader {
  @Override
  public Class<?> loadClass(String name) throws ClassNotFoundException {
    if (name is white-listed JDK class) return super.loadClass(name);
    return findClass(name);
  }
  @Override
  public Class findClass(String name) {
    byte[] b = loadClassData(name);
    return defineClass(name, b, 0, b.length);
  }
  private byte[] loadClassData(String name) {
    // load the untrusted class data here
  }
}

安全管理器

class MySecurityManager extends SecurityManager {
  private Object secret;
  public MySecurityManager(Object pass) { secret = pass; }
  private void disable(Object pass) {
    if (pass == secret) secret = null;
  }
  // ... override checkXXX method(s) here.
  // Always allow them to succeed when secret==null
}

线

class MyIsolatedThread extends Thread {
  private Object pass = new Object();
  private MyClassLoader loader = new MyClassLoader();
  private MySecurityManager sm = new MySecurityManager(pass);
  public void run() {
    SecurityManager old = System.getSecurityManager();
    System.setSecurityManager(sm);
    runUntrustedCode();
    sm.disable(pass);
    System.setSecurityManager(old);
  }
  private void runUntrustedCode() {
    try {
      // run the custom class's main method for example:
      loader.loadClass("customclassname")
        .getMethod("main", String[].class)
        .invoke(null, new Object[]{...});
    } catch (Throwable t) {}
  }
}


 类似资料:
  • 恶意代码要如何预防?

  • 问题内容: 在我的Java应用程序中,我有此代码 当我为 android 2.3(第10级) 构建它时, 它可以编译并正常工作。但是,当我为 android 4.0(级别15) 构建它时,它会编译并在运行时崩溃并出现以下错误 当我评论这条线,并建立它工作正常,没有问题.. 所以我不明白为什么会这样,这段代码意味着什么? 问题答案: @Override public void onAttachedT

  • 7.2 邪恶的代码 现在让我们本着学以致用的目的,用注入搞点好玩的东西。我们将创造一个后门程序, 将它命名为一个系统中正规的程序(比如 calc.exe)。只要用户执行了 calc.exe,我们的后门 就能获得系统的控制权。cacl.exe 执行后,就会在执行后门代码的同时,执行原先的 calc.exe (之前我们的后门命名成 calc.exe,将原来的 cacl.exe 移到别的地方)。当 ca

  • 嗨,我想从应用程序中读取值。财产。我发现这应该是可行的: 但我的数据源值为null。 我的应用程序上下文。xml如下所示: 有人能告诉我哪里有问题吗?

  • 我只是在看android逆向工程教程,我注意到他们中的大多数人在反编译apk后修改smali代码而不是实际的java源代码,这是有原因的吗? 感谢您的帮助。 谢啦

  • 本文向大家介绍php快速查找数据库中恶意代码的方法,包括了php快速查找数据库中恶意代码的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php快速查找数据库中恶意代码的方法。分享给大家供大家参考。具体如下: 数据库被输入恶意代码,为了保证你的数据库的安全,你必须得小心去清理。有了下面一个超级方便的功能,即可快速清除数据库恶意代码。 希望本文所述对大家的php程序设计有所帮助。