问题标签 [securitymanager]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1250 浏览

java - 安全性:限制第三方软件的内部访问

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

在研究了这个之后,我遇到了 SecurityManager 的几个方法:checkMemberAccess(Class, int)和checkPackageAccess (String),它们似乎都是实现我目标的可行途径。但是,在做了一些测试和进一步研究之后,我发现checkMemberAccess只适用于反射调用,而checkPackageAccess只有在类加载器调用loadClass时才会被调用。

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

0 投票
1 回答
6114 浏览

java - 在没有默认 java.policy 文件的情况下运行 Java 安全管理器

我不想修改我的 java 主目录中的任何内容,但是,我担心有时我的默认 java.policy 文件可能过于宽松。当我使用该选项运行 java 时,有没有办法让我使用指定的策略文件作为唯一的策略文件-Djava.security.manager

如果我添加一个-Djava.security.policy=myPolicy.policy选项,除了默认策略文件之外,它还会使用我的策略文件——这很糟糕,因为看起来默认策略文件中授予的所有权限仍然被授予。

0 投票
1 回答
134 浏览

java - 将桌面应用程序移植到 Applet 沙盒

我有一个旧的 Swing 桌面应用程序,我想将其转换为小程序,并将所有文件 IO 替换为 Web 服务调用。我正在努力寻找小程序允许和不允许做的具体事情的完整列表。

我知道本地文件 IO 不允许使用签名证书,并且我相信小程序插件会检查以查看在编译代码中进行了哪些 API 调用,以确定是否允许您的小程序运行。小程序沙箱中不允许使用哪些确切的类和方法?

此外,这种转换有什么常见的方法吗?

0 投票
2 回答
395 浏览

java - 如何从 java.lang.SecurityManager 获取权限信息?

我正在应用程序(不是小程序)中进行一些调试,并通过调用System.getSecurityManager()获得了系统的安全管理器。如何打印设置此SecurityManager的所有配置信息?查看Java 7 SE API似乎所有方法本质上都是询问性的,并且无法获取权限配置。toString()方法似乎也直接从Object继承,并且只打印指针。

0 投票
1 回答
4955 浏览

java - 如何理解java Socket-Permissions?

以下权限允许什么?我的应用程序是否允许仅接受来自 192.168.1.1:31337 的连接(可能是外部客户端)或接受到 192.168.1.1:31337 的连接(我的应用程序在 192.168.1.1:31337 上运行,与“听”的区别在哪里? '?)。

0 投票
1 回答
3137 浏览

java - 尽管授予了适当的文件权限,但 Java AccessControlException

我在尝试使用 SecurityManager 运行 Java RMI 应用程序时遇到了一个奇怪的错误。当服务器启动时,我希望它从作为命令行参数提供的文件中读取文本。我正在使用 Eclipse,并且该文件与 Java 项目的根目录位于同一目录中(因此我可以在命令行参数中给出文件名而不是完整路径)。我知道 RMI 的 SecurityManager 默认禁止文件 I/O,所以我为我的服务器创建了一个策略文件,如下所示:

(请注意,我的 Eclipse 项目的名称是“authmatch”,它在 Windows 上运行)。在我的 Eclipse 运行配置中,我使用以下 VM 标志启用此策略文件:

我知道正在解析和加载策略文件,因为如果我在 server.policy 中引入语法错误,Java 会在我的应用程序运行时抱怨它(“错误解析文件”)。但是,安全管理器似乎以某种方式忽略了我在策略中授予的权限,因为当我运行应用程序时出现此错误:

由于我要求它读取的文件(smalltest.txt)位于“authmatch”项目目录中,并且我明确授予我的应用程序读取该目录的权限

为什么它仍然坚持认为它没有文件的读取权限?我怀疑这可能是 Windows 问题,因为我在 Linux 计算机上运行了相同的项目,并且类似的策略文件允许它从本地项目目录中读取就可以了。

更新

我运行服务器,-Djava.security.debug=access,failure它在解析策略文件时生成了一堆调试消息。您可以在这个 pastebin看到整个日志,但似乎有两个重要部分:

...很久以后:

看起来有某种“域保护”失败,因为我的代码库没有签名,但我认为使用grant codeBase设置指定没有签名的安全策略是可以接受的。更令人费解的是,它看起来并没有读取根 authmatch 目录的 FilePermission,只是 authmatch/bin 目录。然后它得出结论,它应该拒绝访问“smalltest.txt”,但它永远不会解析该文件的完整目录路径。

请记住,相同的项目和策略在 Linux 上运行良好。

0 投票
1 回答
261 浏览

java - 是否可以将 Spring Security 的 AOP 与 Java Security Manager 合并?

有一个基于 Swing 的多层 Java 应用程序,每个模块都有其后端和前端。

现在我们想使用 Spring Security 添加安全性。我们决定不使用 AspectJ,因为它的开销很大。

是否有可能以某种方式将 Spring 方法调用授权注入 Java 安全管理器,以便后端中的每个方法调用都被 Spring Security 的基于注释的模型拦截(或委托给)?

笔记:

该应用程序包含大量包,并且使用 new 运算符或通过反射技术实例化对象。不可能修改所有实例化并将所有对象更改为 Spring bean。无论对象是如何构造的,Java 安全管理器都会拦截所有方法调用。这就是我们需要以某种方式向 Java 安全管理器注入 Spring Security Method 授权的原因。

0 投票
2 回答
1663 浏览

java - AccessController 未考虑类的 ProtectionDomain

语境

我正在编写一个 Java 系统,其中代码在非常严格的沙箱中执行。查询(由一个或多个类组成)在执行期间只允许访问一个文件夹(以及文件夹中包含的子文件夹和文件)。

我通过使用一个SecurityManager, 和一个新的ClassLoader每个查询执行来强制沙盒。在ClassLoaderusing中定义类时defineClass,我传递了一个ProtectionDomain包含应该授予的文件读取权限的文件。

由于并非调用堆栈上的所有对象都具有所需的权限,因此查询中的读取操作在AccessController.doPrivileged(...)-block 内运行。

问题

  • 当我AccessController.checkPermission(...)直接从doPrivileged(...)块内调用时,它会静默返回
  • 当我调用System.getSecurityManager().checkPermission(...)将请求转发到 时AccessController,会AccessController引发异常。
  • 通过?ProtectionDomain呼叫时似乎迷路AccessControllerSecurityManager
  • 受限制的文件操作(如创建java.io.FileReader),直接调用SecurityManager而不是AccessController. 当通过 调用时,如何让 尊重调用-block 的类的 ?AccessControllerSecurityManagerProtectionDomaindoRestricted(...)
  • 可能是它SecurityManager本身没有所需的权限吗?因此,通过被夹在特权代码之间的调用堆栈中,AccessController生成一个没有特权的联合?

下面是一个示例部分:

程序生成的输出,包括部分堆栈跟踪(PATH 替换使用的长路径名):

CloakAccessController.checkPermission(...)实施也可能很有趣。它看起来像这样:

它的作用主要是绕过创建它的线程的安全限制。


我的java.policy文件的内容是标准 MacOSX 系统的内容。我相信它不包含任何非标准的变化。

0 投票
1 回答
159 浏览

java - 从安全沙箱(例如,小程序)中生成自定义类

我希望能够在(未签名的)小程序中生成和加载自定义类。生成它们我可以处理,但我正在与似乎不希望我加载它们的小程序 SecurityManager 作斗争。

这是一个视觉概述;如您所见,我被困在第 2 阶段:

内裤侏儒

我原本打算使用自定义类加载器。显然,这在小程序中是不允许的;ClassLoader 构造函数引发 SecurityException。

然后我考虑直接在另一个类加载器上调用ClassLoader.defineClass(String name, byte[] b, int off, int len),但该方法受到保护。

我试图通过反射使该方法可访问。我的希望并不高,但我试过了,确实也抛出了 SecurityException。

URLClassLoader似乎提供了救赎:它有一个静态工厂创建方法,不会引发任何安全异常。但是,该技术不允许对加载程序进行子类化或访问受保护的 defineClass 方法。它只接受一组 URL 对象。

因此,我尝试对URL进行子类化以覆盖其 openConnection 方法,从而以这种方式返回我的类字节,但 URL 类是最终的。

然后我尝试使用重写的 openConnection 方法创建自定义URLStreamHandler并将其传递给 URL 的构造函数。SecurityManager 对此再次表示不满。

因此,我尝试使用将返回我的自定义流处理程序的自定义工厂调用 URL.setStreamHandlerFactory。又是 SecurityManager,在抱怨,因为如果不抱怨还有什么好处呢?

所以我尝试创建一个javax.management.loading.MLet。我不知道它的用途,但它是 URLClassLoader 的子类,它允许在其构造函数中指定自定义 URLStreamHandlerFactory 并且没有提到引发安全异常,但它仍然这样做。

绝望中,我尝试使用自定义 ProxySelector 调用ProxySelector .setDefault,希望能够截获一个 URL 并以某种方式将其路由回我的小程序,但我也没有权限。

我尝试java.system.class.loader通过<param name="java_arguments" ...>标签设置属性,但它似乎不是受尊敬的属性之一。

最后,我能想到的唯一剩余方法是将我的类字节发送到远程服务器,该服务器将生成一个可以与 URLClassLoader.newInstance(URL[]) 结合使用的临时 URL。那行得通,但我真的不喜欢这个主意。随着不同类加载器的交互,它似乎会很快变得复杂,并且服务器依赖性对于我想做的事情并不实际。 显然,SecurityManager 非常乐意让您创建一个 URLClassLoader,但是当您尝试使用它时会自发地感到不安。

如果可能的话,我在普通的未签名小程序安全沙箱中执行此操作,以便体验无缝。

但大多数情况下,我只是感到困惑,因为如果不可能,那就没有意义了。如果 SecurityManager 对从任意外部 URL 加载类感到满意,它不应该介意从局部变量中的字节数组加载类。 限制仍然是荒谬的。代码仍然是内部的和沙盒的。

它对于动态代码生成和实现自定义 JAR 压缩(如 LZMA 压缩)都很有用。

帮助!

0 投票
0 回答
48 浏览

java - 动态加载代码的安全管理

我目前正在开发支持动态加载类的客户端/服务器应用程序。

这些类是不能访问某些方法的插件。

我的第一个想法是一个 SecurityManager,它检查堆栈跟踪中的类名,但这似乎不是解决这个问题的理想方法。

如何将这种限制应用于特定类别?

是否有(可实现的)方法从类文件内容中读取每个引用的类?