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

+ Recent posts