适用于未签名小程序的默认 Java 策略文件在哪里?
Posted
技术标签:
【中文标题】适用于未签名小程序的默认 Java 策略文件在哪里?【英文标题】:Where is the default Java policy file that applies to unsigned applets? 【发布时间】:2012-11-23 12:10:56 【问题描述】:当我在 Web 浏览器中运行未签名的 Java 小程序时,它可以做一些事情而不是其他事情。 必须有一个文件来定义这个。我认为它可能看起来像这里的列表 [http://www.coderanch.com/t/460650/Websphere/java-security-AccessControlException-Access-denied] 并包含如下条目:
permission java.lang.RuntimePermission "getClassLoader";
permission java.lang.RuntimePermission "setFactory";
permission java.lang.RuntimePermission "accessClassInPackage.sun.misc";
permission java.lang.RuntimePermission "accessClassInPackage.sun.beans.infos";
permission java.lang.RuntimePermission "accessDeclaredMembers";
permission java.net.SocketPermission "*", "accept, resolve, connect";
permission java.util.PropertyPermission "*", "read, write";
permission java.security.SecurityPermission "printIdentity";
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
permission java.lang.RuntimePermission "modifyThread";
permission java.lang.RuntimePermission "modifyThreadGroup";
permission java.security.SecurityPermission "getProperty.ssl.SocketFactory.provider";
permission java.lang.RuntimePermission "createClassLoader";
permission java.lang.RuntimePermission "getProtectionDomain";
以下是它可能包含的更多条目的列表:http://download.java.net/jdk8/docs/technotes/guides/security/permissions.html
这是列出限制的非正式尝试(似乎是多个用户通过反复试验做出的):Restrictions on what an unsigned Java applet can do?
此页面 [http://docs.oracle.com/javase/1.3/docs/guide/security/PolicyFiles.html] 似乎暗示唯一相关的两个文件是 $java.home\lib\security\java.policy
和 $user.home\.java.policy
。我有一个默认安装,我没有后一个文件,只有前者。该文件仅包含
permission java.lang.RuntimePermission "stopThread";
以及各种PropertyPermission
s如
permission java.util.PropertyPermission "java.version", "read";
这就是我知道必须有一个额外的未签名小程序的默认策略文件的方式:我制作了一个启动新线程的小程序,并且使用上面的默认 java.policy
文件,它失败并出现以下错误: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup")
,表示没有任何东西授予它"modifyThreadGroup"
权限。但是,当我在浏览器中运行它时,它会成功创建线程。
所以问题是:当我在浏览器中运行小程序时,包含此权限"modifyThreadGroup"
的策略文件在哪里?我在 JRE 目录中搜索过,但似乎没有。也许它不是通过文件完成的。那么是什么授予小程序"modifyThreadGroup"
权限(和其他权限)?
编辑
这是我看到的异常的堆栈跟踪:
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366)
at java.security.AccessController.checkPermission(AccessController.java:555)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at sun.applet.AppletSecurity.checkAccess(AppletSecurity.java:252)
at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)
at java.lang.Thread.init(Thread.java:376)
at java.lang.Thread.<init>(Thread.java:446)
at LITSApplet.init(LITSApplet.java:30)
at sun.applet.AppletPanel.run(AppletPanel.java:434)
at java.lang.Thread.run(Thread.java:722)
【问题讨论】:
【参考方案1】:专门针对modifyThreadGroup
:
Thread
构造函数的 API 文档指向 Thread(ThreadGroup,Runnable,String)
构造函数
Thread(ThreadGroup,Runnable,String)
构造函数在指定的ThreadGroup
上引用ThreadGroup.checkAccess
ThreadGroup.checkAccess
被记录为调用 SecurityManager.checkAccess(ThreadGroup)
SecurityManager.checkAccess(ThreadGroup)
API 文档说明了该类中的实现:
如果线程组参数不是系统线程组,这个 方法只是静默返回。
(然后它建议某种破坏 LSP:
需要更严格策略的应用程序应覆盖此方法。
)
通过普通 Java 代码添加额外的权限。如果您考虑同源策略,这是有必要的。
【讨论】:
这(更严格的政策)似乎是 AppletViewer 中正在发生的事情。我在问题的编辑中添加了堆栈跟踪。发生的事情是sun.applet.AppletSecurity extends sun.awt.AWTSecurityManager
,而实际上,传递给其checkAccess(..)
的线程组不是系统线程(即具有非空父级),它仍然调用checkPermission("modifyThreadGroup")
,并且没有这样的权限被授予任何地方。我的结论是 AppletViewer 在权限方面不是一个很好的模拟器,不能满足浏览器内环境的期望。以上是关于适用于未签名小程序的默认 Java 策略文件在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.SecurityException:管辖权策略文件未由受信任的签名者签名