마침 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 클래스에서는 원본 데이터가 보호되고 변경되지 않았다.
예제가 좀 잘못된 거 같은데 나중에 다시 검토해 봐야겠다.
사실 좀 헷갈린다.
'Java > Secure Coding' 카테고리의 다른 글
[Secure Coding] 안전하지 않거나 약한 암호 알고리즘을 사용하지 말라 (0) | 2023.09.23 |
---|---|
[Secure Coding] 암호키를 Object.equals()로 비교하지 말라 (0) | 2023.09.17 |
[Secure Coding] LDAP 인젝션을 방지하라 (0) | 2023.09.09 |
[Secure Coding] XPath 인젝션을 방지하라 (0) | 2023.09.07 |
[Secure Coding] 코드 인젝션을 방지하라 (0) | 2023.09.02 |