보안 공부/소스코드 보안약점 진단

소스코드 보안약점 진단 - Public 메서드로부터 반환된 Private 배열

H.J.World 2022. 2. 9. 10:10
728x90
반응형

소스코드 보안약점 진단 // 소프트웨어 보안약점 진단 // SW 보안약점 진단과 같이 다양한 이름으로 불리는 진단 과업 중 하나이다.

SW개발보안은 해킹 등 사이버공격의 원인인 보안약점을 SW개발단계에서 사전에 제거하고 SW 개발 생명주기의 각 단계별로 수행하는 일련의 보안활동을 통하여 안전한 SW를 개발·운영하기 위한 목적으로 적용하는 개발체계이다.

해당 내용은 KISA에서 발간하는 취약점 진단 가이드 항목을 기준으로 작성한다.

 

제 6절 캡슐화

중요한 데이터 또는 기능성을 불충분하게 캡슐화하거나 잘못 사용함으로써 발생하는 보안약점으로 정보노출, 권한문제 등이 발생할 수 있다.


4. Public 메서드로부터 반환된 Private 배열

가. 개요

Private 배열을 Public 메서드가 반환하면, 배열 주소값이 외부 공개됨으로써 외부에서 배열 수정이 가능해진다.

나. 보안대책

Private로 선언된 배열을 Public 메서드를 통해서는 반환하지 않도록 하고 필요한 경우 배열의 복제 본을 반환하거나, 수정을 제어하는 별도의 Public 메서드를 선언하여 사용한다.

다. 코드예제

멤버 변수 colors는 private로 선언되었지만 public으로 선언된 getColors() 메서드를 통해 참조를 얻을 수 있다. 이를 통해 의도하지 않은 수정이 발생할 수 있다.

- 안전하지 않은 코드의 예 JAVA -

1: // private 인 배열을 public인 메소드가 return한다.
2: private Color[] colors;
3: public Color[] getUserColors(Color[] userColors) { return colors; }

 

- 안전한 코드의 예 JAVA -

private배열에 대한 복사본을 만들고, 복사된 배열의 원소로는 clone() 메소드를 통해 private 배열 의 원소의 복사본을 만들어 저장하여 반환하도록 작성하면, private선언된 배열과 원소에 대한 의도 하지 않은 수정을 방지 할 수 있다

1: private Color[] colors;
2: //메소드를 private으로 하거나, 복제본 반환, 수정하는 public 메소드를 별도로 만든다.
3: public void onCreate(Bundle savedInstanceState) {
4: super.onCreate(savedInstanceState);

 

라. 진단방법

private 배열이 선언되어 있는지 확인하고(①), 해당 배열이 public 메소드에서 반환될 경우 취약하다 고 판단한다(②). 이때 선언된 private 배열의 원소가 일반 객체일 경우 각 원소별로 객체를 생성하고 객체 내부의 값을 복사하는지 확인한다.

1: public class U495 {
2: //Private 인 배열을 public 인 메소드가 return한다
3: private String[] colors;----------------------------------①
4:
5: public String[] getColors() {
6: return colors;--------------------------------------②
7: }
8: }

 

- 정탐코드의 예 -

함수 안에서 멤버필드의 배열을 리턴 하면 해당 배열을 리턴 받아 그 값을 바꿀 수 있다. Private 배열 을 리턴 받아 그 내용을 수정하게 되면 Private의 의도에 벗어나므로 취약하다.

1: public class AddManager extends BaseManager {
2: private String[] checkb;
3: private String[] prsn_info_sn;
4: private String login_dept_id;
5: private String login_user_id;
6: private String[] prsn_group_se;
7: private String[] isInterested;
8: private String act;
9: public String[] getChkb() {
10: return this.checkb;
11: }
12: }

 

- 정탐코드의 예 -

아래 코드는 retColors 배열을 새로 생성하고 for문을 이용하여 복사하였으나, 배열의 원소가 일반 객체이기 때문에 원본(myColors)의 주소값만 복사되어 취약하다.

1: // private 인 배열을 public인 메소드가 return한다
2: private Color[] myColors;
3: …
4: public Color[] getColors() {
5: Color[] retColors = new Color[myColors.length];
6: for(int i =0; i < myColors.length; i++) {
7: retColors[i] = this.myColors[i]; // 일반 객체일 경우 주소값만 복사된다.
8: }
9: return retColors;
10: }

 

- 오탐코드의 예 -

다음과 같은 배열은 private도 아니고 final 이므로 취약하지 않다.

1: 1: public static final String[] XML_TAG = { “” }

728x90
반응형