정보처리기사 - 소프트웨어 개발 보안 구축 #133~142

2023. 8. 19. 12:58자격증/정보처리기사

133. Secure SDLC

133.1 Secure SDLC

보안상 안전한 소프트웨어를 개발하기 위해 SDLC에 보안 강화를 위한 프로세스를 포함한 것을 의미
  • SDLC : 소프트웨어 개발 생명주기(Software Development Life Cycle)
  • Secure SDLC는 요구사항 분석, 설계, 구현, 테스트, 유지보수 등 SDLC 전체 단계에 걸쳐 수행되어야 할 보안 활동을 제시
  • Secure SDLC의 대표적인 방법론
방법론 내용
CLASP SDLC의 초기 단계에서 보안을 강화하기 위해 개발된 방법론
SDL 마이크로소프트 사에서 안전한 소프트웨어 개발을 위해 기존의 SDLC를 개선한 방법론
Seven Touchpoints 소프트웨어 보안의 모범사례를 SDLC에 통합한 방법론

133.2 SDLC 단계별 보안 활동

133.3 소프트웨어 개발 보안 요소

보안 요소 설명
기밀성
(Confidentiality)
- 시스템 내의 정보와 자원은 인가된 사용자에게만 접근이 허용됨
- 정보가 전송 중에 노출되더라도 데이터를 읽을 수 없음
무결성
(Integrity)
시스템 내의 정보는 오직 인가된 사용자만 수정할 수 있음
가용성
(Availablity)
인가받은 사용자는 시스템 내의 정보와 자원을 언제라도 사용할 수 있음
인증
(Authentication)
- 시스템 내의 정보와 자원을 사용하려는 사용자가 합법적인 사용자인지를 확인하는 모든 행위
- 대표적 방법 : 패스워드, 인증용 카드, 지문 검사 등
부인 방지
(NonRepudiation)
데이터를 송·수신한 자가 송·수신 사실을 부인할 수 없도록 송·수신 증거를 제공

133.4 시큐어 코딩(Secure Coding)

구현 단계에서 발생할 수 있는 보안 취약점들을 최소화하기 위해 보안 요소들을 고려하며 코딩하는 것을 의미
  • 보안 취약점을 사전 대응하여 안전성과 신뢰성을 확보
  • 보안 정책을 바탕으로 시큐어 코딩 가이드를 작성하고, 개발 참여자에게는 시큐어 코딩 교육을 실시

134. 세션 통제

134.1 세션 통제

세션의 연결과 연결로 인해 발생하는 정보를 관리하는 것을 의미
  • 세선 : 서버와 클라이언트의 연결을 의미
  • 소프트웨어 개발 과정 중 요구사항 분석 및 설계 단계에서 진단해야 하는 보안 점검 내용
  • 세션 통제의 보안 약점
종류 내용
불충분한 세션 관리 일정한 규칙이 존재하는 세션ID가 발급되거나 타임아웃이 너무 길게 설정되어 있는 경우 발생하는 보안 약점
잘못된 세션에 의한 정보 노출 다중 스레드(Multi-Thread) 환경에서 멤버 변수에 정보를 저장할 때 발생하는 보안 약점
  • 세션ID : 서버가 클라이언트를 구분하기 위해 부여하는 키(Key)
  • 멤버 변수 : 객체와 연결된 변수

134.2 세션 설계 시 고려 사항

  • 시스템의 모든 페이지에서 로그아웃이 가능하도록 UI를 구성
  • 로그아웃 요청 시 할당된 세션이 완전히 제거되도록 함
  • 세션 타임아웃은 중요도가 높으면 2~5분, 낮으면 15~30분으로 설정
  • 이전 세션이 종료되지 않으면 새 세션이 생성되지 못하도록 설계
  • 중복 로그인을 허용하지 않은 경우 클라이언트의 중복 접근에 대한 세션 관리 정책을 수립

134.3 세션ID의 관리 방법

  • 세션ID는 안전한 서버에서 최소 128비트 길이로 생성
  • 세션ID의 예측이 불가능하도록 안전한 난수 알고리즘을 적용
  • 세션ID가 노출되지 않도록 URL Rewrite 기능을 사용하지 않는 방향으로 설계
    • URL Rewrite : 쿠키를 사용할 수 없는 환경에서 세션ID 전달을 위해 URL에 세션ID를 포함시키는 것
  • 로그인 시 로그인 전의 세션ID를 삭제하고 재할당
  • 장기간 접속하고 있는 세션ID는 주기적으로 재할당되도록 설계

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

135.1 입력 데이터 검증 및 표현

입력 데이터로 인해 발생하는 문제들을 예방하기 위해 구현 단계에서 검증해야 하는 보안 점검 항목들
  • 입력 데이터 검증 및 표현의 보안 약점
보안 약점 설명
SQL 삽입
(Injection)
- 웹 응용 프로그램에 SQL을 삽입하여 내부 데이터베이스 서버의 데이터를 유출 및 변조하고, 관리자 인증을 우회하는 보안 약점
- 동적 쿼리에 사용되는 입력 데이터에 예약어 및 특수문자가 입력되지 않게 필터링되도록 설정하여 방지할 수 있음
경로 조작 및 자원 삽입 - 데이터 입출력 경로를 조작하여 서버 자원을 수정·삭제할 수 있는 보안 약점
- 사용자 입력값을 식별자로 사용하는 경우, 경로 순회 공격을 막는 필터를 사용하여 방지할 수 있음
크로스사이트 스크립팅
(XSS)
- 웹페이지에 악의적인 스크립트를 삽입하여 방문자들의 정보를 탈취하거나, 비정상적인 기능 수행을 유발하는 보안 약점
- HTML 태그의 사용을 제한하거나 스크립트에 삽입되지 않도록 '<', '>', '&' 등의 문자를 다른 문자로 치환함으로써 방지할 수 있음
운영체제 명령어 삽입 - 외부 입력값을 통해 시스템 명령어의 실행을 유도함으로써 권한을 탈취하거나 시스템 장애를 유발하는 보안 약점
- 웹 인터페이스를 통해 시스템 명령어가 전달되지 않도록 하고, 외부 입력값을 검증 없이 내부 명령어로 사용하지 않음으로써 방지할 수 있음
위험한 형식 파일 업로드 - 악의적인 명령어가 포함된 스크립트 파일을 업로드함으로써 시스템에 손상을 주거나, 시스템을 제어할 수 있는 보안 약점
- 업로드 되는 파일의 확장자 제한, 파일명의 암호화, 웹사이트와 파일 서버의 경로 분리, 실행 속성을 제거하는 등의 방법으로 방지할 수 있음
신뢰되지 않는 URL 주소로 자동접속 연결 - 입력 값으로 사이트 주소를 받는 경우 이를 조작하여 방문자를 피싱 사이트로 유도하는 보안 약점
- 연결되는 외부 사이트의 주소를 화이트 리스트로 관리함으로써 방지할 수 있음
메모리 버퍼 오버플로 - 연속된 메모리 공간을 사용하는 프로그램에서 할당된 메모리의 범위를 넘어선 위치에서 자료를 읽거나 쓰려고 할 때 발생하는 보안 약점
- 메모리 버퍼를 사용할 경우 적절한 버퍼의 크기를 설정하고, 설정된 범위의 메모리 내에서 올바르게 읽거나 쓸 수 있도록 함으로써 방지할 수 있음
  • 동적 쿼리(Dynamic Query) : 질의어 코드를 문자열 변수에 넣어 조건에 따라 질의를 동적으로 변경하여 처리하는 방식
  • 경로 순회(Directory Traversal) : 경로를 탐색할 때 사용되는 '/', '\', '..' 등의 기호를 악용하여 허가하지 않은 파일에 접근하는 방식
  • 스크립트(Script) : 소프트웨어를 수행하는데 필요한 처리 절차가 기록된 텍스트

136. 보안 기능

136.1 보안 기능

소프트웨어 개발의 구현 단계에서 코딩하는 기능인 인증, 접근 제어, 기밀성, 암호화 등을 올바르게 구현하기 위한 보안 점검 항목들
  • 보안 기능의 보안 약점
보안 약점 설명
적절한 인증 없이 중요기능 허용 - 보안검사를 우회하여 인증과정 없이 중요한 정보 또는 기능에 접근 및 변경이 가능
- 중요정보나 기능을 수행하는 페이지에서는 재인증 기능을 수행하도록 하여 방지할 수 있음
부적절한 인가 - 접근제어 기능이 없는 실행경로를 통해 정보 또는 권한을 탈취할 수 있음
- 모든 실행경로에 대해 접근제어 검사를 수행하고, 사용자에게는 반드시 필요한 접근 권한만을 부여하여 방지할 수 있음
중요한 자원에 대한 잘못된 권한 설정 - 권한 설정이 잘못된 자원에 접근하여 해당 자원을 임의로 사용할 수 있음
- 소프트웨어 관리자만 자원을 읽고 쓸 수 있도록 설정하고, 인가되지 않은 사용자의 중요 자원에 대한 접근 여부를 검사함으로써 방지할 수 있음
취약한 암호화 알고리즘 사용 - 암호화된 환경설정 파일을 해독하여 비밀번호 등의 중요정보를 탈취할 수 있음
- 안전한 암호화 알고리즘을 이용하고, 업무관련 내용이나 개인 정보 등에 대해서는 IT 보안인증사무국이 안전성을 확인한 암호모듈을 이용함으로써 방지 가능
취약한 암호화 알고리즘 사용 - 암호화된 환경설정 파일을 해독하여 비밀번호 등의 중요정보를 탈취할 수 있음
- 중요한 정보를 저장하거나 전송할 때는 반드시 암호화 과정을 거치도록 하고, HTTPS 또는 SSL과 같은 보안 채널을 이용함으로써 방지할 수 있음
하드코드된 암호화 키 - 암호화된 키도 하드코드된 경우 유출 시 역계산 또는 무차별 대입 공격에 의해 탈취될 수 있음
- 상수 형태의 암호키를 사용하지 않고, 암호화 키 생성 모듈 또는 보안이 보장된 외부 공간을 이용함으로써 방지할 수 있음
  • SSL(Secure Socket Layer) : 데이터를 송·수신하는 두 컴퓨터 사이에 위치하여 인증, 암호화, 무결성을 보장하는 업계 표준 프로토콜
  • 하드코드 : 데이터를 코드 내부에 직접 입력하여 프로그래밍하는 방식
  • 무차별 대입 방법(Brute Force Attack) : 암호화된 문서의 암호키를 찾아내기 위해 적용 가능한 모든 값을 대입하여 공격하는 방식

137. 시간 및 상태

137.1 시간 및 상태

동시 수행을 지원하는 병렬 처리 시스템이나 다수의 프로세스가 동작하는 환경에서 시간과 실행 상태를 관리하여 시스템이 원활하게 동작되도록 하기 위한 보안 점검 항목들
  • 시간 및 상태의 보안 약점
보안 약점 설명
TOCTOU 경쟁 조건 - 검사 시점(Time Of Check)과 사용 시점(Time Of Use)을 고려하지 않고 코딩하는 경우 발생하는 보안 약점
- 코드 내에 동기화 구문을 사용하여 해당 자원에서는 한 번에 하나의 프로세스만 접근 가능하도록 구성함으로써 방지 가능
종료되지 않는 반복문 또는 재귀 함수 - 반복문이나 재귀 함수에서 종료 조건을 정의하지 않았거나 논리 구조상 종료될 수 없는 경우 발생하는 보안 약점
- 모든 반복문이나 재귀 함수의 수행 횟수를 제한하는 설정을 추가하거나, 종료 조건을 점검하여 반복 또는 호출의 종료 여부를 확인함으로써 방지할 수 있음
  • 동기화 구문 : 공유 자원에 대해 둘 이상의 프로세스가 접근하는 것을 막는 구문
    • Synchronized, Mutex 등
  • 재귀 함수(Recursive Function) : 자기가 자기를 호출하는 순환 프로그램

138. 에러처리

138.1 에러처리

소프트웨어 실행 중 발생할 수 있는 오류들을 사전에 정의하여 오류로 인해 발생할 수 있는 문제들을 예방하기 위한 보안 점검 항목들
  • 에러처리의 보안 약점
보안 약점 설명
오류 메시지를 통한 정보노출 - 오류 발생으로 실행 환경, 사용자 정보, 디버깅 정보 등 중요한 정보가 메시지를 통해 외부에 노출되는 보안 약점
- 가능한 한 내부에서만 처리되도록 하거나 메시지를 출력할 경우 최소한의 정보 또는 사전에 준비된 메시지만 출력되도록 하여 방지할 수 있음
오류 상황 대응 부재 - 소프트웨어 개발 중 에러처리를 하지 않았거나 미비로 인해 발생하는 보안 약점
- 오류가 발생할 수 있는 부분에 에러처리 구문을 작성하고, 제어문을 활용하여 오류가 악용되지 않도록 코딩함으로써 방지할 수 있음
부적절한 예외처리 - 함수의 반환값 또는 오류들을 세분화하여 처리하지 않고 광범위하게 묶어 한 번에 처리하거나, 누락된 예외가 존재할 때 발생하는 보안 약점
- 모든 함수의 반환값이 의도대로 출력되는지 확인하고, 세분화된 예외처리를 수행함으로써 방지할 수 있음

139. 코드 오류

139.1 코드 오류

소프트웨어 구현 단계에서 개발자들이 코딩 중 실수하기 쉬운 형(Type) 변환, 자원 반환 등의 오류를 예방하기 위한 보안 점검 항목들
  • 코드 오류의 보안 약점
보안 약점 설명
널 포인터(Null Pointer) 역참조 - 널 포인터가 가리키는 메모리의 위치에 값을 저장할 때 발생하는 보안 약점
- 포인터를 이용하기 전에 널 값을 갖고 있는지 검사함으로써 방지할 수 있음
부적절한 자원 해제 - 자원을 반환하는 코드를 누락하거나 프로그램 오류로 할당된 자원을 반환하지 못했을 때 발생하는 보안 약점
- 프로그램 내에 자원 반환 코드가 누락되었는지 확인하고, 오류로 인해 함수가 중간에 종료되었을 때 예외처리에 관계없이 자원이 반환되도록 코딩함으로써 방지할 수 있음
해제된 자원 사용 - 이미 사용이 종료되어 반환된 메모리를 참조하는 경우 발생하는 보안 약점
- 반환된 메모리에 접근할 수 없도록 주소를 저장하고 있는 포인터를 초기화함으로써 방지할 수 있음
초기화되지 않은 변수 사용 - 변수 선언 후 값이 부여되지 않은 변수를 사용할 때 발생하는 보안 약점
- 변수 선언 시 할당된 메모리를 초기화함으로써 방지할 수 있음
  • 널 포인터(Null Pointer) : 포인터에 널(Null)이 저장되어 어떠한 곳도 가리키지 못하는 상태의 요소
  • 널 포인터 역참조 : 널 포인터 역참조로 오류가 발생하는 경우 "메모리 0×00000000을 참조하였습니다." 라는 오류 메시지가 발생

139.2 스택 가드(Stack Guard)

주소가 저장되는 스택에서 발생하는 보안 약점
  • 메모리상에서 프로그램의 복귀 주소와 변수 사이에 특정 값을 저장한 후 그 값이 변경되었을 경우 오버플로우 상태로 판단하여 프로그램 실행을 중단함으로써 잘못된 복귀 주소의 호출을 막음

140. 캡슐화

140.1 캡슐화

정보 은닉이 필요한 중요한 데이터와 기능을 불완전하게 캡슐화하거나 잘못 사용함으로써 발생할 수 있는 문제를 예방하기 위한 보안 점검 항목들
  • 캡슐화의 보안 약점
보안 약점 설명
잘못된 세션에 의한 정보 노출 - 다중 스레드(Multi-Thread) 환경에서 멤버 변수에 정보를 저장할 때 발생하는 보안 약점
- 멤버 변수보다 지역 변수를 활용하여 변수의 범위를 제한함으로써 방지할 수 있음
제거되지 않고 남은 디버그 코드 - 개발 중에 버그 수정이나 결과값 확인을 위해 남겨둔 코드들로 인해 발생하는 보안 약점
- 소프트웨어 배포 전에 코드 검사를 수행하여 남아있는 디버그 코드를 삭제함으로써 방지할 수 있음
시스템 데이터 정보 노출 - 시스템의 내부 정보를 시스템 메시지 등을 통해 외부로 출력하도록 코딩했을 때 발생하는 보안 약점
- 노출되는 메시지에는 최소한의 정보만을 제공함으로써 방지할 수 있음
Public 메소드로부터 반환된 Private 배열 - 선언된 클래스 내에서만 접근이 가능한 Private 배열을 모든 클래스에서 접근이 가능한 Public 메소드에서 반환할 때 발생하는 보안 약점
- Private 배열을 별도의 메소드를 통해 조작하거나, 동일한 형태의 복제본으로 반환받은 후 값을 전달하는 방식으로 방지할 수 있음
Private 배열에 Public 데이터 할당 - Private 배열에 Public으로 선언된 데이터 또는 메소드의 파라미터를 저장할 때 발생하는 보안 약점
- Public으로 선언된 데이터를 Private 배열에 저장할 때, 레퍼런스가 아닌 값을 직접 저장함으로써 방지할 수 있음
  • 파라미터(Parameter) : 메소드의 외부에서 전달된 값을 저장하는 변수
  • 레퍼런스(Reference) : 레퍼런스를 전달 또는 할당한다는 것은 메모리의 위치를 공유한다는 의미

140.2 접근 제어자

프로그래밍 언어에서 특정 개체를 선언할 때 외부로부터 접근을 제한하기 위해 사용되는 예약어
  • 접근 제어자의 종류(접근 가능 : ○, 접근 불가능 : ×)
접근 제어자 클래스 내부 패키지 내부 하위 클래스 패키지 외부
Public
Protected ×
Default × ×
Private × × ×
  • 패키지(Package) : 관련 클래스나 인터페이스 등을 하나로 모아둔 것

141. API 오용

141.1 API 오용

소프트웨어 구현 단계에서 API를 잘못 사용하거나 보안에 취약한 API를 사용하지 않도록 하기 위한 보안 점검 항목들
  • API 오용의 보안 약점
보안 약점 설명
DNS Lookup에 의존한 보안 결정 - 도메인명에 의존하여 인증이나 접근 통제 등의 보안 결정을 내리는 경우 발생하는 보안 약점
- DNS 검색을 통해 도메인 이름을 비교하지 않고 IP 주소를 직접 입력하여 접근함으로써 방지할 수 있음
취약한 API 사용 - 보안 문제로 사용이 금지된 API를 사용하거나, 잘못된 방식으로 API를 사용했을 때 발생하는 보안 약점
- 보안 문제로 금지된 함수는 안전한 함수로 대체하고, API의 메뉴얼을 참고하여 보안이 보장되는 인터페이스를 사용함으로써 방지할 수 있음
  • DNS(Domain Name Syetem) : 숫자로 된 IP 주소를 사람이 이해하기 쉬운 문자 형태로 표현한 것을 도메인 네임이라고 하며, 도메인 네임을 IP 주소로 바꾸어주는 역할을 하는 것이 DNS

142. 암호 알고리즘

142.1 암호 알고리즘

패스워드, 주민번호, 은행계좌와 같은 중요 정보를 보호하기 위해 평문을 암호화된 문장으로 만드는 절차 또는 방법을 의미
  • 암호 방식 분류

142.2 개인키 암호화(Pribate Key Encryption) 기법

동일한 키로 데이터를 암호화하고 복호화하는 암호화 기법
  • 대칭 암호 기법 또는 단일키 암호화 기법이라고도 함
  • 암호화/복호화 속도가 빠르지만 관리해야 할 키의 수가 많음
  • 개인키 암호화 기법의 종류
방식 내용
스트림 암호화 방식 - 평문과 동일한 길이의 스트림을 생성하여 비트 단위로 암호화 하는 방식
- 종류 : LFSR, RC4
블록 암호화 방식 - 한 번에 하나의 데이터 블록을 암호화하는 방식
- 종류 : DES, SEED, AES, ARIA

142.3 공개키 암호화(Public Key Encryption)

데이터를 암호화할 때 사용하는 공개키(Public Key)는 사용자에게 공개하고, 복호화할 때의 비밀키(Secret Key)는 관리자가 비밀리에 관리하는 암호화 기법
  • 비대칭 암호 기법이라고도 함
  • 관리해야 할 키의 수가 적지만, 암호화/복호화 속도가 느림
  • 대표적으로는 RSA(Rivest Shamir Adleman) 기법이 존재

142.4 양방향 알고리즘의 종류

알고리즘 특징
SEED - 1999년 한국인터넷진흥원(KISA)에서 개발한 블록 암호화 알고리즘
- 블록 크기는 128비트이며, 키 길이에 따라 128, 256으로도 분류
ARIA
(Academy Research Institute Agency)
2004년 국가정보원과 산학협력회가 개발한 블록 암호화 알고리즘
DES
(Data Encryption Standard)
- 1975년 미국 NBS에서 발표한 개인키 암호화 알고리즘
- 블록 크기는 64비트, 키 길이는 56비트이며 16회의 라운드 수행
- DES를 3번 적용하여 보안을 더욱 강화한 3DES(Triple DES)도 존재
AES
(Advanced Encryption Standard)
- 2001년 미국 표준 기술 연구소(NIST)에서 발표한 개인키 암호화 알고리즘
- DES의 한계를 느낀 NIST에서 공모한 후 발표
- 블록 크기는 128비트이며, 키 길이에 따라 AES-128, AES-192, AES-256으로 분류
RSA
(Rivest Shamir Adleman)
- 1978년 MIT의 라이베스트(Rivest), 샤미르(Shamir), 애들먼(Adleman)에 의해 제안된 공개키 암호화 알고리즘
- 큰 숫자를 소인수분해 하기 어렵다는 것에 기반하여 만들어짐
  • NBS(National Bureau of Standards) : 미국 표준 기술 연구소(NIST)의 과거 이름
  • 라운드(Round) : 암호화 키를 생성하기 위해 암호화 연산식이나 함수가 적용되는 과정으로, 라운드가 수행될 때마다 라운드키가 생성
    • 라운드키는 복호화 과정에서 사용

142.5 해시(Hash)

임의의 길이의 입력 데이터나 메시지를 고정된 길이의 값이나 키로 변환하는 것을 의미
  • 해시 알고리즘을 해시 함수라고 부르며, 해시 함수로 변환된 값이나 키를 해시값 또는 해시키라고 부름
  • 데이터의 암호화, 무결성 검증을 위해 사용될 뿐만 아니라 정보보호의 다양한 분야에서 활용됨
  • 해시 함수의 종류
해시 함수 특징
SHA 시리즈 - 1993년 미국 국가안보국(NSA)이 설계, 미국 국립표준기술연구소(NIST)에 의해 발표됨
- 초기 개발된 SHA-0 이후 SHA-1이 발표되었고, 다시 SHA-2라고 불리는 SHA-224, SHA-256, SHA-384, SHA-512가 발표됨
MD5(Message Digest algorithm 5) - 1991년 R.Rivest가 MD4를 대체하기 위해 고안한 암호화 해시 함수
- 블록 크기가 512비트이며, 키 길이는 128비트
N-NASH - 1989년 일본의 전신전화주식회사(NTT)에서 발표한 암호화 해시 함수
- 블록 크기와 키 길이가 모두 128비트
SNEFRU - 1990년 R.C.Merkle가 발표한 해시 함수
- 32비트 프로세서에서 구현을 용이하게 할 목적으로 개발됨