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
728x90
반응형
SMALL

이번 장에서는 SW개발보안가이드중 분석/설계단계에서 검증해야할 항목중 SR3. 에러처리와 SR4. 세션통제
에 관한 점검항목에 대해서 설명하고자 한다.


SR3. 에러처리

SR3-1. 예외처리

항목 설명
1) 명시적인 예외처리  - 명시적인 예외처리는 예외처리블록을 이용해서 대응
    (Exception처리)
2) 런타임 예외처리  - 런타임 예외의 경우에는 입력값의 범위를 체크하여 애플리케이션이
   정상적으로 동작할 수 있는 값만 사용되도록 보장해야 한다. 
3) 상세한 에러정보 노출 방지  - 에러가 발생한 경우 지정된 페이지를 통해 공지
 - 오류메시지에 중요 시스템 정보 노출 금지
 - 오류발생에 대한 로깅 처리
구현단계 오류메시지를 통한 정보노출
시스템 데이터 정보 노출 (캡슐화)

 

SR4. 세션통제

SR4-1. 세션통제

항목 설명
1) 세션간 데이터 공유 금지  - ① 컨트롤러 컴포넌트, ②싱글톤 객체로 생성되는 서비스 컴포넌트 에서는
       멤버 변수클래스 변수는 세션간에 공유되는 데이터가 되므로 생성하지
       않도록 한다.
           예) 잘못된 세션에 의한 정보노출 (캡술화)
                    - 싱글톤객체의 멤버에 대한 경쟁조건 방지하기 위한
                      동기화(SYN) 처리
2) 세션의 안전한 관리  - 모든 페이지에서 언제나 로그아웃이 가능하도록
 - 로그아웃을 요청하면 사용자에게 할당된 모든 세션을 제거하는 메소드 사용
   예) session.Invalidate() 메소드는 세션에 저장된 정보를 완전히 제거해줌.
 - 세션타임아웃 설정
 - 일정시간 사용하지 않은 세션은 자동 로그아웃
 - 세션ID가 포함된 쿠키에 대해서는 HttpOnly속성을 설정하여 XSS공격에 대비
 - 사용자가 패스워드 변경시 현재 활성화된 세션을 삭제하고 다시 할당한다.
3) 세션ID의 안전한 관리 <세션ID 생성>
 - 세션ID는 서버에서 생성해서 사용
 - 세션ID는 최소 128 비트의 길이로 생성되어야 하며, 난수알고리즘을 적용하여
   예측불가능한 값이 사용되어야 한다
<세션ID 사용>
 - URL rewrite 를 사용하는 경우 세션ID가 URL에 노출될수 있으므로 사용
   하지 않는다.
<세션ID 폐기>
 - 로그인 성공시 할당받은 세션ID는 파기하고 새로운 값으로 재할당하여 
   세션ID고정 공격에 대응
 - 일정시간 주기적으로 세션ID 재할당 한다.



728x90
반응형
LIST

+ Recent posts