티스토리 뷰
가. 원인
- Public으로 선언된 메서드의 인자를 Private 배열로 저장하는 경우
나. 영향
- Private 배열을 외부에서 직접 접근하여 값을 수정이 가능
다. 보안대책
- Public으로 선언된 메서드의 인자를 Private으로 선언된 배열에 저장하지 않도록 구현
- 인자로 들어온 배열의 복사본을 생성하여 clone() 메서드를 통해 복사된 원소를 저장
- 전달받은 Public 배열의 레퍼런스 대신 값을 Private 배열에 할당
라. 안전한 코드
1. clone으로 복사본을 생성
public class UserManagement { private UserInfo[] myUsers;
public void setUserInfo( UserInfo[] users) { this.myUsers = new UserInfo[ users.length ]; // clone() 메서드를 사용하여 복사된 원소를 저장 for( int i=0 ; i<users.lenght ; i++ ) this.myUsers[i] = users[i].clone(); }
|
2. Public 배열의 값을 복사
public class MyClass { private String[] my_colors;
public void setMyColor( String[] colors ) { this.my_colors = new String[ colors.length ]; // 전달받은 Public 배열의 레퍼런스 대신 값을 복사 for( int i=0 ; i<colors.lenght ; i++ ) this.my_colors[i] = colors[i]; }
|
마. 진단방법
<멤버변수 사용 확인>
1. private 배열을 사용하는지 확인
2. public 메서드의 인자를 private 배열에 직접할당하는지 확인
바. 정/오탐 케이스
<정탐 케이스>
1. 새로운 배열을 생성 후 반복문으로 복사하지만, 배열의 원소가 일반객체일 경우
( private UserRole[] userRoles );
'Web Analytics > SW 보안약점 진단원' 카테고리의 다른 글
[구현보안] API 오용 02 - 취약한 API 사용 (0) | 2019.10.07 |
---|---|
[구현보안] API 오용 01 - DNS Lookup에 의존한 보안결정 (0) | 2019.10.07 |
[구현보안] 캡슐화 04 - Public 메서드로부터 반환된 Private 배열 (0) | 2019.10.07 |
[구현보안] 캡슐화 03 - 시스템 데이터 정보 노출 (0) | 2019.10.07 |
[구현보안] 캡슐화 02 - 제거되지 않고 남은 디버그 코드 (0) | 2019.10.07 |
- Total
- Today
- Yesterday