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보안약점진단원 준비할려면 열심히 외워야 하는 부분이 더 늘어난 셈이다. ㅠㅠ
이번장에서는 소프트웨어 개발보안 가이드 중 '분석/설계' 단계에서의 진단항목에 대해서
알아보고자 한다. 

분석/설계 단계에서의 개발보안 항목은 크게 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

+ Recent posts