微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以使用MethodHandle常量来绕过访问控制?

如何解决是否可以使用MethodHandle常量来绕过访问控制?

我正在使用JDK15。(我正在使用ByteBuddy 1.10.16生成一些类,但我认为除背景信息外,它在这里几乎无关紧要。)

在这生成的类之一中,我正在设法存储在生成的类中的invokeExact() 常数调用MethodHandle。这是通过MethodHandles.Lookup#findSetter获取的“字段设置器”。

(在接下来的工作中,我知道了MethodHandles.privateLookupIn()方法。)

我注意到有问题的“字段设置器” MethodHandle代表private字段时失败。在大多数情况下,这并不令我感到惊讶:直接MethodHandle是直接的:虽然我并不假装对所有这些东西的内在知识都了解很多,但在我看来,肯定它必须包裹一些东西没有访问检查的低级字节码。

但是考虑到privateLookupIn()的存在,这表明在某些情况下可以绕过访问检查,有没有一种方法可以使我从A类“收获”一个“字段设置器” MethodHandle读取一个private字段,然后将其作为常量存储在另一个类B中,以便其上的invokeExact()成功吗?

我相信我过去曾经做过类似的事情(必须检查),涉及private方法,但是在那种情况下,我不是{em>不是使用MethodHandle constants ,即我在MethodHandle间的类初始化时间使用<clinit>获取privateLookupIn(),并将得到的MethodHandle存储在private static final字段中,然后在该字段的内容调用invokeExact()。如果我必须继续走这条路,我会这样做,但是MethodHandle常数似乎很吸引人,如果可以的话,最好使用它们。

因此,表达我的问题的另一种方式是:表示MethodHandle的常量形式是否能够存储其特权?还是有一种一次性的方式“提升”给定存储为常量的MethodHandle的特权?还是将给定的MethodHandle存储为常量这一事实是否会阻止它始终访问除常规可访问的Java构造以外的任何东西? I didn't see anything super obvious in the JVM specification in the relevant section.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。