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개발보안가이드중 구현단계에서의 점검항목은 크게 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-1. SQL삽입

구분 설명
원인/영향 DB와 연동하는 웹어플리케이션에서 입력된 데이터를 검증하지 않고 쿼리문의 일부로 사용하는
경우 쿼리문조작을 통해 인증을 우회하거나 다른 DB데이터를 유출,수정,삭제할수 있다.
(거기다가 Stored Procedure 를 호출하여 원격으로 시스템 명령어를 실행시킬 수 있다)
대응 정적쿼리를 사용하여 쿼리문의 구조가 변경되지 않도록 한다.
조작문자열 필터링 - 동적쿼리를 사용시 쿼리문의 구조를 변경할 수 있는 문자열을 필터링
                               한다.
사용자권한을 최소화함으로써 공격을 당하더라도 최소한의 데이터만 유출될수 있도록 한다.

JDBC API 
안전)   PreparedStatement pstmt = con.PrepareStatement(sql);
         pstme.setString (1, getParamenter("gubn"));
MyBatis
취약)  where a.confirm_seq = ${confirmSeq} ;  
안전)  where a.confirm_seq = #{confirmSeq} ;  <-- 정적쿼리
Hibernate
안전)  query = session.createQuery("from Student where studentName = ? ");
        query.setString(0, name)



1-2. 경로조작 및 자원삽입

구분 설명
원인/영향 외부입력값을 시스템자원(IP, Port, 파일..) 의 식별자로 이용하는 경우 공격자는 입력값을 조작하여
①자원에 임의로 접근할 수 있거나, 
②허용되지 않은 권한을 획득하거나, 
③인증을 우회해서 파일등을 열람 할수 있다.
대응 ① WhiteList - 사전에 사용 가능한 자원 목록을 정의하여 제공한다.
② 경조로작문자열 제거 - 입력값에 포함된 경로조작 문자열을 제거한다.

취약) String fileName = request.getParameter("P");
       response.setHeader("Content-Disposition',"attachment;filename=" + fileName + "';");
       fis = new FileInputStream("C:/datas/" + fileName );  <-- 경로문자열 제거 안하고
                                                                                    바로 참조

안전) fileName = fileName.replaceAll("\\","").replaceAll("\","").replaceAll("\\\\",""); <-- 제거
        fis = new FileInputStream("C:/datas/" + fileName );  
취약) String helpFile = args[0];
       br = new BufferedReader(new FileReader(safeDir + helpFile))
       <-- args[0]의 값으로 "../../../windows/system32/drivers/etc/hosts" 와 같이 
             경로조작문자열이 포함된 입력이 들어오는 경우 제한된 경로의 파일에 
             접근할수 있다.

안전) String helpFile = args[0];
       if (helpFile != null) {
            helpFile = helpFile.replaceAll("\\.{2,}[/\\\\]",""};  <- 경로조작가능 문자열 제거
       }
       br = new BufferedReader(new FileReader(safeDir + helpFile))



1-3. 크로스 사이트 스크립트 (XSS)

구분 설명
원인/영향 외부입력값이나 DB에 저장되어 있는 값을 사용하여 동적으로 웹페이지를 생성하는 경우
클라이언트에서 웹페이지에 포함된 악성스크립트가 실행되어 사용자의 중요정보를 
탈취할 수 있다.
  - 쿠키 등 사용자 정보 탈취
  - 쿠키 등 정보 노출로 세션 하이재킹 공격을 당할수 있다
대응 ① 입력값 - (WhiteList) 정규식을 이용하여 허용되는 패턴의 데이터만 입력되도록 한다.
            - (XSS필터링) 서버로 전달되는 요청에 대해 XSS필터를 적용한다.
② 출력값 - (HTML 인코딩) 웹페이지로 출력 시 HTML인코딩을 적용하여 스크립트가 
               동작안되게한다.
            - (XSS필터링) 클라이언트로 전달되는 출력값에 대해 XSS필터를 적용한다. 
취약) <% 
            String customerID = request.getParameter("id") ;
       %>
       <td>요청한 사용자 : <%=customerID%></td>

안전) 서블릿 출력값에 HTML인코딩 적용
        String cleanData = input.replaceAll ("<", "<").replaceAll(">",">");
안전) JSP에서 출력값에 HTML인코딩 적용
        <textarea name="content"><c:out value="$(model.content}"/> </textarea>
안전) JSP에서 출력값에 JSTL Core 출력포맷을 사용하여 텍스트로 처리
안전) 외부 XSS Filter 라이브러리 이용해서 출력값에 필터링 적용
      XssFilter filter = XssFilter.getInstance("lucy-xss-superset.xml");
      out.append(filter.doFilter(data));



1-4. 운영체제 명령어 삽입

항목 설명
원인/영향 외부입력값을 운영체제 명령어 생성의 일부 또는 전부로 사용하는 경우 공격자는 입력값에 
운영체제 명령어를 삽입하여 서버의 실행권한으로 실행되게 함으로써 중요파일이 
삭제되거나 백도어가 실행
대응 ① 기본적으로 운영체제 명령어가 애플리케이션 내부에서 실행되지 않도록 설계한다.
② WhiteList - 운영체제 명령어 실행이 필요하다면 허용 가능한 목록을 정의해서 사용한다.
취약) String cmd = args[0] ;
       ps = Runtime.getRuntime().exec(cmd);  <-- 외부입력값인 args[0] 값을 바로 사용

안전) 해당 애플리케이션에서 실행할 수 있는 프로그램을 노트패드와 계산기로 제한함.
       allowedCommands.add("notepad");
       allowedCommands.add("calc");

       String cmd = args[0]
       if (!allowedCommands.contains(cmd) {    <-- 목록에 있는 명령어만 허용
           System.err.println("허용되지 않는 명령어입니다");
       }
취약) String data = request.getParameter("data");
       if (osName.toLowerCase().startWith(window")) {
            cmd = new String[] {"cmd.exe","/c", data }; 
        }
       Runtime.getRuntime().exec(cmd); <-- 외부입력값을 바로 사용

안전) String[] allowCommand = { "type", "dir"};   <--  허용할 명령어를 사전에 정의함.
       String data = request.getParameter("data);
       int index = TestUtil.getInt(data);    <-- 목록에서 선택한 index가 넘어옴
       if (index == 0 || index == 1) {       <--  목록에 있는 명령어만 허용.
           data = allowCommand[index];
           if (osName.toLowerCase().startWith(window")) {
                cmd = new String[] {"cmd.exe","/c", data };
           }
           Runtime.getRuntime().exec(cmd);
      }
      else {
         System.err.println("허용되지 않는 명령어입니다");
      }         



1-5. 위험한 형식 파일 업로드

구분 설명
원인/영향 첨부파일과 같이 업로드되는 파일의 안전성을 검사하지 않는 경우 공격자는 서버측에서 실행될수
있는 스크립트파일(asp,jsp,php)이나 웹셀(webshell) 을 업로드 해서 이 파일을 통해 시스템 내부
명령어를 실행하거나 외부에서 시스템을제어할 수 있다.
  - 키로그를 설치하여 인증정보를 획득한다던지,
  - 악성코드가 포함된 파일을 업로드하여 사용자의 PC를 감염시킨다.
대응 ① 업로드되는 파일의 크기와 개수를 제한한다.
② 업로드되는 파일의 종류를 WhiteList 로 제한한다.
③ 업로드한 파일은 외부에서 접근할 수 없는 경로에 저장한다.
④ 업로드한 파일의 저장경로와 파일명등을 외부에서는 알수 없도록 한다.
⑤ 업로드한 파일의 실행권한을 제거하고 저장한다.
취약) String fineName = multi.getFilesystemName("filename");
       String sql = " INSERT INTO borad (email, r_num, w_date, pwd, content, filename) " 
                    + values ( ?, 0 , sysdate(), ? , ? , ?) " ;
       PreparedStatement pstmt = con.prepareStatement(sql);   
       pstmt.setString(1, email);
       .....
       pstme.setString(6, fileName);  <-- 정적쿼리로 안전하게 파일명 DB 저장..

        // 파일에 대한 검사없이 바로 서버의 폴더에 저장
       Thumnail.create(savepath + "/" + fileName, savepath + "/" + fileName, 150);
안전) String fineName = multi.getFilesystemName("filename");
       if (fileName != null) {
           // 확장자 가져옴.
           String fileExt = fileName.substring(fileNam.lastIndexof(".") + 1).toLowerCase();
           if (!"gif".equals(fileExt) && !"jpg".equals(fileExt) && !"png".equals(fileExt)) {
               alermessage("업로드가 불가능한 파일입니다");   <-- 허용된 확장자인지 체크
               return;
           }

      String sql = " INSERT INTO borad (email, r_num, w_date, pwd, content, filename) " 
                    + values ( ?, 0 , sysdate(), ? , ? , ?) " ;
       '''''' 중간생략 ''''''
       // 파일에 대한 검사를 한후 서버의 폴더에 저장
       Thumnail.create(savepath + "/" + fileName, savepath + "/" + fileName, 150);
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
728x90
반응형
SMALL

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


SR2-1. 인증 대상 및 방식

항목 설명
1) 인증후 사용 중요기능이나 리소스에 대해서는 인증 후 사용 정책이 적용되어야 한다.
- 중요기능 식별하고 식별된 중요기능에 대해서 일괄적으로 인증을 처리하는
  시스템을 설계   ① 컴포넌트 ② 라이브러리 ③ Servlet Filter
2) 안전한 인증방식
   (일회용패스워드)
 안전한 인증방식을 사용하여 인증우회나 권한상승이 발생하지 않도록한다.
     <일회용 패스워드>
   - 일회용 패스워드는 시각정보, 이벤트정보, 질의응답방식으로 취득한 정보를 이용
     하여 생성할 수 있다
   - 일회용 패스워드는 시간적 제한을 설정해야 한다. (금융권 30~60초)
   - 일회용 패스워드는 중복및 유추가 불가능하도록 6자리 이상이 숫자 및 문자로
     구성한다.
   - OTP발생기와 인증서버에서 동일한 정보를 생성해야 한다.
3) 2 Factor 인증 중요기능에 대해서는 2단계 인증을 고려한다.
   - Type1 : 지식기반  Type2 : 소유기반  Type3:생체기반
   - 로깅기능 마련
구현단계 적절한 인증기능이 없는 중요기능 허용
DNS Lookup에 의존한 보안결정


SR2-2. 인증 수행 제한

항목 설명
1)인증시도 횟수 제한 인증시도횟수 제한하고, 초과된 시도에 대해서는 인증제한 정책 적용
  - 5회 이내로 제한
  - 자동입력방지 문자 
2)실패한 인증시도 로깅 실패한 인증시도에 대해서는 로그를 남겨서 추적할수 있게 한다.
구현단계 반복된 인증시도 제한 기능 부재



SR2-3. 비밀번호 관리

항목 설명
1)패스워드 설정규칙 <안전하지 않은 패스워드>
 - 한글,영어 등을 포함한 사전적인 단어로 구성된 패스워드
 - 스펠링을 거꾸로 한 패스워드
 - 널리 알려진 단어로 구성된 패스워드 (컴퓨터용어 사이트,기업 등의
                                            특정명칭으로 구성된 패스워드)
 - 사용자ID를 이용한 패스워드
 - 제3자가 쉽게 알수 있는 개인정보를 바탕으로 구성된 패스워드
   (가족생일, 주소,휴대폰번호 등)
 - 패턴이 존재하는 패스워드
    (동일한 문자의 반복, 키보드상에 연속한 위치에 존재하는
    문자들의 집합)
 - 숫자가 제일 앞이나 제일 뒤에 오는 구성의 패스워드 (security1, may12)
 - 숫자와 영문자를 비슷한 문자로 치환한 형태를 포함한 구성의 패스워드
    (영문자 O 을 숫사 0 으로 , 영문자 I 를 숫자 1 로 치환)
 - 특정 인물의 이름을 포함한 패스워드
    (사용자, 유명인 연예인등)
 - 한글발음을 영문으로, 영문단어의 발음을 한글로 변형한 형태의 패스워드
 - 시스템에서 예시로 제시되는 패스워드
 - 시스템에서 초기로 설정된 패스워드
 - 이전에 사용했던 패스워
2) 패스워드 암호화,통신채널  - 암호화하거나 암호화된 전송채널 이용 (TLS , VPN)
   TLS_RSA_WITH_AES_256_CBC_SHA …
3) salt가 적용된 해쉬함수  - SHA-2 이상   (SHA-1, MD5 등은 안전하지 않음)
 - 솔트값은 랜덤하게 생성
 - 솔트값은 암호키가 저장되는 장소에 저장
4) 패스워드 재설정, 변경 규칙  - 기존 패스워드 확인
5) 패스워드 관리규칙  - 변경주기
 - 만료기간 설정, 최소사용기간 설정
 - 성공한 로그인 시간 관리 (사용자에게 알림으로써 도용여부 확인)
구현단계 하드코드된 비밀번호
취약한 비밀번호 허용



SR2-4. 중요자원 접근통제

항목 설명
1) 중요자원에 대한 접근통제  - 중요자원에 대한 접근권한을 최소한으로 설정한다.
 - ACL이나 RBAC를 적용
2) 중요기능에 대한 접근통제  - 접근권한은 최소한으로
 - RBAC를 적용
 - 개별적용을 하는 경우 코딩규칙이 개발가이드에 반영되었는지..
3) 관리자 페이지  접근통제  - URL은 쉽게 추측할 수 없도록 설정한다. 
       -> 도메인 대신 IP를 통해서 접속하도록)
 - 원격연결시 암호화 통신채널 사용
 - 외부망에 있는 경우 
           ① IP통제, ② 80이 아닌 별도포트 사용, ③ SSL적용, ④ 추가인증
 - 내부망에 있는 경우 
           ① 80이 아닌 별도포트 사용, ② SSL적용 권고
구현단계 부적절한 인가
중요한 자원에 대한 잘못된 권한 설정



SR2-5. 암호키 관리

항목 설명
1) 암호키 관리규칙  - DB데이터 암호화에 사용되는 암호키는 DB와는 물리적으로 분리된 
   장소에 별도보관
 - 패스워드나 암호키는 메모리에 저장하지 않으며 설사 저장했더라도 
   사용종료 후 즉시 메모리를 0 으로 초기화한다
 - 암호키 생성 및 변경시 암호키에 대한 백업기능을 구현한다.

< FIPS 140-2 레벨분류 >
  ① Level1 - 암호모듈에 대한 기본적인 보안요구사항만을 충족하여
                 최소한의 보안
  ② Level2 - 침입자의 불법적인 접근을 방지하고 침입이후에 변조를
                 나타내는 증거를 제공함으로써 물리적인 보안매커니즘을
                 제공
  ③ Level3 - 강력한 변조 탐지 및 대응의 일환으로 침입을 감지하면
                 저장된 키 삭제
  ④ Level4 - 암호모듈의 외부의 전압이나 온도등을 감지하여 슈퍼쿨링
                 등 환경의 이상변화 시, 암호키를 삭제한다.
2) 설정파일內 중요정보 암호화  - 설정파일내 중요정보 (DB계정정보, 시스템중요정보) 가 암호화해서
   저장
구현단계 하드코드된 비밀번호
주석문안에 포함된 시스템 주요 정보

*** 암호키 종류별 유효기간 ***

키종류 사용유효기간
송신자 사용기간 수신자 사용기간
대칭키 비밀키 최대 2년 최대 5년
공개키 암호화 공개키 최대 2년
  복호화 개인키 최대 2년
  검증용 공객키 최소 3년
  서명용 개인키 최대 3년

 

SR2-6.  암호연산 (알고리즘 / 키길이 / 해쉬알고리즘+salt /난수)

항목 설명
1) 안전한 암호 알고리즘 <대칭키>
 - 안전 : AES, SEED, ARIA,  3DES, Blowfish, KASUMI
 - 취약 : DES, RC5, MD5…
<공개키>
 - 안전 : RSA, ECC, ECDSA, KCDSA
2) 안전한 암호키 길이  - 대칭키 : 128 bit 이상
 - 공개키 : 2048 bit 이상
 - 타원곡선 : 256 bit 이상
3) 안전한 해쉬알고리즘+Salt  - SHA-2 이상 (SHA-224, 256, 384, 512)
4) 안전한 난수생성 알고리즘  - FIPS 140-2 인증을 받은 암호모듈의 난수생성기와 256 비트 이상의 
   Seed를 사용하여 난수를 생성한다.
 - 난수의 무작위성을 보장하기 위해 이전 난수생성 단계의 결과를 다음 
   난수생성 단계의 Seed로 사용하는 의사난수생성기를 이용한다.
 java.math.Random() - 취약
   java.util.Random() , java.security.SecureRandom() - 안전
구현단계 취약한 암호화 알고리즘 사용
충분하지 않은 키 길이 사용
솔트없이 일방향 해쉬함수 사용
적절하지 않은 난수값 사용



SR2-7. 중요정보 저장

항목 설명
1) 중요정보 암호화 저장  - 중요정보 또는 개인정보는 암호화 해서 저장한다.
   (사용자 하드디스크에 저장된 쿠키를 통한 정보노출)
 - 특히, 쿠키, HTML5로컬저장소와 같은 클라이언트 즉 하드드라이브에 중요
   정보가 저장되지 않도록 한다., 부득히 저장 시 암호화해서 저장
2) 메모리에 중요정보 제거  - 중요정보가 메모리에 남지않도록..

<입력폼 자동완성 비활성화>
<input type=text name=id  autocomplete=off>
  -> 이 기능이 활성화되면 캐싱되기 때문..
구현단계 중요정보 평문 저장
사용자 하드디스크에 저장되는 쿠키를 통한 정보노출



SR2-8. 중요정보 전송

항목 설명
1) 중요정보 암호화 전송  - 인증정보와 같이 민감한 정보는
     ①암호화해서 전송하거나
     ②암호화된 통신채널로 전송
2) 쿠키의 중요정보 암호화 전송 - 쿠키에는 중요정보가 포함되지 않도록 설계하며, 부득이 쿠키에 중요정보가
   포함된 경우에는 반드시 세션쿠키로 설정히야 하며, 전달되는 중요정보는
   암호화해서 전송해야 한다.
   

 

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

예전에는 구현단계 즉 최종 개발완료된 산출물에 대해서 시큐어코딩의 적용여부를 검사했지만
지금은 분석/설계단계부터 개발보안 가이드를 기준으로 시큐어코딩의 적용여부를 체크하도록
되어 있다.
SW보안약점진단원 준비할려면 열심히 외워야 하는 부분이 더 늘어난 셈이다. ㅠㅠ
이번장에서는 소프트웨어 개발보안 가이드 중 '분석/설계' 단계에서의 진단항목에 대해서
알아보고자 한다. 

분석/설계 단계에서의 개발보안 항목은 크게 4가지로 분류를 한다.

SR1. 입력데이터 검증 및 표현 사용자가 입력하는 값에 대한 유효성체크를 주로 다룬다. 
SR2. 보안기능 중요정보에 대한 인증,전송,접근통제,저장 등을 주로 체크한다.
SR3. 에러처리 에러메시지에 대한 과도한 정보노출 등에 대해서 다룬다.
SR4. 세션통제 세션에 대한 해킹 방지를 위한 설계가 되어 있는지 확인한다.



각 세션별로 점검항목이 무엇이 있는지 간략하게 설명하면 다음과 같다

SR1. 입력데이터 검증 및 표현

번호 항목명 설명 비고
SR1-1 DBMS 조회 및 결과 검증 DBMS 조회를 위한 질의문(SQL) 생성시 사용되는 입력값
과 조회결과에 대한 검증방법 (예, 필터링) 설계 및 유효
하지 않은 값에 대한 처리방법설계
입.출력값
검증
SR1-2 XML 조회 및 결과 검증 XML조회를 위한 질의문 (XPath, XQuery) 생성 시 사용
되는 입력값과 조회결과값에 대한 검증방법 설계 및
유효하지 않은 값에 대한 처리 방법 설계
SR1-3 디렉터리 서비스 조회 및
결과 검증
디렉터리 서비스 조회 (LDAP) 시 사용되는 입력값과
조회결과에 대한 검증방법 설계 및  유효하지 않은 값에
대한 처리 방법
설계
SR1-4 시스템 자원 접근 및
명령어 수행 입력값 검증
시스템 자원 접근 및 명령어 수행을 위해 사용되는 입력값
에 대한 유효성 검증방법과  유효하지 않은 값에 대한
처리 방법
설계
SR1-5 웹서비스 요청결과 및
검증
웹서비스(게시판 등) 요청 (스크립트 게시) 과 응답결과
(스크립트 포함 웹페이지 등) 에 대한 검증방법과 적절하지
않은 데이터에 대한 처리방법 설계
SR1-6 웹기반 중요기능
수행요청 유효성 검증
사용자 권한 확인(인증 등) 이 필요한 중요기능 (결제)
에 대한 웹서비스 요청에 대한 유효성 검증방법과  유효
하지 않은 값에 대한 처리 방법
설계
SR1-7 HTTP 프로토콜 유효성
검증
비정상적인 HTTP 헤더, 자동연결 URL링크 등 사용자가
원하지 않는 결과를 생성할 수 있는 HTTP헤더 및 응답
결과에 대한 유효성 검증방법과  유효하지 않은 값에
대한 처리 방법
설계
SR1-8 허용된 범위내 메모리 
접근
허용된 범위의 메모리 버퍼에만 접근하여 저장 또는
읽기가 수행되어 버퍼오버플로우가 발생하지 않도록
처리방법 설계
SR1-9 보안기능 동작에 사용되는
입력값 검증
보안기능 (인증,인가,권한부여 등) 등 프로그램 동작을
위해 사용되는 입력값과 함수 (또는 메소드) 의 외부입력값
및 수행결과에 대한 처리 방법 설계
SR1-10 업로드.다운로드 파일
검증
업로드.다운로드 파일의 무결성,실행권한 등에 관한 유효
성 검사 방법을 설계하고, 검사 실패시 대응방안 설계
파일관리



SR2. 보안기능

번호 항목 설명  비고
SR2-1 인증 대상 및 방식 중요정보.기능과 인증방식을 정의
정의된 중요정보 접근 및 중요기능 수행허용을 위해
인증기능이 우회되지 않고 수행될 수 있도록 설계
인증관리
SR2-2 인증 수행 제한 인증 반복시도 제한 및 인증실패 등에 대한 인증제한
기능 설계
SR2-3 비밀번호 관리 안전한 비밀번호 조합규칙 
  - 비밀번호 길이
  - 허용문자 조합 등
을 설정하고 주기적으로 변경하도록 설계 
(하드코딩 금지)
SR2-4 중요자원 접근통제 중요자원 (프로그램 설정, 민감한 사용자 데이터 등) 을 
정의하고 정의된 중요자원에 대한 접근통제하는 신뢰할수
있는 방법 및 접근통제 실패시 대응방안 설계
권한관리
SR2-5 암호키 관리 암호키 생성,분배,접근,파기 등 안전하게 암호키 생명주기
를 관리할 수 있는 방법 설계
암호화
SR2-6 암호연산 국제표준 또는 검증필 프로토콜로 등재된 안전한 암호
알고리즘을 선정하여 충분한 암호키 길이, 솔트, 충분한
난수값을 기반으로 암호연산 수행방법 설계
SR2-7 중요정보 저장 중요정보 (비밀번호, 개인정보 등) 저장시 안전한 저장
및 관리방법 설계
중요정보
처리
SR2-8 중요정보 전송 중요정보 (비밀번호, 개인정보 등) 전송시 안전한 전송
방법 설계



SR3. 에러처리

번호 항목명 설명 비고
SR3-1 외처리 오류메시지에 중요정보 (개인정보, 시스템정보, 민감정보)
가 포함되어 출력되거나, 에러 및 오류가 부적절하게 처리
되어 의도치 않은 상황이 발생하는 것을 막기 위한
안전한 방안 설계
 


SR4. 세션통제

번호 항목명 설명 비고
SR4-1 세션통제 - 다른 세션간 데이터 공유금지
- 세션ID 노출금지
- (재)로그인시 세션ID 변경
- 세션종료 (비활성화, 유효기간 등) 처리
등 세션을 안전하게 관리할 수 있는 방안 설계
 


위에서 설명한 "분석/설계" 단계에서의 개발보안 항목은 결국 "구현"단계에서의 개발보안  항목과
연결이 되어 질수 밖에 없다.
구현단계에 대해서는 다음 편에서 소개를 하고 여기서는 간단하게 두 단계간의 매핑구조만 설명한다.

구분 분석/설계 항목 구현단계 보안약점
입력 데이터
검증 및 표현
DBMS 조회 및 결과 검증 SQL 삽입
XML 조회 및 결과 검증 XQuery 삽입
XPath 삽입
디렉터리 서비스 조회 및
결과 검증
LDAP 삽입
시스템 자원 접근 및
명령어 수행 입력값 검증
경로조작 및 자원삽입
운영체제 명령어 삽입
웹서비스 요청결과 및
검증
크로스사이트 스크립트 (XSS)
웹기반 중요기능
수행요청 유효성 검증
크로스사이트 요청위조
HTTP 프로토콜 유효성
검증
신뢰되지 않은 URL 주소로 자동접속 연결
HTTP 응답분할
허용된 범위내 메모리 
접근
포맷스트링삽입, 메모리 버퍼 오버플로우
보안기능 동작에 사용되는
입력값 검증
보안기능 결정에 사용되는 부적절한 입력값
정수형 오버플로우
Null Pointer 역참조
업로드.다운로드 파일
검증
위험한 형식 파일 업로드
무결성 검사 없는 코드 다운로드
보안기능 인증 대상 및 방식 적절한 인증 없는 중요기능 허용
DNS Lookup 에 의존한 보안 결정
인증 수행 제한 반복된 인증시도 제한 기능 부재
비밀번호 관리 하드코드된 비밀번호
취약한 비밀번호 허용
중요자원 접근통제 부적절한 인가
중요한 자원에 대한 잘못된 권한 설정
암호키 관리 하드코드 된 암호화
키 주석문 안에 포함된 시스템 주요 정보
암호연산 취약한 암호 알고리즘 사용
충분하지 않은 키 길이 사용
적절하지 않은 난수값 사용
솔트 없이 일방향 해시함수 사용
중요정보 저장 중요정보 평문저장
하용자 하드디스크에 저장되는 쿠키를 통한 정보노출
중요정보 전송 중요정보 평문전송
에러처리 예외처리  오류메시지를 통한 정보노출
시스템 데이터 정보노출
세션통제 세션통제  잘못된 세션에 의한 데이터 정보 노출




[출처 : 전자정부 SW개발.운영자를 위한 소프트웨어 개발보안 가이드]
[출처 : 2018년도 SW보안약번점진단원 교육 자료]

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

소프트웨어 보안취약점
 - 보안요구사항이 정의되지 않았거나
 - 논리적인 오류를 가지는 설계를 수행했거나
 - 기술취약점을 가지는 코딩규칙을 적용하였거나
 - 소프트웨어 배치가 절절하지 않았거나
 - 발견된 취약점에 대해 적절한 관리 또는 패치를 하지 않은 경우
발견된다.

소프트웨어 개발방법론

구조적 방법론  - 프로세스 중심의 개발방법론
 - 모듈의 분할과 정복에 의한 하향식 설계(Top-Down)
 - SDLC구조의 폭포수 모델이 기본
 - 산출물 : DFD
객체지향 방법론  - 반복적이고 점증적인 개발방식
 - 재사용성강조
 - 분산객체기술의 완벽한 지원
 - Bottom-Up
 - 유즈케이스 다이어그램, 시퀀스 다이어그램…
CDB 방법론  - 컴포넌트 기반 개발
 - 반복 점진적 개발 프로세스
 - 표준화된 산출물
 - 재사용성 향상
 - Bottom-up



소프트웨어 개발보안 적용 사례

사례 설명
MS-SDL  MS - Secure Development Lifecycle
Seven TouchPoints  - 소프트웨어 보안의 모범사례를 소프트웨어 개발 라이트사이클에 통합
 - 공통 위험요소를 파악하고 이해하며, 보안을 설계하고 모든 소프트웨어 
   산출물에 대해 철저하고 객관적인 위험분석 및 테스트를 거쳐 안전하 
   소프트웨어를 만드는 방법을 정의
 - 7개의 보안강화활동
CLASP Comprehensive, Lightweight Application Security Process
 - SDLC 초기단계에 보안강화를 목적으로 하는 정형화된 프로세스로서
 - 활동중심, 역할기반의 프로세스로 구성된 집합체이다.
 - 운영중인 시스템에 적용하기 좋다.
    ① 개념관점
    ② 역할기반 관점
    ③ 활동평가 관점
    ④ 활동구현 관점
    ⑤ 취약성 관점


소프트웨어 보안약점 진단방법론

정적분석 화이트박스
소스코드의 구조,구문의미 리뷰
소스코드의 보안약점을 점검하여 완성된 SW의 발생가능한 잠재적인 취약점을 
예방하는 점검
동적분석 블랙박스
실행파일, 결과, 성능,안정성 -> 디버깅, 부하테스트, 모의해킹
실행과정에서의 다양한 입출력데이터의 변화및 사용자 상호작용에 따른 변화를 
점검하는 방법으로 입출력에 대한 다양한 취약점을 점검



정탐/오탐

소스코드 진단도구 결과유형
Error Error 정탐
Error 정상 미탐
정상 Error 오탐



SW개발보안 기준 및 절차

구분 내용 비고
대상 정보시스템 감리대상 정보화사업  
범위 설계단계 산출물
소스코드
(신규는 전체, 유지보수는 변경된 부분만)
상용SW는 대상 아님
기준 감리법인이 진단도구 사용 시 국정원장이 인증한
도구 사용
진단기준
기타 - 감리법인은 SW보안약점 진단 시 진단원을 우선적으로 
  배치
- 감리대상 외 사업은 자체적으로 SW보안약점 진단
  ,제거결과 확인
 



보안항목 식별

정보에 대한
보안항목 식별
가. 외부환경분석을 통한 보안항목 식별
     - 개인정보보호 관련 법규 - 개인정보보호법, 정통망법,…
     - 특정IT기술관련 법규 - RFID프라이버시 보호가이드라인, 위치정보의 보호및 활용…
  나. 기타 중요정보 식별
     - 1등급 : 고유식별정보, 민감정보, 인증정보, 신용정보, 의료정보, 위치정보
     - 2등급 : 이름,주소,전화번호,핸드폰번호,이메일주소,생년월일,성별
                 학력, 직업, 키, 몸무게, 결혼여부,취미
     - 3등급 : IP정보, MAC주소, 사이트방문기록, 쿠키
                 가입자성향, 통계성정보
                 사번, 회원번호 등
기능에 대한
보안항목 식별
요구사항정의서에 보안요구사항을 정의하여 설계,구현,테스트 단계에서 적용될 수 
있도록한다



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

해시값(Hash Value) 의 정의와 특징

해시값(Hash Value)이란 임의의 데이터를 해시함수에 입력해서 결과로 출력되는 값으로
다음과 같이 대표적인 성질을 가지고 있다.
   1. 고정길이 - 입력한 데이터이 길이와 상관없이 항상 고정된 길이의 해시값이 출력됨.
   2. 단방향성 - 출력된 해시값을 가지고 역으로 입력값을 알수는 없다.

초기 해시값은 주로 고정길이 특징을 이용해서 신속한 검색을 위한 키값으로 사용되었다가
요즘에는 단방향성 특징을 이용한 암호나 인증분야에서 암호화나 무결성 보장의 기능으로
사용되어지고 있다.



해시함수 (Hash Function)  의 종류 및 용도



해시함수 종류 및 용도

함수
구분
설명 종류 용도
Index 
해시함수
신속한 데이터 검색을 위해 키 값에서 
레코드가 저장되어 있는 주소를 직접계산 및 바로 접근이 가능하게 하는 해시 함수
제산함수 나머지 연산자 이용하여 주소값 산출 용도
중간제곱함수 키 값의 중간자리 제곱 후 상대번지 산출용도
폴딩함수 키 값을 주소와 같은 자릿수를 갖는 몇 개
부분으로 나누어 이 부분을 접어서 주소값
산출 용도
기수변환 키 값을 특정 진법에서 다른 진법으로 변환
한 값을 이용하여 Key로 활용
무결성
해시함수
암호학적
해시함수
해시값을 가지고 입력값을
알아내기 어렵다는 점을
이용하여 암호학적 원리기반
단반향성,복호 불가 기능을 이용
MD5

128비트 출력의 해시함수
무결성 확인용

SHA MD5는 보안상 취약하기 때문
에 최소한 SHA-256 이상의
알고리즘을 권장함
MAC Key를 추가적으로  Hash하여
메시지 기반 인증 용도
비암호적
해시함수
동일한 해시값을 갖는 서로
다른 입력값은 존재하지 않
는다는 해시함수의 성질을
이용하여 입력값에 대한
무결성 검증용
CRC 비트 단위 오류 검출용
Checksum 데이터 블록 내용을 전부 
더한 값, 무결성 및 오류검출





728x90
반응형
LIST

+ Recent posts