Java - 内部类为父类打开后门

Age*_*ntX 4 java bytecode inner-classes

当我浏览一些 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,为了查看是否backdoor创建了这样的方法,我常常javap查看类文件。

这是结果,请参阅printName method

printName 方法的字节码

查看该行7:,您将看到invokestatic对 a 的调用Outer.access$0

查看Outer.class我们可以看到该方法的定义。

后门方法定义

这是一个安全漏洞吗?它可以被利用吗?我只是好奇想了解更多这方面的信息。

Ant*_*ony 5

字节码级别不直接支持嵌套类,因此 Java 源代码中的每个嵌套类都必须编译为单独的类文件。实际上,它们是完全独立的普通类,带有一些用于反射目的的额外元数据。当您访问父级的成员时,嵌套类需要有权访问该父级。

通常,这不是问题,但私有成员只能在定义它们的类中访问,因此不能在内部类中访问。编译器通过创建一个桥接方法来解决这个问题,该方法有效地将访问级别更改为包私有。

这是一个有据可查的现象。这是一个安全漏洞吗?除非你正在做一些非常奇怪的事情。如果您关心安全性,那么依赖 Java 的进程内沙箱并不是一个好主意。但是,如果您正在开发一个无论如何都要这样做的项目,那么是的,这是您在对沙箱进行编码时必须注意的一长串陷阱中的一个。