You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
skywalking携带rasp启动,报错日志如下:
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
[OpenRASP] Failed to initialize module jar: rasp-engine.1.3.7
[OpenRASP] Failed to initialize, will continue without security protection.
java.lang.reflect.InaccessibleObjectException: Unable to make void jdk.internal.loader.ClassLoaders$AppClassLoader.appendToClassPathForInstrumentation(java.lang.String) accessible: module java.base does not "opens jdk.internal.loader" to unnamed module @3f0ee7cb
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:361)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:301)
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:196)
at java.base/java.lang.reflect.Method.setAccessible(Method.java:190)
at com.baidu.openrasp.ModuleContainer.(ModuleContainer.java:58)
at com.baidu.openrasp.ModuleLoader.(ModuleLoader.java:100)
at com.baidu.openrasp.ModuleLoader.load(ModuleLoader.java:129)
at com.baidu.openrasp.Agent.init(Agent.java:95)
at com.baidu.openrasp.Agent.premain(Agent.java:72)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:513)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:525)
问题原因
报错信息指出了一个具体的错误:“Unable to make void jdk.internal.loader.ClassLoaders$AppClassLoader.appendToClassPathForInstrumentation(java.lang.String) accessible: module java.base does not “opens jdk.internal.loader” to unnamed module @3f0ee7cb”。
这个错误的原因在于,OpenRASP 利用了 Java 反射技术,调用了 jdk.internal.loader.ClassLoaders 类中的一个受保护的方法 appendToClassPathForInstrumentation。但是在 JDK 9 及以上版本中,为了保护核心库的安全性,Java 库中的某些组件的方法或属性被设置为了受保护或私有,不能被外部调用。而这个受保护的方法 appendToClassPathForInstrumentation 就是其中一个。
根据报错信息中的描述:module java.base does not “opens jdk.internal.loader” to unnamed module @3f0ee7cb,可以看出是由于 jdk.internal.loader 模块没有开放对其他模块的访问权限,导致无法调用被保护的方法。
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
环境信息
JDK: OpenJDK Runtime Environment AdoptOpenJDK (build 15.0.1+9)
application: skywalking-8.7.0
openrasp: 1.3.7
问题描述
skywalking携带rasp启动,报错日志如下:
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
[OpenRASP] Failed to initialize module jar: rasp-engine.1.3.7
[OpenRASP] Failed to initialize, will continue without security protection.
java.lang.reflect.InaccessibleObjectException: Unable to make void jdk.internal.loader.ClassLoaders$AppClassLoader.appendToClassPathForInstrumentation(java.lang.String) accessible: module java.base does not "opens jdk.internal.loader" to unnamed module @3f0ee7cb
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:361)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:301)
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:196)
at java.base/java.lang.reflect.Method.setAccessible(Method.java:190)
at com.baidu.openrasp.ModuleContainer.(ModuleContainer.java:58)
at com.baidu.openrasp.ModuleLoader.(ModuleLoader.java:100)
at com.baidu.openrasp.ModuleLoader.load(ModuleLoader.java:129)
at com.baidu.openrasp.Agent.init(Agent.java:95)
at com.baidu.openrasp.Agent.premain(Agent.java:72)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:513)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:525)
问题原因
报错信息指出了一个具体的错误:“Unable to make void jdk.internal.loader.ClassLoaders$AppClassLoader.appendToClassPathForInstrumentation(java.lang.String) accessible: module java.base does not “opens jdk.internal.loader” to unnamed module @3f0ee7cb”。
这个错误的原因在于,OpenRASP 利用了 Java 反射技术,调用了 jdk.internal.loader.ClassLoaders 类中的一个受保护的方法 appendToClassPathForInstrumentation。但是在 JDK 9 及以上版本中,为了保护核心库的安全性,Java 库中的某些组件的方法或属性被设置为了受保护或私有,不能被外部调用。而这个受保护的方法 appendToClassPathForInstrumentation 就是其中一个。
根据报错信息中的描述:module java.base does not “opens jdk.internal.loader” to unnamed module @3f0ee7cb,可以看出是由于 jdk.internal.loader 模块没有开放对其他模块的访问权限,导致无法调用被保护的方法。
解决方案
可以尝试使用 --add-opens 参数来打开对 jdk.internal.loader 模块的访问权限。
例如,在启动应用程序时,可以使用如下的 JVM 参数来指定:
--add-opens java.base/jdk.internal.loader=ALL-UNNAMED
这个参数表示对于 java.base 模块中的 jdk.internal.loader,打开对所有无名(unnamed)模块的访问权限。
在这种情况下,OpenRASP 就可以正常调用 appendToClassPathForInstrumentation 方法了。
Beta Was this translation helpful? Give feedback.
All reactions