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

Posted

技术标签:

【中文标题】从安全沙箱(例如小程序)中生成自定义类【英文标题】:Generate custom classes from within a security sandbox (e.g., applet) 【发布时间】:2012-12-12 16:59:20 【问题描述】:

我希望能够在(未签名的)小程序中生成和加载自定义类。生成它们我可以处理,但我正在与似乎不希望我加载它们的小程序 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 并以某种方式将其路由回我的小程序,但我也没有权限。

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

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

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

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

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

救命!

【问题讨论】:

我正在与似乎不想让我加载它们的小程序 SecurityManager 作斗争。” 我怀疑AccessControlException 的结果非常明确,没有'似乎'关于它。为什么我肯定希望看到这个小程序在沙盒中创建新代码并加载它?签署小程序。 【参考方案1】:

..SecurityManager 再次抱怨,因为如果不抱怨还有什么好处?

它的存在是为了保护最终用户,防止你做你正在尝试的事情。

..如何加载类?

对 Jar 签名,让用户接受数字签名的代码。

..将我的类字节发送到远程服务器,该服务器将生成一个可以与 URLClassLoader.newInstance(URL[]) 结合使用的临时 URL。

沙盒小程序无法创建URLClassLoader

【讨论】:

问题很明显,如何加载类?正如我在远程服务器示例中指出的那样,阻止它绝对没有安全优势。 顺便说一句,无论您的意图多么纯粹,如果您在安全沙箱中找到一种方法来执行此操作,这就是一个安全漏洞 所以不可能?但为什么?它可能带来什么不同? 我不是安全专家。我只知道 JRE 不允许在沙盒小程序中使用任何数量的东西。例如。反射、文件 I/O、动态加载类.. 这令人失望。我对此感到有点暴躁,但我会接受你的回答。存在这种愚蠢的限制不是你的错。

以上是关于从安全沙箱(例如小程序)中生成自定义类的主要内容,如果未能解决你的问题,请参考以下文章

如何在php中生成自定义图像?

(Swift 4) 如何在 firebase 中生成自定义自动 id?

在 Form.cs 中生成自定义 C# 代码,同时在设计时在 Form1.cs 中删除用户控件

如何以编程方式添加尺寸类自定义

小菜鸟web项目接入支付宝沙箱环境所遇到的坑

JVM16_类的概述分类ClassLoader源码分析自定义类的加载器双亲委派机制沙箱安全机制