본문 바로가기
자바 시큐어 코딩

민감한 가변적(Mutable)클래스에 수정이 불가능한 래퍼를 제공하라.

by 웹하는빡통 2020. 4. 6.

필드의 불변성(immutable)은 악의적인 변경뿐만 아니라 부주의로 인한 변경도 방지하여, 입력을 받아들이거나 값을 반환할 때 방어적인 복사가 불필요해진다. 그러나 일부 민감 클래스들은 불변성을 가질 수 없다. 다행히, 비신뢰-코드(untrusted code)는 변경 불가능한 래퍼를 이용하여 가변적(Mutable) 클래스에 읽기전용으로만 엑세스할 수 있다.

부적절한 코드(예제).

이 예는 Mutable 클래스로 구성되어 있는데 내부 객체의 수정을 허용한다. 

비신뢰-호출자(untrusted invoker)는 변경자 메서드인 setArray()를 호출하여 객체의 불변성(immutable)을 위반하고 있다. 접근자 메서드 getArray()의 호출을 통해 클래스의 비공개인 내부 상태를 수정할 수 있도록 되어 있다. 

해당 이 코드는 자바용 CERT 오라클 보안 코딩 표준 "OBJ05-J 가변적 private 클래스 멤버에 대한 레퍼런스를 반환하기 전에 멤버들을 복사하여 방어하라"를 위반한다. 

 

immutable: 객체 내의 특정 요소의 값을 변경 할 수 없는 객체 
mutable: 객체 내의 특정 요소를 변경 할 수 있는 객체  

적절한 코드(예제) 

일반적으로 변경자 메소드 등 코어 인터페이스가 정의하는 모든 메서드들에 대하여 적절한 래퍼들을 제공하면, 민감 클래스들을 안전하게 볼 수 있는 객체로 변환할 수 있다. 변경자 메소드들에 대한 래퍼들은 UnsupportedOperationException을 발생시켜서 클라이언트들이 객체의 불변성에 영향을 미치는 작업을 막아야 한다.

이 솔루션은 Mutable.setArray()를 오버라이드하는 setArray() 메서드를 추가하여 Mutable 객체 변경을 방지한다. 

 

MutableProtector 래퍼 클래스는 getArray() 메소드를 오바라이딩하여 배열을 복제한다. 

비록 이 코드를 호출하여 가변적 객체 배열에 대한 복사본을 얻을 수 있기는 하지만 원래의

배열은 변하지 않고 남아 있으며 엑세스가 불가능하다. 호출자가 반환된 객체에 대해 setArray() 메소드를 호출하면 오버라이드된 setArray() 메소드는 예외를 발생시킨다. 데이터에 대한 읽기가 허용된 경우에는 이 객체가 비신뢰-코드로 전달 될 수 있다.  

댓글