繁体   English   中英

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

[英]Java - Inner Classes opening a backdoor to Parent Class

当我看到这个视频时,我正在浏览一些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 method

用于printName方法的ByteCode

请参阅第7:7: ,您将看到对Outer.access$0invokestatic调用。

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

后门方法定义

这是一个安全漏洞吗? 可以被剥削吗? 我很想知道更多。

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

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

这是一个记录良好的现象。 这是一个安全漏洞吗? 除非你做的事非常奇怪。 如果您关心安全性,依赖Java的进程中沙箱是一个坏主意。 但是如果你正在开发一个完成这个任务的项目,那么是的,这是在编写沙箱时必须注意的一长串陷阱中的一个。

您可以注意到,合成访问器方法具有包私有访问权限。 因此,当安全管理器处于活动状态时,您无法通过反射访问它。 使用MethodHandles.lookup您只能从同一个包中访问它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM