分析 JAAS 的示例程序

Posted

技术标签:

【中文标题】分析 JAAS 的示例程序【英文标题】:profiling a sample program of JAAS 【发布时间】:2012-08-23 14:43:49 【问题描述】:

我正在尝试分析此处的 JAAS 示例程序。(http://www.devx.com/getHelpOn/Article/9915/0/page/4)。我下载了代码并运行它。没有分析它运行得很好。运行该程序的命令如下所示:

java -cp SimpleAction.jar:SimpleAuthz.jar:SimpleLogMod.jar -Djava.security.manager -Djava.security.policy==SimpleJAAS.policy -Djava.security.auth.login.config==SimpleJAAS.config  com.gabhart.security.SimpleAuthz 

但是当我尝试使用 java 代理运行它(对其进行分析)时,它给了我如下异常:

java.security.AccessControlException: access denied (java.util.PropertyPermission ch.usi.dag.jborat.liblist read)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
    at java.security.AccessController.checkPermission(AccessController.java:546)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285)
    at java.lang.System.getProperty(System.java:650)
    at ch.usi.dag.jborat.agent.JavaAgent.premain(JavaAgent.java:19)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:323)
    at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:338)

然而程序运行良好,分析器不产生输出。我使用的 java profiler 并没有被广泛使用。它正确地描述了其他 java 程序/应用程序,但不是这个。

我使用以下命令与分析器一起运行示例 JAAS 程序:(请注意,它是从脚本文件中复制的)

 **java  -javaagent:lib/jborat-agent.jar \
     -Dch.usi.dag.jborat.exclusionList="conf/exclusion.lst" \
      -Dch.usi.dag.jborat.liblist="conf/lib.lst" \
       -Dch.usi.dag.jp2.outputFilePrefix="JAAZexample_output" \
       -Dch.usi.dag.jborat.instrumentation="ch.usi.dag.jp2.instrument.AddInstrumentation" \
       -Dch.usi.dag.jp2.dumpers="ch.usi.dag.jp2.dump.xml.XmlDumper" \
         -Dch.usi.dag.jborat.codemergerList="conf/codemerger.lst" \
          -Xbootclasspath/p:./lib/Thread_JP2.jar:lib/jborat-runtime.jar:lib/jp2-runtime.jar/jp2.jar/jborat-agent.jar/jborat.jar**:SimpleAction.jar:SimpleAuthz.jar:SimpleLogMod.jar \
          -Djava.security.manager -Djava.security.policy==SimpleJAAS.policy \
          -Djava.security.auth.login.config==SimpleJAAS.config  com.gabhart.security.SimpleAuthz  

谁能告诉我为什么会抛出指定的异常以及为什么我的分析器没有产生输出?

谢谢。

【问题讨论】:

【参考方案1】:

您已启用 SecurityManager (-Djava.security.manager) 并指定了特定的安全策略 (-Djava.security.policy==SimpleJAAS.policy)。您的代理代码违反了该安全策略,因此失败。您需要在策略文件中添加一个授权部分,以允许代理执行其需要执行的操作。

出于测试目的,您可能会在您的安全策略中添加类似这样的内容(将允许代理为所欲为):

grant codeBase "file:lib/jborat-agent.jar" 
  permission java.security.AllPermission;
;

您可能需要调整 codeBase 行以包含所有必要的 jar。

显然,在真正安全的应用程序中,您可能不想这样做,而是授予代理执行所需的最低权限。

【讨论】:

在那之后,我得到这个: sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 的 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance( DelegatingConstructorAccessorImpl.java:27) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:513) 在 java.lang.Class.newInstance0(Class.java:355) 在 java.lang.Class.newInstance(Class.java) :308) 在 ch.usi.dag.jborat.agent.JavaAgent.premain(JavaAgent.java:22) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) @user523956 - 该堆栈跟踪是否有异常? @user523956 - 是的,大概有一些有用的嵌套在该堆栈跟踪中,但我需要查看整个跟踪(或根本原因),这很可能是另一个访问控制异常。 (部分信息对于获得帮助很少有用)。

以上是关于分析 JAAS 的示例程序的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的程序无法创建新的 JAAS 登录上下文?

基于 Java EE 的 Web 应用程序服务器中的 JAAS 安全性是不是依赖?

“Spring Security”和“Java 认证和授权服务(jaas)”

JAAS 概念

如何使用自定义 JAAS 堆栈配置 Spring Security?

Spring Security 是基于 JAAS 的吗?