Reflection Attack

  • 생성자를 private 로 선언해서 외부 생성을 막으려고 해도 reflection 을 사용하면 외부에서 생성 가능하도록 할수 있다.
 1 import java.lang.reflect.*;
 2 
 3 class Test{
 4     // private 이므로 외부 생성 불가
 5     private Test()
 6     {
 7       System.out.println("Test");
 8     }
 9 }
10 class Main{
11 
12   public static void main(String[] args) throws ClassNotFoundException,
13          InstantiationException, IllegalAccessException, ReflectiveOperationException{
14     Class<Test> kclass = Test.class;
15 
16     Constructor<Test> cons = kclass.getDeclaredConstructor(); // 생성자를 가져옴
17     cons.setAccessible(true); // 생성자를 public 으로 변경
18 
19     Object object = cons.newInstance(); // 생성 가능
20 
21   }
22 }
  • 리플랙션을 통해서 객체는 언제든 생성 가능하다
    • 기본 생성자가 없더라도 생성 가능
    • private 로 선언하더라도 setAccessible 을 사용해 변경후 생성 가능