맞는데 왜 틀릴까..?

Java/Secure Coding

[Secure Coding] 비신뢰-메서드의 매개변수를 clone() 메서드로 복제하지 말라

안도일 2023. 9. 12. 00:21

마침 Effective Java에서 관련된 주제를 다룬 적이 있어서 자세한 내용은 아래를 참조하자.

 

https://com-squadleader.tistory.com/267

 

[Effective Java] Item 50. 적시에 방어적 복사본을 만들라

자바는 네이티브 메서드를 사용하지 않아 C, C++ 같이 안전하지 않은 언어에서 흔히 보는 버퍼 오버런, 배열 오버런, 와일드 포인터 같은 메모리 충돌 오류에서 안전하다. 자바로 작성한 클래스는

com-squadleader.tistory.com

 

 

가변적 메서드의 매개변수를 방어적으로 복사하면 다양한 보안 취약점을 완화시킨다.

 

  • 그러나 clone() 메서드를 부적절하게 사용하면, 정상적으로 보이지만 예상하지 못한 결과를 반환하는 매개변수를 공격자에게 제공하게 되어 취약점을 이용하도록 허용할 수 있다.
  • 그러한 객체는 검증과 보안 검사를 우회할지도 모른다.
  • 그러한 클래스가 매개변수로서 메서드에 전달되면, 매개변수를 신뢰할 수 없다고 간주하고 클래스가 제공하는 clone() 메서드를 사용하지 말자.
  • 방어적 복사를 하기 위해서 final이 아닌 clone() 메서드를 사용하지 않도록 하자.

 

 

 

 

이전에 정리해 둔 내용이 있으니 바로 예제를 살펴보자.

 

Date 공격

 

  • Date는 final이 아니기 때문에 clone()을 오버라이딩 할 수 있다.
  • 만약 신뢰할 수 없는 날짜 매개변수인 date를 받아서 그것의 clone() 메서드를 이용해 방어적 복사를 시도하려고 하면 공격자로 하여금 악성 날짜를 제공할 수 있게 한다.
  • 공격자는 단순히 clone() 메서드 안에 악성 코드를 포함시키기만 하면 된다.

 

악의적인 날짜 클래스

 

 

  • 기존의 Date 클래스를 상속하여 그 기능을 오버라이딩해서 보안취약점을 만들려는 클래스
  • clone() 메서드를 재정의하여 원본 Date 객체를 복사한 것처럼 보이지만 실제로는 공격자가 설정한 값을 반환한다.

 

 

방어적 복사 수행 클래스 

 

 

  •  Date 객체를 생성하여 방어적 복사를 수행한다.
  • 방어적 복사를 사용하여 원본 startDate와 endDate를 수정하지 않고 복사된 객체를 생성한다.

 

Date 공격 예시 

 

 

 

  • 공격받은 maliciousStartDate, maliciousEndDate는 공격자가 설정한 값으로 변경되었다.
  • 방어적 복사를 사용한 DateDefenseCopy 클래스에서는 원본 데이터가 보호되고 변경되지 않았다.

 

 

예제가 좀 잘못된 거 같은데 나중에 다시 검토해 봐야겠다.

사실 좀 헷갈린다.