솜은 코튼

[정보처리기사] 9장 소프트웨어 개발 보안 구축 본문

자격증/정보처리기사

[정보처리기사] 9장 소프트웨어 개발 보안 구축

솜.코 2020. 7. 18. 19:24
01. 소프트웨어 개발의 비용 산정 기법

     하향식 비용 산정 기법 : 과거의 유사한 경험을 바탕으로 비용 산정

     (정적 테스트 : 프로그램 실행 X, 명세서나 소스코드 대상 분석 / 동적 테스트 : 프로그램 실행 O, 모든 단계)

     

     상향식 비용 산정 기법 : 세부적인 작업 단위별로 비용 산정 후 집계

     (LOC기법 / 개발 단계별 인월수 : LOC기법 보완)

 

02. 서비스 거부 공격

     : 표적이 되는 서버의 정상적인 기능 방해

 

     서비스 거부 공격의 유형

     - Ping of Death(죽음의 핑) : 패킷의 크기를 허용 범위 이상으로 전송하여 네트워크 마비시킴

     - Smurfing(스머핑) : 엄청난 양의 데이터를 한 사이트에 집중적으로 보냄

     - SYN Flooding : 3-way-handshake 과정 의도적으로 중단시켜 대기 상태에 놓임

     - TearDrop : Offset값 변경시켜 패킷 재조립 시 오류로 인한 과부하 발생

     - Land : 공격 대상은 송신 IP 주소가 자신이므로 자신에 대해 무한히 응답

     - DDoS : 분산 서비스 공격용 툴을 설치파여 에이전트로 만든 후 DDos 공격에 이용

 

03. 네트워크 침해 공격 관련 용어

     스미싱 : 경품 안내 등 문자 메시지를 이용해 개인 정보 빼내는 수법

     스피어 피싱 : 위장한 메일을 지속적으로 발송하여 클릭 유도해 개인 정보 탈취

     APT : 기업이나 조직 네트워크에 침투해 보안을 무력화시키고 정부를 수집한 후 빼돌림

     무작위 대입 공격 : 암호화된 문서의 암호키를 찾기 위해 적용 가능한 모든 값 대입

     큐싱 : QR코드를 통해 악성 앱의 다운로드를 유도하거나 악성 프로그램 설치하도록 하는 금융사기 기법

     SQL 삽입 공격 : 취약한 사이트가 발견되면 데이터를 조작하는 공격 방식

 

04. 소프트웨어 개발 보안

     : 데이터의 기밀성, 무결성, 가용성 유지

     관련기관 : 행정안전부(보안 정책 총괄) / 한국인터넷진흥원(보안 정책 및 가이드 개발) /

                   발주기관(보안의 계획 수립) / 사업자(기술 수준 및 계획 명시) / 감리법인(감리 계획 수립 및 협의)

 

05. 소프트웨어 개발 보안 활동 관련 법령

     : 개인정보 보호법 / 정보통신망 이용촉진 및 정보보호 등에 관한 법률 / 신용정보의 이용 및 보호에 관한 법률 / 

       위치정보의 보호 및 이용 등에 관한 법률 / 표준 개인정보 보호 지침 / 개인정보의 안전성 확보 조치 기준 / 

       개인정보 영향평가에 관한 고시

 

06. Secure SDLC

     : 보안상 안전한 소프트웨어를 개발하기 위해 SDLC에 보안 강화를 위한 프로세스 포함

     (많은 비용 최적화 /

     요구사항 분석, 설계, 구현, 테스트, 유지보수 등 SDLC 전체 단계에 걸쳐 수행되어야 할 보안활동 제시)

     

     요구사항 분석단계에서의 보안 활동 : 요구사항 식별

     (보안 요소 : 기밀성 / 무결성 / 가용성 / 인증 / 부인방지)

 

     설계 닽계에서의 보안 활동 : 설계서에 반영하고 보안 설계서 작성

   

     구현 단계에서의 보안 활동 : 설계서에 따라 보안 요구사항 구현

     (시큐어 코딩 : 보안 취약점 최소화하기 위해 보안요소 고려하여 코딩)

    

     테스트 단계에서의 보안 활동 : 보안 설계써 바탕으로 보안 사항들이 정확히 반영되고 동작되는지 점검

     (정적 분석 도구 / 동적 분석 도구 / 모의 침투 테스트 통해 해결여부 검증)

 

     유지보수 단계에서의 보안 활동 : 이전 과정을 모두 수행하였음에도 발생할 수 있는 보안 사고 식별

 

07. 보안 요소

     : 기밀성, 무결성, 가용성 그 외 인증, 부인 방지 등

    

     기밀성 : 인가된 사용자만 접근 허용

     무결성 : 인가된 사용자만 수정 가능

     가용성 : 인가받은 사용자는 언제든 사용 가능

     인증 : 정보와 자원을 사용하려는 사용자가 합법적인 사용자인지 확인

     부인 방지 : 송·수신 증거 제공

 

08. 세션 통제

     : 세션->서버와 클라이언트의 연결 / 세션 통제->연결로 인한 발생 정보 관리(요구사항 분석 및 설계 단계)

     

     세션 통제의 보안 약점

     - 불충분한 세션 관리 : 일정한 규칙이 존재하는 세션 ID가 발급되거나 타임아웃이 너무 길게 설정

     * 세션 하이재킹 : 세션 정보 가로채는 공격 기법(=세션 가로채기)

 

     - 잘못된 세션에 의한 정보 노출 : 다중 스레드 환경에서 멤버변수에 정보를 저장할 때 발생

     (멤버 변수보다 지역 변수를 활용하여 변수의 범위를 제한)

     * 레이스 컨디션 : 두 개 이상의 프로세스가 공용 자원을 획득하기 위해 경쟁하고 있는 상태

 

    세션 설계 시 고려 사항

    - 모든 페이지에서 로그아웃이 가능하도록 UI 구성

    - 로그아웃 요청 시 할당된 세션이 완전히 제거되도록 한다.

    - 세션 타임 아웃은 중요도가 높으면 2~5분, 낮으면 15~30분 설정

    - 이전 세션이 종료되지 않으면 새 세션이 생성되지 못하도록 설계

    - 패스워드 변경 시 활성화 된 세션 삭제하고 재할당

 

    세션 ID의 관리 방법

    - 안전한 서버에서 최소 128비트의 길이로 생성

    - 예측이 불가능하도록 안전한 난수 알고리즘 적용

    - 노출되지 않도록 URL Rewrite 기능을 사용하지 않는 방향으로 설계

    - 로그인 시 로그인 전 세션 ID 삭제 후 재할당

    - 장기간 접속하고 있는 세션 ID는 주기적으로 재할당되도록 설계

    * URL Rewrite : 쿠키를 사용할 수 없는 환경에서 세션 ID를 전달하기 위해 URL에 세션 ID 포함

 

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

     : 입력 데이터로 인해 발생하는 문제들을 예방하기 위해 구현단계에서 검증해야 하는 보안 점검 항목들

     

     갖춰야 할 유효 검증 체계(구현 단계)

     - 검증되지 않은 데이터 입력 시 처리할 수 있도록 구현

     - 입력 데이터를 처리하는 객체에 지정된 자료형이 맞는지 확인

     - 일관된 언어셋을 사용하도록 코딩

     

     SQL 삽입 : 입력란에 SQL 삽입하여 무단으로 DB 조회하거나 조작

       (동적쿼리에 사용되는 입력 데이터에 예약어 및 특수문자가 입력되지 않게 필터링 되도록 설정)

 

     경로 조작 및 자원 삽입 : 데이터 입출력 경로 조작하여 서버 자원을 수정, 삭제할 수 있는 보안 약점

       (사용자가 입력값을 식별자로 사용하는 경우, 경로 순회 공격을 막는 필터 사용하여 방지)

 

     크로스사이트 스크립팅(XSS) : 악의적인 스크립트 삽입하여 정보 탈취 및 비정상적 기능 수행 유발

       (HTML 태그 사용 제한하거나 스크립트에 삽입되지 않도록 '<', '>', '&' 등의 문자를 다른 문자로 치환)

 

     운영체제 명령어 삽입 : 외부 입력값을 통해 시스템의 명령어의 실행을 유도함으로써 권한 탈취, 시스템 장애 유발

       (웹 인터페이스를 통해 시스템 명령어가 전달되지 않도록, 외부 입력 값을 검증없이 내부 명령어로 사용하지 않음)

 

     위험한 형식 파일 업로드 : 악의적인 명령어가 포함된 스크립트 파일을 업로드함으로써 시스템 손상을 주거나 제어

       (업로드 되는 파일의 확장자 제한, 파일명의 암호화, 웹 사이트와 파일 서버의 경로 분리, 실행 속성 제거)

 

     신뢰되지 않는 URL 주소로 자동 접속 연결 : 입력값으로 사이트 주소를 받는 경우 조작하여 피싱 사이트로 유도

       (연결되는 외부 사이트의 주소를 화이트 리스트로 관리)

 

10. 보안 기능

     : 인증, 접근 제어, 기밀성, 암호화 등을 올바르게 구현하기 위한 보안 점검 항목들

   

     적절한 인증없이 중요 기능 허용 : 보안검사를 우회하여 인증과정 없이 정보 또는 기능 접근 및 변경 가능

       (재인증 기능 수행하도록 하여 방지)

 

     부적절한 인가 : 접근 제어 기능이 없는 실행 경로를 통해 탈취

       (모든 경로에 대해 검사, 필요한 권한만 부여)

 

     중요한 자원에 대한 잘못된 권한 설정 : 권한 설정이 잘못된 자원에 접근하여 해당 자원을 임의로 사용

       (인가되지 않은 사용자의 중요 자원에 대한 접근 여부를 검사)

 

     취약한 암호화 알고리즘 사용 : 암호화된 파일 해독하여 중요정보 탈취

       (안전한 암호화 알고리즘이나 안전성을 확인한 암호모듈 이용)

 

     중요 정보 평문 저장 및 전송 : 평문 데이터 탈취하여 중요한 정보 획득

       (중요한 정보를 저장하거나 전송할 때는 반드시 암호화 과정 거침, HTTPS 또는 SSL 보안 채널 이용)

 

     하드코드된 비밀번호 : 관리자 권한 탈취

       (패스워드는 암호화하여 별도 저장, 디폴트 패스워드나 키의 사용 피함)

 

11. 시간 및 상태

     : 동시 수행을 지원하는 병렬 처리 시스템이나 다수의 프로세스가 동작하는 환경에서 시간과 실행 상태를 관리하여 시스템이 원활하게 동작되도록 하기 위한 보안 검증 항목들

     

     TOCTOU 경쟁 조건 : 검사 시점과 사용 시점을 고려하지 않고 코딩하는 경우 발생하는 보안 약점

     - 프로세스가 가진 자원 정보와 실제 자원 상태가 일치하지 않는 동기화 오류, 교착 상태 등 발생

       (코드 내에 동기화 구문을 사용하여 해당 자원에는 한 번에 하나의 프로세스만 접근 가능하도록 구성)

   

     종료되지 않는 반복문 또는 재귀함수

     - 반복문이나 재귀함수가 종료되지 않을 경우 서비스 또는 시스템이 자원고갈로 정지 혹은 종료

       (모든 반복문이나 재귀함수의 횟수 제한 설정, 종료 조건 점검하여 반복 또는 호출의 종료 여부 확인)

 

12. 에러처리

     : 소프트웨어 실행 중 발생할 수 있는 오류들을 사전에 정의하여 오류로 인해 발생할 수 있는 문제들을 예방하기 위한 보안 점검 항목들

     

     오류 메시지를 통한 정보 노출 : 오류 발생으로 중요정보를 메시지로 외부에 노출

     - 예외처리 구문에 예외의 이름이나 스택 트레이스를 출력하도록 코딩한 경우

       (오류 발생 시 내부에서만 처리되도록 하거나 최소한의 정보만 출력되도록 함)

     

     오류 상황 대응 부재 : 예외 처리를 하지 않았거나 미비로 인해 발생하는 보안 약점

       (오류 발생할 수 있는 부분에 예외처리, 제어문 활용)

   

     부적절한 예외처리 : 함수의 반환값 또는 오류들을 세분화하여 처리하지 않고 광범위하게 묶어 처리

       (세분화된 예외처리를 수행)

 

13. 코드 오류

     : 형 변환, 자원 반환 등의 오류를 예방하기 위한 보안 점검 항목

     

     널 보인터 역참조 : 널 포인터가 가리키는 메모리에 어떠한 값을 저장할 때

       (널 값을 갖고 있는지 검사)

 

     부적절한 자원해제 : 자원을 반환하는 코드를 누락하거나 프로그램 오류로 할당된 자원을 반환하지 못했을 때

     - 힙 메모리, 소켓 등의 유한한 시스템 자원이 계속 점유하고 있으면 자원부족으로 새로운 입력을 처리 못 함

       (예외처리에 관계없이 자원 반환되도록 코딩)

 

     해제된 자원 사용 : 이미 사용이 종료되어 반환된 메모리를 참조하는 경우

       (주소를 저장하고 있는 포인터 초기화)

 

     초기화되지 않은 변수 사용 : 변수 선언 후 값이 부여되지 않은 변수를 사용할 때

       (할당된 메모리 초기화)

 

14. 캡슐화

     : 정보 은닉이 필요한 중요한 데이터와 기능을 불충분하게 캡슐화하거나 잘못 사용함으로써 발생하는 문제 예방

 

     잘못된 세션에 의한 정보 노출 : 다중스레드 환경에서 멤버 변수에 정보를 저장할 때

       (멤버 변수보다 지역 변수를 활용하여 변수의 범위를 제한)

 

     제거되지 않고 남은 디버그 코드 : 개발 중 남겨둔 코드로 인해 발생

       (배포 전 코드 검사를 통해 남아있는 디버그 코드 삭제)

 

     시스템 데이터 정보 노출 : 시스템의 내부 정보를 시스템 메시지 등을 통해 외부로 출력하도록 코딩

       (노출되는 메시지는 최소한의 정보만 제공)

 

     Public 메소드로부터 반환된 Private 배열

     : 선언된 클래스 내에서만 접근이 가능한 Private 배열을 모든 클래스에서 접근 가능한 Public 메소드에 반환할 때

       (Private 배열을 별도의 메소드를 통해 조작하거나, 동일한 형태의 복제본으로 반환받은 후 값 전달)

 

     Private 배열에 Public 데이터 할당 : Private 배열에 Public으로 선언된 데이터 또는 메소드의 파라미터를 저장할 때

       (레퍼런스가 아닌 값을 직접 저장)

 

     * Java의 접근 제어자(제한자) : Public / Private / Protected / Default

 

15. API 오용

     : 소프트웨어 구현 단계에서 API를 잘못 사용하거나 보안에 취약한 API를 사용하지 않도록 검증

 

     DNS Lookup에 의존한 보안 결정 : 도메인명에 의존하여 인증이나 접근 통제 등의 보안 결정을 내리는 경우

       (도메인 이름을 비교하지 않고 IP주소를 직접 입력하여 접근)

 

     취약한 API 사용 : 사용이 금지된 API를 사용하거나, 잘못된 방식으로 API를 사용했을 때 발생

     - strcat() / strcpy() / sprintf()

       (보안이 보장되는 인터페이스 사용)

 

16. 암호 알고리즘

     : 중요 정보를 보호하기 위해 평문을 암호화된 문장으로 만드는 절차 또는 방법

 

     개인키 암호화 기법 : 동일한 키로 데이터를 암호화하고 복호화(=대칭 암호 기법, 단일키 암호 기법)

     # 장점 : 암·복호화 속도↑ / 알고리즘 단순 / 공개키 암호화 기법보다 파일 크기↓

     # 단점 : 사용자 증가에 따라 관리할 키 수↑

 

     공개키 암호화 기법 : 암호화 할 때 사용하는 공개키는 데이터 베이스 사용자에게 공개, 복호화할 때의 비밀키는 관리자가 비밀리에 관리(=비대칭 암호 기법 / RSA)

     # 장점 : 키 분배 용이 / 관리할 키 수↓

     # 단점 : 암·복호화 속도↓ / 알고리즘 복잡 / 개인키 암호화보다 파일 크기↑

 

     공개키 기반 구조 : 정보 보호 표준 방식으로 구분

     - X.509 방식 : 인증기관에서 발생하는 인증서 기반

     - 비 X.509 방식 : 국가별, 지역별로 맞게 보완 및 개발

 

     해시 : 임의의 길이의 입력 데이터나 메시지를 고정된 길이의 값이나 키로 변환

     (해시 알고리즘->해시 함수 / 해시 함수로 변환된 값이나 키를 해시값 or 해시키)

     - SHA 시리즈 : 1993년에 미국 NSA가 제작 NIST에서 표준으로 채택

     - MD5 : 1991년 R.rivest가 MD4를 개선. 각각의 512 비트짜리 입력 메시지 블록에 대해 차례로 동작

     - SNEFRU : 1990년에 R.C. Merkle에 의해 제안된 128, 254비트 암호화 알고리즘

 

     양방향 알고리즘

     - SEED : KISA 에서 개발 / 128비트, 키 길이에 따라 128, 256으로 분류

     - ARIA : 국가정보원과 산학연합회가 개발 / 128비트, 키 길이에 따라 128, 192, 256으로 분류

     - DES : NBS에서 발표 / DES 3번 적용한 3DES / 64비트, 키 길이는 56비트

     - AES : NIST에서 발표 / DES의 한계를 느껴서 / 128비트, 키 길이에 따라 128, 192, 256으로 분류

     - RSA : MIT / 소인수분해 어렵다는 것 기반 / 공개키와 비밀키 사용