簡體   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