HihoBookStudy / EffectiveJava

이펙티브 자바 북스터디입니다.
1 stars 0 forks source link

[아이템 8] finalizer 공격 #13

Closed zpqmdh closed 3 months ago

zpqmdh commented 3 months ago

아이템 8 42페이지에 따르면

finalizer를 사용한 클래스는 finalizer 공격에 노출되어 심각한 보안 문제를 일으킬 수도 있다. finalizer 공격 원리는 간단하다. 생성자나 직렬화 과정에서 예외가 발생하면, 이 생성되다 만 객체에서 악의적인 하위 클래스의 finalizer가 수행될 수 있게 한다.

readObject와 readResolve 메서드와 finalizer 공격이 어떻게 수행되는지 명확히 이해가 가지 않습니다. 본문에서 해당 경우를 단호하게 있어서는 안 된다고 한 이유가 체감이 되지 않아 질문합니다.

ForteEscape commented 3 months ago

Q.

readObject와 readResolve 메서드와 finalizer 공격이 어떻게 수행되는지 명확히 이해가 가지 않습니다. 본문에서 해당 경우를 단호하게 있어서는 안 된다고 한 이유가 체감이 되지 않아 질문합니다.

A.

readObject()readResolve()는 직렬화된 데이터파일을 읽으면서 객체 생성을 진행하는 메서드입니다. 다음의 코드를 봅시다.


class Parent {
    Integer value = 0;

    Parent(int value) {
        // 3.
        if (value <= 0) {
            throw new IllegalArgumentException("value must positive");
        }
        this.value = value;
    }
}

public class FinalizeAttack extends Parent {

    static Parent parent;

    FinalizeAttack(int value) {
        // 2.
        super(value);
    }

    @Override
    public void finalize() {
        // 6.
        parent = this;
    }

    public static void main(String[] args) {
        try {
            // 1.
            new FinalizeAttack(-1);
        } catch (Exception e) {
            // 4.
            System.out.println(e);
        }

        // 5.
        System.gc();
        System.runFinalization();

        // 7.
        if (parent != null) {
            System.out.println("attack successful parent value : " + parent.value);
        }
    }
}
  1. 먼저 new FinalizeAttack(-1)FinalizeAttack 객체를 생성합니다.
  2. FinalizeAttack 생성자는 super(-1)FinalizeAttack의 부모 Parent 객체를 먼저 생성하는 것을 시도합니다.
  3. Parent 생성자에서 value가 -1이기 때문에 IllegalArgumentExceptionthrow됩니다.
  4. throwIllegalArgumentExceptioncatch에 잡힙니다. 해당 예외가 출력됩니다.
  5. JVM이 GC를 실행하고, finalize()를 실행시킵니다.
  6. finalize()가 실행되면서, parentthis(생성되다 만 FinalizerAttack객체)가 들어갑니다.
  7. parent에 불완전한 FinalizerAttack 객체가 들어감으로서 parentnull이 아니게 됩니다. 따라서 조건문을 만족하며 생성된 FinalizerAttack 객체의 value값이 출력됩니다.
zpqmdh commented 3 months ago

와,, !!! 너무 이해하기 쉬운 예시랑 설명을 들어주셔서 감사합니다. 덕분에 finalize attack이 왜 위험한지 느낌이 확 오네요