问题标签 [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.
java - 安全性:限制第三方软件的内部访问
我有一个 Java 应用程序,用户可以在其中加载第三方“插件”以增强用户体验。存在供这些插件使用的 API,但出于安全考虑,应限制第三方软件访问内部应用程序类。插件的受限包是“com.example”,允许的是“com.example.api”。API 类确实调用了内部的混淆类。
在研究了这个之后,我遇到了 SecurityManager 的几个方法:checkMemberAccess(Class, int)和checkPackageAccess (String),它们似乎都是实现我目标的可行途径。但是,在做了一些测试和进一步研究之后,我发现checkMemberAccess只适用于反射调用,而checkPackageAccess只有在类加载器调用loadClass时才会被调用。
限制对包(com.example,但不是 com.example.api)的访问的合理方法是什么?
java - 在没有默认 java.policy 文件的情况下运行 Java 安全管理器
我不想修改我的 java 主目录中的任何内容,但是,我担心有时我的默认 java.policy 文件可能过于宽松。当我使用该选项运行 java 时,有没有办法让我使用指定的策略文件作为唯一的策略文件-Djava.security.manager
?
如果我添加一个-Djava.security.policy=myPolicy.policy
选项,除了默认策略文件之外,它还会使用我的策略文件——这很糟糕,因为看起来默认策略文件中授予的所有权限仍然被授予。
java - 将桌面应用程序移植到 Applet 沙盒
我有一个旧的 Swing 桌面应用程序,我想将其转换为小程序,并将所有文件 IO 替换为 Web 服务调用。我正在努力寻找小程序允许和不允许做的具体事情的完整列表。
我知道本地文件 IO 不允许使用签名证书,并且我相信小程序插件会检查以查看在编译代码中进行了哪些 API 调用,以确定是否允许您的小程序运行。小程序沙箱中不允许使用哪些确切的类和方法?
此外,这种转换有什么常见的方法吗?
java - 如何从 java.lang.SecurityManager 获取权限信息?
我正在应用程序(不是小程序)中进行一些调试,并通过调用System.getSecurityManager()获得了系统的安全管理器。如何打印设置此SecurityManager的所有配置信息?查看Java 7 SE API似乎所有方法本质上都是询问性的,并且无法获取权限配置。toString()方法似乎也直接从Object继承,并且只打印指针。
java - 如何理解java Socket-Permissions?
以下权限允许什么?我的应用程序是否允许仅接受来自 192.168.1.1:31337 的连接(可能是外部客户端)或接受到 192.168.1.1:31337 的连接(我的应用程序在 192.168.1.1:31337 上运行,与“听”的区别在哪里? '?)。
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 上运行良好。
java - 是否可以将 Spring Security 的 AOP 与 Java Security Manager 合并?
有一个基于 Swing 的多层 Java 应用程序,每个模块都有其后端和前端。
现在我们想使用 Spring Security 添加安全性。我们决定不使用 AspectJ,因为它的开销很大。
是否有可能以某种方式将 Spring 方法调用授权注入 Java 安全管理器,以便后端中的每个方法调用都被 Spring Security 的基于注释的模型拦截(或委托给)?
笔记:
该应用程序包含大量包,并且使用 new 运算符或通过反射技术实例化对象。不可能修改所有实例化并将所有对象更改为 Spring bean。无论对象是如何构造的,Java 安全管理器都会拦截所有方法调用。这就是我们需要以某种方式向 Java 安全管理器注入 Spring Security Method 授权的原因。
java - AccessController 未考虑类的 ProtectionDomain
语境
我正在编写一个 Java 系统,其中代码在非常严格的沙箱中执行。查询(由一个或多个类组成)在执行期间只允许访问一个文件夹(以及文件夹中包含的子文件夹和文件)。
我通过使用一个SecurityManager
, 和一个新的ClassLoader
每个查询执行来强制沙盒。在ClassLoader
using中定义类时defineClass
,我传递了一个ProtectionDomain
包含应该授予的文件读取权限的文件。
由于并非调用堆栈上的所有对象都具有所需的权限,因此查询中的读取操作在AccessController.doPrivileged(...)
-block 内运行。
问题
- 当我
AccessController.checkPermission(...)
直接从doPrivileged(...)
块内调用时,它会静默返回 - 当我调用
System.getSecurityManager().checkPermission(...)
将请求转发到 时AccessController
,会AccessController
引发异常。 - 通过?
ProtectionDomain
呼叫时似乎迷路AccessController
了SecurityManager
? - 受限制的文件操作(如创建
java.io.FileReader
),直接调用SecurityManager
而不是AccessController
. 当通过 调用时,如何让 尊重调用-block 的类的 ?AccessController
SecurityManager
ProtectionDomain
doRestricted(...)
- 可能是它
SecurityManager
本身没有所需的权限吗?因此,通过被夹在特权代码之间的调用堆栈中,AccessController
生成一个没有特权的联合?
下面是一个示例部分:
程序生成的输出,包括部分堆栈跟踪(PATH 替换使用的长路径名):
CloakAccessController.checkPermission(...)
实施也可能很有趣。它看起来像这样:
它的作用主要是绕过创建它的线程的安全限制。
我的java.policy文件的内容是标准 MacOSX 系统的内容。我相信它不包含任何非标准的变化。
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 压缩)都很有用。
帮助!
java - 动态加载代码的安全管理
我目前正在开发支持动态加载类的客户端/服务器应用程序。
这些类是不能访问某些方法的插件。
我的第一个想法是一个 SecurityManager,它检查堆栈跟踪中的类名,但这似乎不是解决这个问题的理想方法。
如何将这种限制应用于特定类别?
是否有(可实现的)方法从类文件内容中读取每个引用的类?