Notice
Recent Posts
Recent Comments
Link
IgnatiusHeo
구현단계 보안약점 제거 기준-Private 배열에 Public 데이터 할당 본문
작성일: 230706
※ 본 게시글은 학습 목적으로 행정안전부·KISA의 소프트웨어 보안약점 진단 가이드, 소프트웨어 개발보안 가이드를 참고하여 작성하였습니다.
정리 내용: 소프트웨어 보안약점 진단 가이드(487~491p)
구분 | - 캡슐화 |
설계단계 | |
개요 | public으로 선언된 메소드의 인자가 private선언된 배열에 저장되면, private배열을 외부에서 접근하여 배열수정과 객체 속성변경이 가능해진다. |
진단 세부사항 (설계단계) |
|
보안대책 (구현단계) |
public으로 선언된 메서드의 인자를 private선언된 배열로 저장되지 않도록 한다. 인자로 들어온 배열의 복사본을 생성하고 clone() 메소드로 복사된 원소를 저장하도록 하여 private변수에 할당하여 private선언된 배열과 객체속성에 대한 의도하지 않게 수정되는 것을 방지한다. 만약 배열 객체의 원소가 String 타입 등과 같이 변경이 되지 않는 경우에는 인자로 들어온 배열의 복사본을 생성하여 할당한다. |
진단방법 (구현단계) |
① private 배열이 선언되어 있는지 확인하고 ② public 메소드의 인자로 받은 배열을 private 배열필드에 직접 할당할 경우 취약하다고 판단한다. 이때 선언된 private 배열의 원소가 일반 객체일 경우 각 원소별로 객체를 생성하고 객체 내부의 값을 복사하는지 확인한다. |
다. 코드예제
ㅇ 분석
1: //userRoles 필드는 private이지만, public인 setUserRoles()로 외부의 배열이 할당되면, 사실상
public 필드가 된다.
2: private UserRole[] userRoles;
3: public void setUserRoles(UserRole[] userRoles) {
4: this.userRoles = userRoles;
5: }
ㅇ 내용
1. 퍼블릭 메소드에 프라이빗을 넣어놓고 할당?
ㅇ 수정
1: //객체가 클래스의 private member를 수정하지 않도록 한다.
2: private UserRole[] userRoles;
3: public void setUserRoles(UserRole[] userRoles) {
4: this.userRoles = new UserRole[userRoles.length];
5: for (int i = 0; i < userRoles.length; ++i)
6: this.userRoles[i] = userRoles[i].clone();
7: }
ㅇ 내용
1. 복제, 참고해서 사용
ㅇ 분석
1: //userRoles 필드는 private이지만, public인 setUserRoles()로 외부의 배열이 할당되면, 사실상
public 필드가 된다.
2: private String[] userRoles;
3: public void setUserRoles(String[] userRoles) {
4: this.userRoles = userRoles;
5: }
ㅇ 수정
1: //객체가 클래스의 private member를 수정하지 않도록 한다.
2: private String[] userRoles;
3: public void setUserRoles(String[] userRoles) {
4: this.userRoles = new String[userRoles.length];
5: for (int i = 0; i < userRoles.length; ++i)
6: this.userRoles[i] = userRoles[i];
7: }
ㅇ 내용
1. 같은 방식으로 생성해서 참고
ㅇ 분석
1: class Program
2: {
3: //userRoles 필드는 private이지만, public인 setUserRoles()로 외부의 배열이 할당되면, 사실상
public 필드가 된다.
4: private String[] userRoles;
5: public void SetUserRoles(String[] userRoles)
6: {
7: this.userRoles = userRoles;
8: }
9: }
ㅇ 수정
1: class Program
2: {
3: //객체가 클래스의 private member를 수정하지 않도록 한다.
4: private String[] userRoles;
5: public void SetUserRoles(String[] userRoles)
6: {
7: int length = userRoles.Length;
8: this.userRoles = new String[length];
9: for(int i = 0; i < length; i++) {\
10: this.userRoles[i] = userRoles[i];
11: }
12: }
13: }
ㅇ 내용
끝.
'자격 > SW보안약점진단원' 카테고리의 다른 글
구현단계 보안약점 제거 기준-취약한 API 사용 (0) | 2023.07.06 |
---|---|
구현단계 보안약점 제거 기준-DNS lookup에 의존한 보안결정 (0) | 2023.07.06 |
구현단계 보안약점 제거 기준-Public 메소드부터 반환된 Private 배열 (0) | 2023.07.06 |
구현단계 보안약점 제거 기준-제거되지 않고 남은 디버그 코드 (0) | 2023.07.06 |
구현단계 보안약점 제거 기준-잘못된 세션에 의한 데이터 정보 노출 (0) | 2023.07.06 |