0. 개요
private로 선언된 배열을 public으로 선언된 메소드를 통해 반환(return)하면,
그 배열의 레퍼런스가 외부에 공개되어 외부에서 배열수정과 객체 속성변경이 가능해진다.
1. 보안 대책
- private로 선언된 배열을 public으로 선언된 메소드를 통해 반환하지 않도록 한다.
: private 배열에 대한 복사본을 반환하도록 하고 배열의 원소에 대해서는 clone() 메소드를 통해 복사된 원소를 저장하도록 하여
private 선언된 배열과 객체속성에 대한 의도하지 않게 수정되는 것을 방지 한다.
- 배열의 원소가 String 타입 등과 같이 변경이 되지 않는 경우에는
Private 배열의 복사본 을 만들고 이를 반환하도록 작성한다.
- private 배열을 수정해야 할 경우 별도의 public 메서드를 생성하여 사용한다.
2. 진단 방법
- private 배열을 사용하는지 확인한다.
- private 배열을 public 메서드로 직접 반환하는지 확인한다.
3. 코드 예시
# 1 - Public 메소드부터 반환된 Private 배열- 안전하지 않은 코드 예시(JAVA)
멤버 변수 colors는 private으로 선언되었지만 public으로 선언된 getUserColors() 메소드를 통해
private 배열에 대한 참조를 얻을 수 있다.
의도하지 않은 수정 발생 가능 !
>> private배열에 대한 복사본을 만들고, 복사된 배열의 원소로는 clone() 메소드를 통해
private 배열의 원소의 복사본을 만들어 저장하여 반환하도록 작성하면
private 선언된 배열과 원소에 대한 의도하지 않은 수정을 방지할 수 있다.
# 1 + Public 메소드부터 반환된 Private 배열 - 안전한 코드 예시(JAVA)
* onCreate() : 액티비티가 처음 생성될 때 호출되는 함수입니다. 처음 프로젝트를 생성하면 MainActivity에서 자동으로 생성해줄 만큼 액티비티 생명주기에 있어서 중요한 함수입니다. 해당 함수에서는 액티비티를 실행하기 위하여 정의된 사용자 UI를 올리기 위해 레이아웃 리소스 파일을 읽어와 객체를 생성하고 각종 초기화 작업을 진행하게 됩니다. 해당 함수 수 호출 후에는 항상 onStart() 함수가 같이 호출됩니다.
-
# 2 - Public 메소드부터 반환된 Private 배열 - 안전하지 않은 코드 예시(JAVA)
배열의 원소가 String 타입 등과 같이 수정이 되지 않는 경우에는
배열의 원소가 String 타입 등과 같이 수정이 되지 않는 경
# 2 + Public 메소드부터 반환된 Private 배열 - 안전한 코드 예시(JAVA)
private 배열의 복사본을 만들고 이를 반환하도록 작성하면,
private 선언된 배열에 대한 의도하지 않은 수정을 방지할 수 있다.
4. 해당 취약점 CASE
- private 배열인 멤버변수를 리턴하여 사용할 경우
- 일반객체를 갖는 private 배열을 반복문으로 복사하지만, 일반 객체의 원본 주소값이 복사될 경우
#. 참고 블로그
https://prokyhsigma.tistory.com/81?category=848515
'about Security > SECURE CODING' 카테고리의 다른 글
[캡슐화] Private 배열에 Public 데이터 할당 (5등급) (0) | 2021.08.10 |
---|---|
[캡슐화] 시스템데이터 정보 노출 (5등급) (0) | 2021.08.10 |
[보안기능] 사용자 하드디스크에 저장되는 쿠키를 통한 정보 노출 (5등급) (0) | 2021.08.10 |
[에러처리] 부적절한 예외 처리 (5등급) (0) | 2021.08.10 |
[보안기능] 주석문 안에 포함된 시스템 주요 정보 (5등급) (0) | 2021.08.10 |
댓글