728x90
반응형
SMALL

SW개발보안가이드중 구현단계에서의 점검항목은 크게 7가지 이다.  (입보시에코캡아)
  1. 입력데이터 검증 및 표현
  2. 보안기능
  3. 시간 및 상태
  4. 에러처리
  5. 코드오류
  6. 캡슐화
  7. API 오용
       7-1.DNS Lookup 에 의존한 보안결정
       7-2. 취약한 API사용

이 장에서는 "7.API 오용" 에 대한 점검항목을 설명한다.


7-1.DNS Lookup 에 의존한 보안결정

구분 설명
원인/영향 DNS Lookup 명령어를 통해 얻은 도메인명을 가지고 유효성을 판단하는 경우 DNS 위변조시에는
잘못된 도메인명에 의해서 트래픽이 공격자를 경유하게 될 수도 있고, 공격자가 마치 동일 도메인에
속한 서버인 것처럼 위장할 수 있다
대응 보안결정에 DNS 조회결과를 사용하지 않는다. -> IP주소를 직접 참조한다.

취약)
String ip = req.getRemoteAddr();
InetAddress addr = InetAddress.getByName(ip); <-- ip에 대한 도메인명을 조회
if (addr.getCanonicalHostName().endWidth('trustme.com")) {  <-- 조회된 도메인명으로 체크
      ………….
}

안전)
String ip = req.getRemoteAddr();
if (ip == null || "".equals(ip)) return;
String trustedAddr = "127.0.0.1" ;
if (ip.equals(trustedAddr)) {    <-- ip 주소값으로 체크
       .........
 }



7-2. 취약한 API사용

구분 설명
원인/영향 ① J2EE 애플리케이션이 컨테이너에서 제공하는 자원연결관리를 사용하지 않고 직접 제작하는 경우
② J2EE 애플리케이션이 프레임워크 메소드를 호출하지 않고 Socket을 직접 사용하는 경우
③ J2EE 애플리케이션에서 System.exit() 사용은 컨테이너까지 종료시킨다. 
대응 ① 컨테이너에서 제공하는 자원연결관리 기능을 사용한다
② Socket 을 직접 사용하지 않고 프레임워크 메소드를 호출하여 사용한다.
③ J2EE 애플리케이션에서 System.exit() 을 사용하지 않는다.

취약) conn = DriverManager.getConnection(url, user, pw);   <-- 자원에 대한 직접 연결 하고 있음
안전) DataSource datasource = (Datasource) ctx.lookup(CONNECT_STRING);  <-- 연결 스트링
        conn = datasource.getConnection():  

취약) socket = new Socket ("kisa.co.kr", 8080) ;    <-- 소켓으로 직접 연결 시도
안전) URL url = new URL ("http://127.0.0.1:8080/DataServlet");
       URLConnection urlConn = url.openConnection();

취약) catch (EXception e) {
           System.exit(1);
       }

 

728x90
반응형
LIST
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개발보안가이드중 구현단계에서의 점검항목은 크게 7가지 이다.  (입보시에코캡아)
  1. 입력데이터 검증 및 표현
  2. 보안기능
  3. 시간 및 상태
  4. 에러처리
  5. 코드오류
      5-1. Null Pointer 역참조
      5-2. 부적절한 자원 해제
      5-3. 해제된 자원 사용
      5-4. 초기화되지 않은 변수 사용

  6. 캡슐화

  7. API 오용

이 장에서는 "5.코드오류" 에 대한 점검항목을 설명한다.
(두음 : 널부해초)


5-1. Null Pointer 역참조

구분 설명
원인/영향 Null로 설정된 참조변수의 주소값을 참조하는 경우 공격자는 의도적으로 널포인트 역참조를 
유발하여 그 결과로 발생하는 예외상황을 이용하여 추후의 공격을 계획하는데 사용할 수 있다
대응 ① 참조변수를 레퍼런스하기전에 NULL인지 검사한다

취약) public static int cardinality (Object obj, final Collection col) {
         if (obj.equals("aaa")) {  <-- object 파라미터값을 null검사 안하고 바로 사용
         }

안전) public static int cardinality (Object obj, final Collection col) {
         if (null != obj && obj.equals("aaa")) {  <-- object 파라미터값을 null검사
         }



5-2. 부적절한 자원 해제

구분 설명
원인/영향 자원(메모리,DB연결,파일..) 들을 사용후 반드시 해제하여야 하는데 부적절한 로직 및 코드누락으로
자원해제가 안될경우 자원고갈로 인해 오류가 발생한다
대응 ① 자원할당후 반드시 자원해제가 되도록 코드를 작성한다
② 자바의 경우 자원해제코드는 finally 블록에 기술해서 누락되지 않도록 한다


5-3. 해제된 자원 사용

구분 설명
원인/영향 C,C++ 에서는 개발자가 자원을 직접 해제해야하는 경우 해제된 자원을 다시 해제하거나
해제된 자원을 다시 사용하는 경우 오류발생
취약) free(temp);
       stmcpy(temp, argv[1], BUFFER_SIZE-1);   <-- temp해제후 다시 사용
대응 ① 자원해제 후 그 메모리를 참조하고 있던 포인터를 참조 추적이나 형변환
  , 수식에서의 피연산자 등을 사용하여 해제된 메모리에 접근하지 못하도록 한다.
② 자원해제 후 포인터에 NULL을 저장하거나, 다른 적절한 값을 저장하면 예상치 못한 
   코드의 실행을 막을수 있다



5-4. 초기화되지 않은 변수 사용

구분 설명
원인/영향 C언어에서 스택 메모리에 저장되는 지역변수는 생성시 자동으로 초기화 되지 않는데
, 이 변수를 그냥 참조할 경우 이전에 이 메모리에 저장되어 있던 데이터를 의도치 않게
참조하게 되어 악성코드가 실행될 수 있다
대응 ① 모든 변수는 사용전에 반드시 올바른 초기값을 할당한다
취약) int x , y ;
안전) int x = 0 , y = 0 ;



728x90
반응형
LIST
728x90
반응형
SMALL

SW개발보안가이드중 구현단계에서의 점검항목은 크게 7가지 이다.  (입보시에코캡아)
  1. 입력데이터 검증 및 표현
  2. 보안기능
  3. 시간 및 상태
  4. 에러처리
      4-1. 오류메시지를 통한 정보노출
      4-2. 오류 상황 대응 부재
      4-3. 부적절한 예외 처리

  5. 코드오류

  6. 캡슐화
  7. API 오용

이 장에서는 "3.에러처리" 에 대한 점검항목을 설명한다.


4-1. 오류메시지를 통한 정보노출

구분 설명
원인/영향 오류메시지에 시스템정보와 같은 민감한 정보가 노출되어 공격에 활용할 수 있다.
취약) e.printStackTrace();  <-- 스택정보가 노출됨.
안전) logger.error("ERROR-01 : 파일 열기 에러");  <-- 별도 에러코드 정의
대응 ① 시스템오류 메시지 대신에 별도의 오류메시지를 정의하여 출력해준다.

 

4-2. 오류 상황 대응 부재

구분 설명
원인/영향 발생한 오류에 대해서 아무런 조치를 하지 않아 프로그램이 비정상적인 상태로 실행되는 겅우

취약) catch (Exception e) {
          // do nothing
       }
   
안전) catch (Exception e) {
          s.setMessage(e.getMessage());  <-- 원래 e.getMessag()는 시스템정보 노출
          return (makeLogin(s));
       }    
안전) catch (Exception e) {
         logger.error("ERROR-01 : 파일 열기 에러");  <-- 별도 에러코드 정의
       }    
대응 ① 발생오류별로 적절한 에러처리 루틴이 작성되어야 한다.
② 특별히 처리해야할 루틴이 없는 오류라 하더라도 
    logger.error("에러상황에 대한 간단한 메시지 또는 에러코드") 가 수행될수 있어야한다



4-3. 부적절한 예외 처리

구분 설명
원인/영향 모든 오류에 대해 하나의 방식으로 예외처리를 하는 경우 각각의 상황에 따라 적절한 예외처리를 
할수 가 없어서 부적절한 Resource 관리로 인해 시스템이 중지될 수 있다.
대응 ① 각각의 예외상항에 대해 적절한 예외처리 코드를 수행할수 있도록 한다

취약) catch (Exception e) {
          System.err.println("Exception : " + e.getMessge());
       }

안전) catch (MalformedURLExcepton e) {
       }
       catch (IOExcepton e) {
       }
       catch (ParseExcepton e) {
       }
       finally {
       }



 

728x90
반응형
LIST
728x90
반응형
SMALL

SW개발보안가이드중 구현단계에서의 점검항목은 크게 7가지 이다.  (입보시에코)
  1. 입력데이터 검증 및 표현
      1-1. SQL삽입
      1-2. 경로조작 및 자원삽입
      1-3. 크로스 사이트 스크립트 (XSS) 
      1-4. 운영체제 명령어 삽입
      1-5. 위험한 형식 파일 업로드
      1-6. 신뢰하지 않은 URL주소로 자동 접속 연결

      1-7. XQuery 삽입
      1-8. XPath 삽입
      1-9. LDAP삽입
      1-10 크로스사이트 요청 위조 (CSRF)
      1-11 HTTP 응답 분할
      1-12 정수형 오버플로우
      1-13 보안기능 결정에 사용되는 부적절한 입력값
      1-14 메모리 버퍼 오버플로우
      1-15 포맷 스트링 삽입

  2. 보안기능

  3. 시간 및 상태
  4. 에러처리
  5. 코드오류
  6. 캡슐화
  7. API 오용

이 장에서는 "1.입력데이터 검증 및 표현" 에 대한 점검항목을 설명한다. (두번째)



1-6. 신뢰하지 않은 URL주소로 자동 접속 연결

구분 설명
원인/영향 외부입력값을 외부사이트로 이동할 주소로 사용하는 경우 공격자는 입력값을 조작하여 
피싱 사이트로 유도해서 XSS 공격을 할 수 있다.
대응 ① WhiteList - 자동 연결을 허용할 URL과 도메인을 목록으로 관리한다.
취약) String rd = request.getParameter("rediect");
       response.sendRedirect(rd);    

안전) String allowURL[] = { "/main.do","/login.jsp","list.do" }; <- 허용할 도메인 WhiteList 정의
       String rd = request.getParameter("rediect");
       rd = allowURL[Integer.parseInt(rd)];
       if (rd == 0) {
           response.sendRedirect(rd);
       ]



1-7. XQuery 삽입

구분 설명
원인/영향 외부입력값을 검증없이 XQuery 쿼리문 생성에 이용할 경우 조작된 입력값에 의해 데이터를
무단조회
대응 ① 필터링 - 외부입력값에 대해 특수문자 및 예약어를 필터링한다.
② 파라미터화된 쿼리문 - 정적쿼리로 쿼리문 구성
취약) String name = pros.getProperty("name");
       String es = "doc('user.xml')/userlist/user[ name='" + name + "' ]";

안전) String name = pros.getProperty("name");
       String es = "doc('user.xml')/userlist/user[ name='$xname' ] ";
       expr = conn.prepareExpression(es);
       expr.bindString(new QName("xname") , name , null);
       expr.executeQuery));



1-8. XPath 삽입

구분 설명
원인/영향 외부입력값을 검증없이 XPath 쿼리문 생성에 이용할 경우 조작된 입력값에 의해 데이터를 
무단조회
대응 ① 필터링 - 외부입력값에 대해 특수문자 및 예약어를 필터링한다.
② 파라미터화된 쿼리문을 지원하는 XQuery 표현식을 사용한다
안전) public String XPathFilter (String input) {
           if (input != null) return input.replaceAll("[ ' , \\[ ]" , "");  <-- ' , [  문자 치환
           
     // 외부입력값에 대해 필터를 적용한다.
     String name = XPathFilter(props.getProperty("name"));
     expr = xpath.compile("//user/user[login/text()=' + name + "']/home_dir/text()"); 
      ......



1-9. LDAP삽입

구분 설명
원인/영향 외부입력값을 LDAP필터문에 사용하는 경우 공격자는 입력값을 조작하여 정보를 유출하거나 조작
대응 LDAP필터에 사용되는 외부입력값에는 특수문자가 포함되지 않도록 제거한다.



1-10 크로스사이트 요청 위조 (CSRF)

구분 설명
원인/영향 공격자가 심어놓은 악성코드가 포함된 요청이 검증없이 서버로 전달될 때 희생자의 권한으로
악성코드가 실행되어 게시판자동글쓰기, 자동회원가입, 등의 공격이 수행될 수있다.
대응 ① POST방식 - 폼작성시 GET방식이 아닌 POST방식으로 사용
② CSRF토큰  - 입력화면과 서버사이에 CSRF토큰을 통해 인증
③ 추가/재인증 - 중요기능에 대해서는 추가적인 인증이나 재인증을 요청하는 방식 사용



1-11 HTTP 응답 분할

구분 설명
원인/영향 HTTP요청시 쿠키및 헤더정보에 삽입한 외부입력값이 HTTP응답헤더에 포함되어 사용자에게
다시 전달될 때 개행문자을 이용하여 첫번째 응답을 종료시키고 두번째 응답에 악의적인 
스크립트를 주입해서 XSS공격을 유발
(setHeader, addCookies…등으로 입력한 값은 나중에 응답페이지의 헤더에 포함되어 리턴된다)
대응 ① 개행문자 - 외부입력값을 응답헤더에 포함시킬 경우 개행문자(CRLF)포함시 제거한다.



1-12 정수형 오버플로우

구분 설명
원인/영향 외부입력값을 정수형으로 사용시 정수값이 허용된 범위를 벗어나는 큰 수가 입력되면 실제 
저장되는 값은 음수이거나 아주 큰 수가 되어 반복문제어, 메모리할당 등의 조건으로 사용시 
시스템오류 발생 ,악성코드 실행등의 문제를 유발
대응 ① 범위체크 - 입력값의 범위를 체크



1-13 보안기능 결정에 사용되는 부적절한 입력값 

구분 설명
원인/영향 사용자가 전달하는 쿠키,환경변수,히든필드값을 조작하여 상승된 권한을 획득하거나 
파라미터를 조작해서 금액 같은 중요값 변경가능
대응 ① 중요정보는 서버에 저장하고 보안절차도 서버에서 실행한다.
② 보안결정에 사용되는 값은 외부입력값을 사용하지 않고 내부 세션값을 사용한다.
취약) Cookie[] cookies = request.getCookies();
       Cookie c = cookies[0];
       if (c.getName().equals("role")) {
               userRole = c.getValue();  <-- 쿠키값을 가지고 바로 권한 할당
       }

안전) HttpSessioni session = context.getSession(id);
       String userRole = (String)sesssion.getValue("role");  <-- 세션에 있는 정보로 권한 할당.



1-14 메모리 버퍼 오버플로우

구분 대응
원인/영향 버퍼의 크기보다 큰 값을 버퍼에 저장할 때 버퍼의 경계를 넘어서 저장되면서 다른 메모리영역을
침범하여 리턴주소를 조작하여 임의의 악성코드가 실행되게 할 수 있다.
대응 ① 버퍼의 범위를 벗어나서 접근이 안되도록 할당된 버퍼의 크기내에서 데이터가 사용될수 
   있도록 한다.
② 문자열 저장을 위해 메모리 버퍼를 사용하는 경우 널(NULL)문자로 종료한다



1-15 포맷 스트링 삽입

구분 설명
원인/영향 printf(), fprintf(), sprintf() 와 같은 포맷스트링 출력함수를 사용하는 경우 외부입력값을 
조작을 통해 메모리내용을 읽거나 리턴주소를 조작하여 임의의 악성코드를 실행되게 
할수 있다.
대응 ① 사용자의 입력값을 바로 포맷문자열로 바로 사용하거나 포맷스트링생성에 바로 사용하지 
    않는다.

 

728x90
반응형
LIST
728x90
반응형
SMALL

이번 장에서는 SW개발보안가이드중 분석/설계단계에서 검증해야할 항목중 <입력 데이터 검증 및 표현>
에 관한 10가지 점검항목에 대해서 설명하고자 한다.
SW보안약점진단원 시험에 제일 많이 나오는 범위이기도 하다.


SR1-1. DBMS조회 및 결과 검증

설명 DBMS조회를 위한 질의문 생성시 사용되는 외부입력값과 조회결과에 대한 검증방법(필터링)
을 설계하고 유효하지 않은 값에 대한 처리방법을 설계해야 한다.
취약점 입력된 데이터에 대한 검증을 하지 않을경우 공격자가 입력 폼 및 URL입력란에 SQL문을 삽입
하여 DB로부터 정보를 열람하거나 조작 할 수 있다
내용 ① DB연결수행 시 최소권한의 계정을 사용해야 한다.
   ▶ 침해사고가 발생하더라도 나머지 부분에 대해서 공격자가 접근권한을 가지지 않도록
       하기 위함 (BlindSQL삽입 방지)
② 외부입력값이 삽입되는 SQL문을 동적으로 생성해서 실행하지 말아야한다.
   ▶ 즉 외부입력값에 의해 쿼리구조가 변경되지 않는 정적쿼리구조로 SQL문을 생성
   예) PreparedStatement 구조
        Ibatis, myBatis : #{변수} 사용 
③ 외부입력값으로 어쩔수 없이 동적으로 SQL문 생성해서 사용시 외부입력값에 대한
   검증을 수행한 뒤 사용해야 한다
   ▶ 외부입력값에 쿼리조작문자열 제거등 (특수문자, 예약어, 함수명 등등) 검증작업 수행
         1) 필터를 이용한 입력값 검증
         2) 인터셉터를 이용한 입력값 검증
         3) Library 또는 Validator 컴포넌트를 이용한 입력값 검증
구현단계  SQL삽입



SR1-2. XML조회 및 결과 검증

설명 XML조회를 위한 질의문(Xpath, Xquery) 생성시 사용되는 외부입력값과 조회결과에 대한
검증방법(필터링등)을 설계하고 유효하지 않은 값에 대한 처리방법을 설계해야 한다.
취약점 XML문서를 조회할 경우 입력값 조작을 통해 Xquery나 Xpath와 같은 쿼리문의 구조를
임의로 변경하여 허가되지 않은 데이터를 조회하거나 인증절차를 우회할 수 있다
내용 ① XML쿼리에 사용되는 외부입력값은 쿼리를 조작할수 없도록 필터링해서 사용하거나
② 외부입력값이 쿼리문을 조작할 수 없는 파라미터화된 쿼리문을 제공하는  API(예 Xquery) 
    를 사용한다
구현단계 XQuery 삽입
XQuery 삽입



SR1-3. 디렉터리 서비스 조회 및 결과검증

설명 디렉터리 서비스 조회(예 LDAP) 시 사용되는 입력값과 조회결과에 대한 검증방법(필터링등)
을 설계하고 유효하지 않은 값에 대한 처리방법을 설계해야 한다
취약점 디렉터리 서비스 조회(예 LDAP) 시 사용되는 입력값과 조회결과에 대한 검증방법(필터링등)
을 설계하고 유효하지 않은 값에 대한 처리방법을 설계해야 한다
내용 ① LDAP인증서버를 통해 인증을 구현하는 경우 인증요청을 위해 사용되는 외부입력값은
    LDAP삽입 취약점을 가지지 않도록 필터링 해야한다.
    ▶LDAP인증이 포함되는 기능 설계시, 외부입력값이 LDAP조회를 위한 검색필터생성에
      삽입되어 사용되는 경우 , 특수문자등을 제거하는 등 필터링을 한후 사용될 수 있도록
      시큐어코딩규칙을 정의해야한다
       : LDAP검색필터 - ( ) 안에 있는 검색조건을 말한다.
구현단계 LDAP 삽입



SR1-4. 시스템 자원 접근 및 명령어 수행 입력값 검증

설명 시스템 자원 접근 및 명령어 수행을 위해 사용되는 외부입력값에 대한 유효성검증 방법과
유효하지 않은 값에 대한 처리방법을 설계해야 한다.
취약점 경로조작 및 자원삽입 경로조작및 자원삽입을 통해 공격자가 
허용되지 않은 권한을 획득하여 파일을 
변경하거나 실행할수 있다 
(예) 웹셀 (webshell)
운영체제 명령어 삽입 파라미터를 Filename & ping 192.168.0.1
와 같이 조작해서 전달 -> cmd.exe /c type filename & ping 192.168.0.1 이 실행됨.
내용 <경로조작 및 자원삽입 >
① 외부입력값을 검증,제한없이 이용하여 시스템자원(IP, PORT번호, 프로세스,메모리,파일등) 
   을 식별하는 경우 허가되지 않은 자원이 사용되지 않도록 한다
   ▶ 외부입력값이 프로그램 내부에서 사용하는 리소스를 결정하는데 직접적으로 사용되지 
       않도록 설계한다.  즉 기능설계시 사용해야 하는 리소스목록(White List) 을 정의하여
       지정된 범위 안에서 리소스를 선택하여 사용하도록 해야한다..
   ▶ 사용자의 요청리소스가 특정 디렉토리내의 모든 파일인 경우에는 모든 파일명을 
       목록화하는 것은 어렵다.  이런 경우에는 입력값중 경로조작을 일을킬 수 있는 
       문자(.. / \)를 제거하고 지정된 경로내의 파일만 접근가능하도록 시큐어코딩을 한다. 
   ▶ 시스템자원 접근이력을 로그로 남긴다.
<운영체제 명령어 삽입>
② 서버프로그램 안에서 쉘을 생성하여 명령어를 실행해야하는 경우 외부입력값에 의해 
    악의적인 명령어가 실행되지 않도록 한다.
   ▶ 우선 쉘을 이용해서 명령어가 실행되지 않는 구조를 만들어야 한다.
       그러나 필요한 경우 사용가능한 명령어목록(WhiteList) 을 만들어 이 목록내에 있는  
       명령어만 사용할수 있도록 한다. 
   ▶ 운영체제 명령어 실행이력을 로그로 남긴다.
구현단계 경로조작 및 자원삽입
경로조작 및 자원삽입



SR1-5. 웹서비스 요청 및 결과 검증

  설명 대응방안
1) Reflective XSS 사용자로부터 입력받은 값을 동적으로 생성되는 응답
페이지에 바로 사용하는 경우에 입력값에 악의적인 
스크립트를 포함시켜 실행되게 함으로써 접속자의 
정보유출을 유발할수 있음
XSS필터링
2) Stored XSS 악의적인 스크립트가 저장된 DB조회결과를 동적으로 
응답페이지에 사용하는 경우 스크립트가 수행되어 정보
유출의 공격 유발
HTML인코딩
XSS필터링
대응 Reflective XSS
① 사용자로부터 입력받은 값을 동적으로 생성되는 응답페이지에 
    바로 사용하는 경우 크로스사이트스크립트(XSS)필터링을 수행한 뒤 사용해야 한다.
Stored XSS
① DB조회결과를 동적으로 생성되는 응답페이지에 사용하는 경우 HTML인코딩
  , XSS필터링을 수행한 뒤 사용



SR1-6.  웹기반 중요기능 수행 요청 유효성 검증

CSRF 공격자는 세션탈취, XSS 등을 통해 자신이 의도한 행위 (수정,삭제,등록 등)를 사이트가 
신뢰하는 인증된 사용자의 권한을 통해 실행되게 할 수 있다.
대응 서버로 요청되는 중요기능 요청에 대해서 유효한 요청인지를 검증
  POST방식 
  ② CSFR토큰사용 
  ③ 추가인증 요구 
  ④ 사용자와 상호처리기능(CAPTCHA)



SR1-7. HTTP 프로토콜 유효성 검증

  설명 대응방안
1) HTTP 응답분할 HTTP요청시 쿠키및 헤더정보에 삽입한 외부입력
값이 HTTP응답헤더에 포함되어 사용자에게 다시
전달될 때 개행문자을 이용하여 첫번째 응답을 
종료시키고 두번째 응답에 악의적인 스크립트를 
주입해서 XSS공격을 유발
(setHeader, addCookies…등으로 입력한 값은 
나중에 응답페이지의 헤더에 포함되어 리턴된다)
쿠키나 헤더에 삽입되는
외부입력값은 개행문자
제거필터링 적용
2) 신뢰하지 않은 URL주소로 
    자동접속 연결
외부입력값을 페이지이동(Redirect, Forward)의 
URL주소로 이용하는 경우 외부입력값 조작을 
통해 피싱사이트로 유도할 수있다.
이동이 허용된 WhiteList 
주소 목록을 정의 한후 
이 List와 비교검증
<쿠키보안>
중요정보는 저장안함
 암호화
유효기간(MaxAge, Expired)
secure속성 활성화 (setSecure(true);)
HttpOnly속성 활성화 (SetHttpOnly(True);)
 



SR1-8. 허용된 범위내 메모리 접근

  설명 대응방안
1)메모리 버퍼 오버플로우 Stack이나 Heap에 할당되는 메모리에 문자열등이
저장될 때 최초 정의된 메모리의 크기를 초과하여
문자열을 저장하는 경우 버퍼 오버플로우 발생
 -> Return주소를 조작하여 임의코드를 실행
(경취A)
메모리사용시 경계값검사 
   코딩규칙
취약한 API나 함수 
   사용안도록
 ASLR (리눅스)
  , StackGuard
2)포맷스트링 삽입 외부입력값에 포맷문자열을 삽입하여 공격 외부입력값을 포맷문자열로
바로 사용하지 않는다.



SR1-9.  보안기능동작에 사용되는 입력값 검증

  설명 대응방안
1) 보안기능결정에 사용되는
   부적절한 입력값
사용자가 전달하는 쿠키,환경변수,히든필드값들을
가지고 어떤 보안기능 결정에 사용하는 경우
공격자는 이 값들을 조작하여 상승된 권한을
획득하거나 파라미터를 조작해서 결재금액
변경가능
 ▶ 대응 : 
    ① 사용자의 역할,권한을 결정하는 정보는 
        서버에서 관리한다.
           - 인증,인가,권한에 관련된 중요정보는
             서버측 세션이나 DB에 저장해서 사용하
             도록 설계한다.
    ② 쿠키,환경변수,히든필드값 등 외부입력값이
        보안기능을 수행하는 함수의 인자로 사용되
        는 경우, 입력값에 대한 검증작업을 수행한
        뒤 제한적으로 사용해야 한다. 
    ③ 인증,권한 결정에 사용되는 정보는 쿠키로
        전송되지 않아야 하며불가피하게 전송해야
        하는 경우 암호화해서 전송한다.
보안기능을 수행하는
함수설계시 외부입력값에
의존하지 않게 설계하거나, 필요한 경우에는 검증
을 통해 제한적으로 사용
해야함.
2) 정수형 오버플로우 정수형 변수에 허용된 값보다 큰 값의 입력을 허용
하면 음수가 될수 있어 반복문제어, 메모리할당등에
문제를 유발
정수 최대값 체크
3) Null Pointer 역참조 NULL로 설정된 참조변수에 대해 공격자가 의도
적으로 NULL포인터 역참조를 발생시키는 경우,
그 결과 발생하는 예외 상황을 이용하여 추후
공격에 이용가능
NULL 체크



SR1-10 업로드.다운로드 파일 검증

  설명 대응방안
1)위험한 형식 파일 업로드 서버에서 실행될 수 있는 스크립트파일(asp,jsp,,php등) 이 업로드
가능하고 공격자는 이 파일을 웹을 통해 직접 실행시킬수 있어서
시스테을 제어할 수 있게 된다.
-파일크기, 갯수제한
-파일종류제한
-업로드한 파일은 외부접근불가한
 곳에 저장
-저장경로를 외부에서 알수없게
-업로드한 파일의 실행권한 제거
2)경로조작을 이용한 파일 다운로드 외부입력값에 경로조작을 통해 다른 경로의 파일을 다운받을 수
있는 취약점 유발
요청파일명에 경로문자 필터링
WhiteList 형태로 파일 제공
3)무결성 검사없는 코드 다운로드 외부입력값에 경로조작을 통해 다른 경로의 파일을 다운받을 수
있는 취약점 유발
무결성검사 수행

 

728x90
반응형
LIST

+ Recent posts