728x90
반응형
SMALL
SW개발보안가이드중 구현단계에서의 점검항목은 크게 7가지 이다. (입보시에코캡아)
1. 입력데이터 검증 및 표현
2. 보안기능
3. 시간 및 상태
4. 에러처리
5. 코드오류
6. 캡슐화
6-1.잘못된 세션에 의한 데이터 정보 노출 (싱글톤 멤버변수)
6-2. 제거되지 않고 남은 디버그 코드
6-3. 시스템 데이터 정보 노출
6-4. Public 메소드로부터 반환된 Private 배열 (Get함수)
6-5. Private 배열에 Public 데이터 할당 (Set함수)
7. API 오용
이 장에서는 "6.캡슐화" 에 대한 점검항목을 설명한다.
(두음 : 잘제시PP)
6-1.잘못된 세션에 의한 데이터 정보 노출 (싱글톤 멤버변수)
구분 | 설명 |
원인/영향 | 다중스레드환경에서 Servlet, JSP, Controller 등 싱글톤으로 존재하는 객체들의 멤버변수가 여러 스레드에 의해 공유되면서 다른 스레드에게 정보를 노출시킬 수 있다. |
대응 |
① 싱글톤 패턴을 사용하는 경우, 변수 범위(scope)에 주의하여 사용한다 ② java에서 HttpServlet 클래스의 하위클래스나 JSP, Controller 에서 멤버변수를 선언하지 않도록 하고 필요한 경우 지역변수를 선언하여 사용한다 취약) <%! String username = "/"; <-- 멤버변수로 선언 %> 안전) <% String username = "/"; <-- 지역변수로 선언 %> |
취약) @controller public class TrendForecastController { pirvate int currentPage = 1 ;<-- Controller에서 멤버변수로 선언되어 스레드간 공유 public void doSomething(HttpServletRequest request) { currentPage = integer.parseInt(request.getParameter("page")); } 취약) @controller public class TrendForecastController { public void doSomething(HttpServletRequest request) { int currentPage = integer.parseInt(request.getParameter("page")); <-- 지역변수 } } |
6-2. 제거되지 않고 남은 디버그 코드
구분 | 설명 |
원인/영향 | 디버그 용도로 삽입된 코드가 제거되지 않고 남아 있어서 공격자가 그 정보를 이용해서 공격가능 |
대응 | ① SW배포전 반드시 디버그 코드를 삭제한다. ② 디버그 용도로 개발한 main()함수는 디버깅이 끝나면 삭제한다. |
6-3. 시스템 데이터 정보 노출
구분 | 설명 |
원인/영향 | 예외 상항 발생시 오류처리가 제대로 이루어지지 않아서 시스템의 오류메시지가 사용자에게 노출되어 내부시스템, 데이터베이스, 프로그램 구조에 대한 정보가 노출될 수 있다. ->"에러처리 4.1 오류메시지를 통한 정보노출" 과 비슷.. |
대응 | ① 예외처리시 시스템정보를 노출하는 getMessage() 함수 사용을 금한다. ② 시스템 설정을 통해 오류가 발생하는 경우 default 오류 페이지가 노출될 수 있도록 한다. 취약) catch (IOException e) { System.err.print(e.getMessage()); } 안전) catch (IOException e) { logger.error ("IOException Occurred!"); } |
6-4. Public 메소드로부터 반환된 Private 배열 (Get함수)
구분 | 설명 |
원인/영향 | private으로 선언된 배열을 public으로 선언된 메소드를 통해 반환하는 경우 그 배열의 레퍼런스가 외부에 공개되어서 외부에서 악의적으로 그 캡슐화된 배열의 값을 수정할수 있다. |
대응 | ① 배열 반환시 배열의 복제본을 반환한다. ② 배열을 그대로 반환하는 경우라면 수정을 제어하는 별도 Public 메소드를 선언하여 사용한다. 취약) private String[] colors ; <-- private 배열 멤버변수 선언 public String[] getColor() { return this.colors; <-- 배열 멤버변수를 그대로 리턴 } 안전) private String[] colors ; <-- private 배열 멤버변수 선언 public String[] getColor() { String[] copyArray = null; <-- 복제본 변수 선언 if (this.colors != null) { copyArray = new String[this.colors.length]; for (int i = 0 ; i < this.colors.length ; i++) { copyArray[i] = this.colors[i] ;<-- 복제본 변수에 멤버변수값을 복사 } return copyArray; <-- 복제본 변수 리턴 } |
6-5. Private 배열에 Public 데이터 할당 (Set함수)
구분 | 설명 |
원인/영향 | Public 메소드에 입력된 데이터를 Private 배열에 저장하는 경우 Private 배열의 레퍼런스가 공개되어 외부에서 이 레퍼런스를 이용해서 private배열의 값을 임의 수정할 수 있다. |
대응 | ① Public함수에서 데이터를 전달 할 때 "레퍼런스"가 아닌 "값" 자체를 전달해서 Private배열에 할당함으로써 Private멤버로서의 접근권한을 유지한다. 취약) private String[] datas ; <-- private 배열 멤버변수 선언 public void setDatas (String[] datas) { this.datas = datas <-- 외부에서 입력한 배열데이터를 그대로 멤버변수에 셋팅 } 안전) private String[] datas ; public String[] setDatas (String[] datas) { if (datas != null) { this.datas = new String[datas.length]; for (int i = 0 ; i < datas.length ; i++) { this.datas[i] = datas[i] ; <-- 멤버변수에 값을 복사 } } |
728x90
반응형
LIST
'정보보안' 카테고리의 다른 글
소스코드 보안약점 진단 후기... (0) | 2019.12.01 |
---|---|
SW보안약점진단원 : 구현단계 - API 오용 (0) | 2019.11.30 |
SW보안약점진단원 : 구현단계 - 코드오류 (0) | 2019.11.28 |
SW보안약점진단원 : 구현단계 - 에러처리 (0) | 2019.11.27 |
SW보안약점진단원 : 구현단계 - 시간 및 상태 (0) | 2019.11.26 |