도서 개발 공부/정보 처리 기사 필기

5. 정보 시스템 구축 관리 - 소프트웨어 개발 보안 구축(에러 처리~암호 알고리즘)

캐티시 2022. 4. 18. 21:45

195. 에러 처리

: 소프트웨어 실행 중 발생 가능한 오류들을 사전에 정의하여 문제를 예방하는 보안 점검 항목

  • 각 프로그래밍 언어의 예외처리 구문을 통해 오류에 대한 사항을 정의 ex) JAVA - try ~ catch 블록
  • 예외처리 구문으로 처리하지 못한 오류들은 중요 정보를 노출시키거나 예기치 못한 문제를 발생시킬 수 있음

 

- 에러 처리 미비로 인한 보안 약점

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

  • 실행 환경, 사용자 정보, 디버깅 정보 등의 중요 정보가 오류 메시지를 통해 외부로 노출되는 보안 약점
  • 노출되는 경로 및 디버깅 정보는 공격자의 악의적 행위에 이용될 수 있음
  • 예외 처리 구문에 예외의 이름이나 스택 트레이스가 출력되는 경우 소프트웨어의 내부 구조가 노출됨

=> 오류 발생 시 가능한 한 내부에서 처리하거나, 메시지에 최소한의 정보 또는 사전에 준비된 메시지가 출력되도록 하여 방지

 

2. 오류 상황 대응 부재

  • 개발 중 예외처리를 하지 않았거나 처리가 미비하여 발생하는 보안 약점
  • 예외처리를 하지 않은 오류들로 인해 소프트웨어 실행이 중단되거나 의도를 벗어난 동작이 유도될 수 있음

=> 오류 발생 가능 부분에 예외 처리 구문을 작성하고, 제어문을 활용하여 오류가 악용되지 않도록 코딩하여 방지

 

3. 부적절한 예외 처리

  • 함수의 반환 값이나 오류들을 세분화하여 처리하지 않고 광범위하게 묶어 한번에 처리하거나 누락된 값이나 예외가 있을 때 발생하는 보안 약점
  • 모든 오류를 광범위한 예외 처리 구문으로 정의하면 예기치 않은 문제 발생
  • 함수 등이 예상했던 결과와 다른 값을 반환하여 예외로 처리되지 않는 경우 예기치 않은 문제 발생

=> 모든 함수의 반환 값이 의도대로 출력되는지 확인하고, 세분화된 예외 처리를 수행하여 방지


196. 코드 오류

: 소프트웨어 구현 단계에서 개발자들이 실수하기 쉬운 오류를 예방하기 위한 보안 점검 항목

 

- 코드 오류로 인한 보안 약점

1. 널 포인터 역참조

  • 널 포인터가 가리키는 메모리에 특정 값을 저장할 때 발생하는 보안 약점
  • 많은 라이브러리 함수가 오류 발생 시 널 값을 반환하는데, 이를 포인터로 참조하는 경우 발생
  • 대부분의 운영체제에서 널포인터는 메모리의 첫 주소를 참조 -> 소프트웨어의 비정상적 종료 유발
  • 널 포인터 역참조로 발생하는 예외 상황은 공격자가 악용할 기회가 됨

=> 널이 될 가능성이 있는 포인터를 이용하기 전에 널 값인지 검사하여 방지

 

※ 스택 가드 (Stack Guard)

: 주소가 저장되는 스택에서 발생하는 보안 약점을 막기 위한 기술

  • 프로그램 복귀 주소와 변수 사이에 특정 값을 저장하고, 그 값이 변경되었을 경우 오버플로우 상태로 판단하여 프로그램 실행을 중단

 

2. 부적절한 자원 해제

  • 자원을 반환하는 코드를 누락하거나 프로그램 오류가 발생해 할당된 자원이 반환되지 않아서 생기는 보안 약점
  • 힙 메모리, 소켓 등의 유한한 시스템 자원이 계속 점유된 상태로 있어 자원 부족 현상 발생

=> 코드 내에 자원 반환 코드가 누락되었는지 확인하고, 오류 발싱 시에도 예외처리에 관계 없이 자원이 반환되도록 구현하여 방지

 

3. 해제된 자원 사용

  • 이미 사용이 종료되어 반환된 메모리를 참조하여 발생하는 보안 약점
  • 이미 반환된 메모리를 참조하는 경우 예상치 못한 값이나 코드가 수행되어 의도치 않은 결과 발생

=> 반환된 메모리에 접근할 수 없도록 주소를 저장하는 포인터를 초기화하여 방지

 

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

  • 변수 선언 후 값이 부여되지 않은 상태로 사용하여 발생하는 보안 약점
  • 변수 선언으로 메모리가 할당되면 해당 메모리에 이전 내용이 계속 남아있어 중요 정보가 악용될 가능성이 있음

=> 변수 선언 시 할당된 메모리를 초기화하여 방지


197. 캡슐화

: 정보 은닉이 필요한 중요 데이터와 기능을 불충분하게 캡슐화하거나 잘못 사용하여 발생 가능한 문제를 예방하기 위한 보안 점검 항목

 

- 캡슐화 미비로 인한 보안 약점

1. 잘못된 세션에 의한 정보 노출

  • 다중 스레드 환경에서 멤버 변수에 정보를 저장할 때 발생하는 보안 약점
  • 싱글턴 패턴에서의 레이스 컨디션 -> 동기화 오류, 멤버 변수의 정보 노출
  • 세션 통제의 보안 약점과 동일하나, 세션 통제는 요구 사항 분석 및 설계 단계의 점검 사항이며 캡슐화는 구현 단계의 점검 사항

=> 멤버 변수보다 지역 변수를 활용하여 변수의 범위를 제한함으로써 방지

 

2. 제거되지 않고 남은 디버그 코드

  • 개발 중에 버그 수정이나 결과 값 확인을 위해 남겨둔 코드들로 인해 발생하는 보안 약점
  • 소프트웨어 제어에 사용되는 중요한 정보가 디버그 코드로 노출될 수 있음
  • 디버그 코드에 인증 및 식별 절차를 생략하거나 우회하는 코드가 있다면 공격자가 악용할 기회가 됨

=> 소프트웨어 배포 전에 코드 검사를 통해 남은 디버그 코드를 삭제하여 방지

 

3. 시스템 데이터 정보 노출

  • 시스템의 내부 정보를 시스템 메시지 등을 통해 외부로 출력하도록 하여 발생하는 보안 약점

=> 시스템 메시지를 통해 노출되는 메시지는 최소한의 정보만 제공하도록 하여 방지

 

4. Public 메소드가 Private 배열 반환

  • 모든 클래스에서 접근이 가능한 Public 메소드가 선언된 클래스 내에서만 접근 가능한 Private 배열을 반환하여 발생하는 보안 약점
  • Private 배열의 주소가 외부로 공개되어 외부에서 접근 가능해짐

=> Private 배열을 별도의 메소드를 통해 조작하거나, 해당 배열의 복제본으로 반환받은 후 값을 전달하는 방식으로 방지

 

5. Private 배열에 Public 데이터가 할당됨

  • Private 배열에 Public으로 선언된 데이터나 파라미터가 저장될 때 발생하는 보안 약점
  • Private 배열의 주소가 외부로 공개되어 외부에서 접근 가능해짐

=> Public으로 선언한 데이터를 Private 배열에 저장할 때는 레퍼런스가 아닌 값을 저장하여 방지


198. API 오용

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

 

- API 오용으로 인한 보안 약점

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

  • 도메인명에 의존하여 인증이너 접근 통제 등의 보안 결정을 내리는 경우 발생하는 보안 약점
  • DNS 엔트리를 속여 동일한 도메인에 속한 서버인 것처럼 위장하거나, 사용자-서버 간 네트워크 트래픽을 유도해 악성 사이트를 경우하도록 조작
  • 공격자는 DNS Lookup을 악용하여 인증이나 접근 통제를 우회하는 수법으로 권한 탈취

=> DNS 검색을 통해 도메인 이름이 아닌 IP주소를 직접 입력하여 접근함으로써 방지

 

2. 취약한 API 사용

  • 보안 문제로 인해 사용이 금지된 API를 사용하거나 잘못된 방식으로 API를 사용하여 발생하는 보안 약점
  • 각 프로그래밍 언어에는 보안상 문제로 사용이 금지된 라이브러리 함수가 존재 ex) C - strcat(), strcpy(). sprintf(), etc.
  • 보안상 안전한 API라도 보안에 위협이 될만한 인터페이스를 사용하면 보안 약점이 노출됨

=> 보안 문제로 금지된 함수는 안전한 함수로 대체하고, API 매뉴얼을 참고하여 보안이 보장되는 인터페이스를 사용하여 방지


199. 암호 알고리즘

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

암호화 방식의 분류

1) 해시 (Hash)

: 임의의 길이를 가진 입력 데이터나 메시지를 고정된 길이의 해시 값으로 변환하는 것

  • 해시 함수 : 데이터를 고정된 길이의 값으로 변환하는 방식이나 알고리즘
  • 해시 키(해시 값) : 해시 함수를 통해 변환된 값
  • 무결성 검증과 다양한 정보 보호 분야에서 활용
  • 단방향 함수 (One-way Function) : 평문을 암호화할 수는 있으나, 만들어진 암호문을 복호화하여 다시 평문으로 되돌리는 것은 불가능
  • 해시 함수의 종류

 

2) 개인키 암호화 방식 (Private Key Encryption)

: 동일한 키를 이용해 데이터를 암호화하고 복호화하는 방식

  • N개 노드의 연결에서 암호화를 위해 사용되는 키의 개수는 n(n-1)/2
    • 모든 노드 간 연결인 n(n-1)/2 개의 연결마다 개인키가 하나씩 필요
  • 대칭 암호 기법 (비밀키 암호 기법) : 공개되지 않는 동일한 키를 통해 암호화와 복호화를 진행
  • 분류
    • 블록 암호화 방식 : 한 번에 하나의 데이터 블록을 암호화 ex) DES, SEED, AES, ARIA, etc.
    • 스트림 암호화 방식 : 평문과 동일한 길이의 스트림을 생성해 비트/바이트/워드 단위로 암호화 ex) LFSR, RC4, etc.

 

- 개인키 암호화 방식의 장단점

  • 장점
    • 암호화/복호화 속도가 빠름
    • 알고리즘이 단순함
    • 공개키 암호 기법보다 파일의 크기가 작음
  • 단점
    • 사용자의 증가에 따라 관리해야 할 키의 수가 공개키 암호 기법보다 많음

 

3) 공개키 암호화 방식 (Public Key Encryption)

: 데이터를 암호화 할 때는 공개키(Public Key)를, 복호화할 때는 비밀키(Private Key)를 사용하는 방식

  • N개 노드 간 연결에서 암호화를 위해 사용되는 키의 개수는 2n
    • 각 노드는 다른 모든 노드에게 공개할 공개키 하나와 자신만 사용할 비밀키 하나를 가진다
  • 비대칭 암호 기법 : 암호화와 복호화에 사용하는 키가 다름
  • 공개키 기반 구조 (Public Key Infrastructure) : 공개키 암호 시스템을 안전하게 사용 및 관리하기 위한 정보 보호 표준 방식
    • X.509 방식 : 인증 기관에서 발생하는 인증서를 기반으로 상호 인증 제공
    • 비 X.509 방식 : 국가별, 지역별로 맞게 보완 및 개발
  • ex) RSA(Rivest Shamir Adleman)

 

- 개인키 암호화 방식의 장단점

  • 장점
    • 키의 분배하 용이함
    • 관리해야하는 키의 개수가 개인키 암호 기법보다 적음
  • 단점
    • 암호화/복호화 속도가 느림
    • 알고리즘이 복잡함
    • 개인키 암호 기법보다 파일의 크기가 큼

 

4) 양방향 암호화 알고리즘의 종류

 

 

※ 솔트

: 동일한 패스워드에 같은 암호화 방식을 적용하면 같은 암호문이 나오는 단점을 보완하고자 암호화 전에 원문에 덧붙이는 무작위의 값