作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当我遇到这个 video 时,我正在阅读一些 JVM 字节码文章。这显示了内部类如何打开一个可以被利用的父范围的后门? (不确定,也许是?)
这是我的测试代码。
public class Outer {
private String name = "You got me!";
public class Inner {
public void printName() {
System.out.println(name);
}
}
public static void main(String[] args) {
Outer o = new Outer();
Inner i = o.new Inner();
i.printName();
}
}
现在要查看是否正在创建这样的 backdoor
方法,我使用 javap
查看类文件。
这是结果,见printName方法
查看 7:
行,您将看到对 Outer.access$0
的 invokestatic
调用。
查看 Outer.class
,我们看到了方法的定义。
这是安全漏洞吗?它可以被利用吗?我只是想知道更多这方面的信息。
最佳答案
在字节码级别没有对嵌套类的直接支持,因此 Java 源代码中的每个嵌套类都必须编译为单独的类文件。实际上,它们是完全独立的普通类,带有一些用于反射目的的额外元数据。当您访问父级的成员时,嵌套类需要能够访问该父级。
通常,这不是问题,但私有(private)成员只能在定义它们的类中访问,因此内部类无法访问。编译器通过创建一个有效地将访问级别更改为包私有(private)的桥接方法来解决此问题。
这是一个有据可查的现象。这是一个安全漏洞吗?除非你在做一些非常奇怪的事情,否则不会。如果您关心安全性,那么依赖 Java 的进程内沙箱不是一个好主意。但是,如果您正在从事一个无论如何都会这样做的项目,那么是的,这是您在编写沙箱代码时必须注意的一长串陷阱中的一个。
关于Java - 内部类打开父类的后门,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33750577/
我是一名优秀的程序员,十分优秀!