从Memory ClassLoader加载库?

时间:2012-02-29 17:13:39

标签: java classloader

我一直在为我正在编写的应用程序开发一种引导程序。它从网站缓冲应用程序并运行它。它非常有效,直到我调用应用程序主类的main方法,这需要库也是流式传输的。 LIB和应用程序位于同一个类加载器中,但它表示由于链接不满意而无法找到库。我寻求帮助,但找不到任何帮助。

1 个答案:

答案 0 :(得分:0)

我假设您收到UnsatisfiedLinkError,因为您没有使用Runtime.loadLibrary引入本机代码来支持native方法。这些库需要位于本地文件系统上,并且独立于任何类加载器。的Javadoc:

public void loadLibrary(String libname)
     

使用指定的库名称加载动态库。包含本机代码的文件从传统上获取库文件的位置从本地文件系统加载此过程的详细信息取决于实现。从库名到特定文件名的映射是以系统特定的方式完成的。

显然,Runtime.getRuntime()独立于任何特定的类加载器。

如果网络类加载可能导致网络加载本机代码,那将是一个巨大的remote code execution vulnerability,因为本机代码不能像{1}那样受到java字节码的限制。

如果您信任生成应用程序的网站,并通过安全通道(加密以防止MITM和篡改)获取它,那么您可以获取库,将它们转储到本地文件系统,验证任何签名或校验和,然后在导致类初始化之前调用Runtime.loadLibrary or System.loadLibrary加载本机库。

如果您不信任生成该应用程序的网站的作者,或该网站托管第三方内容,那么请不要从中加载更少的系统库JAR。

即使网站作者值得信赖,加载系统库或其他您未经过审查和测试的本机代码也是危险的。通过SecurityManager进行沙盒处理和系统调用拦截可以帮助减轻这种风险,但要小心。