【问题标题】:Security: Restrict internal access by third-party software安全性:限制第三方软件的内部访问
【发布时间】:2012-07-23 19:19:37
【问题描述】:

我有一个 Java 应用程序,用户可以在其中加载第三方“插件”以增强用户体验。存在供这些插件使用的 API,但出于安全考虑,应限制第三方软件访问内部应用程序类。插件的受限包是“com.example”,允许的是“com.example.api”。 API 类确实会调用内部的混淆类。

对此进行研究后,我发现了一些 SecurityManager 方法:checkMemberAccess(Class, int)checkPackageAccess(String),这两种方法似乎都是实现我目标的可行途径。但是,经过一些测试和进一步研究,我发现checkMemberAccess只适用于反射调用,而checkPackageAccess只有在类加载器调用loadClass时才会调用。

什么是限制对包(com.example,但不是 com.example.api)的访问的合理方法?

【问题讨论】:

标签: java security api securitymanager


【解决方案1】:

我建议为插件编写一个自定义类加载器,它可以从使用该类加载器加载的类中隐藏 com.example 包的存在。通常类加载器委托给它们的父级,但是有几种实现方式只能部分或根本不这样做。我相信例如ant 使用这种技术。当使用这样的类加载器加载时,任何违反禁止功能的类链接都将无法加载。或者如果实现使用了惰性链接,并且确实加载成功,但在执行禁止代码期间仍然会失败。

在拒绝您的插件链接时访问被禁止的包后,您可以使用 SecurityManager 通过反射拒绝运行时访问,也可以拒绝创建可能用于绕过您的新类加载器。

class RestrictingClassLoader extends URLClassLoader {
  @Override
  public Class<?> loadClass(String name) throws ClassNotFoundException {
    if (!name.startsWith("com.example.") || name.startsWith("com.example.api."))
      return super.loadClass(name);
    return findClass(name);
  }
}

class RestrictingSecurityManager extends SecurityManager {
  private boolean isRestricted() {
    for (Class<?> cls: getClassContext())
      if (cls.getClassLoader() instanceof RestrictingClassLoader)
        return true;
    return false;
  }
  // Implement other checks based on isRestricted().
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-11
    • 2012-06-25
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2021-07-25
    相关资源
    最近更新 更多