0. 개요
public으로 선언된 메소드의 인자가 private 선언된 배열에 저장되면,
private배열을 외부에서 접근하여 배열수정과 객체 속성변경이 가능해진다.
1. 보안 대책
- public으로 선언된 메서드의 인자를 private 선언된 배열로 저장되지 않도록 한다.
: 인자로 들어온 배열의 복사본을 생성하고 clone() 메소드를 통해 복사된 원소를 저장하도록 하여
private변수에 할당하여 private선언된 배열과 객체속성에 대한 의도하지 않게 수정되는 것을 방지한다.
- 배열 객체의 원소가 String 타입 등과 같이 변경이 되지 않는 경우에는 인자로 들어온 배열의 복사본을 생성하여 할당한다.
- 전달받은 public 배열의 레퍼런스 대신 값을 private 배열에 할당한다.
2. 진단 방법
- private 배열을 사용하는지 확인한다.
- public 메서드의 인자를 private 배열에 직접 할당하는지 확인한다.
3. 코드 예시
# 1 - Private 배열에 Public 데이터 할당 - 안전하지 않은 코드 예시 (JAVA)
userRole은 private임에도 불구하고 public으로 선언된 setUserRoles를 통해 인자가 할당되기 때문에
배열의 원소를 외부에서 변경할 수 있게 된다.
( >> 의도하지 않은 배열과 원소에 대한 객체속성 수정이 발생 가능. )
인자로 들어온 배열의 복사본을 생성하고 clone() 메소드를 통해 복사된 원소를 저장하도록 하여
private 변수에 할당하면 private으로 할당된 배열과 원소에 대한 의도하지 않은 수정을 방지하자.
# 1 + Private 배열에 Public 데이터 할당 - 안전한 코드 예시(JAVA)
* clone() : 원본 객체의 필드값가 동일한 값을 가지는 새로운 객체를 생성
- 원본의 객체를 안전하게 보호하기 위해서 사용한다.
** cloneable 인터페이스를 구현하지 않으면 clone()메소드를 호출할 때 예외발생한다.
- 얕은 복제와 깊은 복제가 있는데 위의 예시는 깊은 복제로 복제된 참조 객체를 변경해도 원본 객체가 변경되지 않는다.
# 2 - Private 배열에 Public 데이터 할당 - 안전하지 않은 코드 예시(JAVA)
같은 경우이지만 다른 점은 배열의 원소가 String타입 등과 같이 수정이 되지 않는다는 점이다.
# 2 + Private 배열에 Public 데이터 할당 - 안전한 코드 예시(JAVA)
다음과 같이 인자로 들어온 배열의 복사본을 생성하여 private변수에 할당하면
private으로 할당된 배열에 대한 의도하지 않은 수정을 방지할 수 있다.
4. 해당 취약점 CASE
- 새로운 배열을 생성 후 반복문으로 복사하지만, 배열의 원소가 일반 객체일 경우
#. 참고 블로그
https://prokyhsigma.tistory.com/82?category=848515
'about Security > SECURE CODING' 카테고리의 다른 글
[캡슐화] Public 메소드부터 반환된 Private 배열 (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 |
댓글