관리 메뉴

나구리의 개발공부기록

CHAPTER 02 - 소프트웨어 개발 보안 구현(1) 본문

2024정보처리기사 준비 정리(필기 - 시나공, 실기 - 수제비)/실기 9강 - 소프트웨어 개발 보안 구축

CHAPTER 02 - 소프트웨어 개발 보안 구현(1)

소소한나구리 2024. 7. 7. 15:22

2024년도 수제비 실기책(6판) 내용 정리


1. SW 개발 보안 구현

1) 시큐어 코딩 가이드(입보시에코캡A)

  • 설계 및 구현 단계에서 해킹 등의 공격을 유발할 가능성이 있는 잠재적인 보안 취약점을 사전에 제거하고, 외부 공격으로부터 안전한 소프트웨어를 개발하는 기법
  • 소프트웨어 보안 약점을 방지하기 위한 시큐어 코딩 가이드에 따른 개발 수행이 필요함

** 보안 취약점(Vulnerability) : 해킹 등 외부 공격으로 시스템의 보안정책을 침해하는 보안사고의 실제 원인이 되는 시스템상의 보안 허점, 운영 단계의 보안 리스크

** 보안 약점(Weakness) : 보안 취약점의 근본적인 원이이 되는 SW의 결함, 실수, 버그 등의 오류를 뜻함, 개발 단계의 보안 리스크

보안 약점 내용 대응방안
입력 데이터
검증 및 표현
프로그램 입력값에 대한 검증 누락 / 부적절한 검증, 잘못된 형식 지정 사용자 / 프로그램 입력 데이터에 대한 유효성 검증체계를 수립하고 실패 시 처리 설계 및 구현
보안 기능 보안 기능(인증, 접근 제어, 기밀성, 암호화, 권한 관리 등)의 부적절한 구현 인증 / 접근 통제, 권한 관리, 비밀번호 등의 정책이 적절하게 반영되도록 설계 및 구현
시간 및 상태 거의 동시에 수행 지원하는 병렬 시스템 또는 하나 이상의 프로세스가 동작하는 환경에서 시간 및 상태의 부적절한 관리 공유 자원의 접근 직렬화, 병렬 실행 가능 프레임워크 사용, 블록문 내에서만 재귀함수 호출
에러 처리 에러 미처리, 불충분한 처리 등으로 에러 메세지에 중요 정보가 포함 에러 또는 오류 상황을 처리하지 않거나, 불충분하게 처리되어 중요정보 유출 등 보안 약점이 발생하지 않도록 시스템 설계 및 구현
코드 오류 개발자가 범할 수 있는 코딩 오류로 인해 유발 코딩 규칙 도출 후 검증 가능한 스크립트 구성과 경고 순위의 최상향 조정 후 경고 메세지 코드 제거
캡슐화 기능성이 불충분한 캡슐화로 인해 인가되지 않은 사용자에게 데이터 누출 디버그 코드 제거와 필수 정보 외의 클래스 내 프라이빗 접근자 지정
API오용 의도된 사용에 반하는 방법으로 API를 사용하거나 보안에 취약한 API의 사용 개발 언어별 취약 API 확보 및 취약 API 검출 프로그램 사용

 

** 직렬화 : 데이터 구조나 오브젝트 상태를 다른 컴퓨터 환경으로 저장하고 재구성할 수 있는 포맷으로 변환하는 과정

2) 입력 데이터 검증 및 표현

(1) 입력 데이터 검증 및 표현 개념

 

  • 입력 데이터 검증 및 표현은 입력 데이터로 인해 발생하는 문제들을 예방하기 위해 구현 단계에서 검증해야 하는 보안 점검 항목들임
  • 입력 데이터로 인해 발생하는 문제를 예방하기 위해서는 소프트웨어 개발의 구현 단계에서 유효성 검증 체계를 갖추고 검증되지 않은 데이터의 입력을 처리할 수 있도록 구현해야 함

(2) 입력 데이터 검증 및 표현 취약점

취약점 설명 대책
XSS
(Cross Site
Scripting)
검증되지 않은 외부 입력 데이터가 포함된 웹페이지가 전송되는 경우, 사용자가 해당 웹페이지를 열람함으로써 웹페이지에 포함된 부적절한 스크립트가 실행되는 공격 - 특수문자 등록을 방지하기 위해 특수문자 필터링
- HTML 태그 사용금지(특히, < 문자사용 시 &lt로 변환처리)
- 자바스크립트로 시작하는 문자열은 모두 문자열 변환처리
사이트 간 요청 위조
(CSRF; Cross-Site
Request Forgery)
사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 하는 공격 - 입력화면 폼을 작성 시 GET 방식보다 POST 방식 사용
- 입력 폼과 입력처리 프로그램에서 세션별 CSRF 토큰을 사용하여 점검
- 중요기능의 경우 재인증을 통해 안전하게 실제 요청 여부를 확인하도록 구현
SQL 삽입
(Injection)
응용 프로그램의 보안 취약점을 이용해서 악의적인 SQL 구문을 삽입, 실행시켜서 데이터베이스(DB)의 접근을 통해 정보를 탈취하거나 조작 등의 행위를 하는 공격기법 - 바인딩 매개변수 방식을 적용하여 사전에 변수 타입을 명시적으로 지정
- 사용자로부터 입력될 수 있는 모든 값을 체크하여 필터링
- Servlet Filter 기능 적용(Java에서만 적용)

 

[1-1] XSS (Cross Site Scripting) 공격 유형

취약점 설명
Stored XSS 방문자들이 악성 스크립트가 포함된 페이지를 읽어 봄과 동시에 악성 스크립트가 브라우저에서 실행되면서 감염되는 기법
Reflected XSS 공격용 악성 URL을 생성한 후 이메일로 사용자에게 전송하면 사용자가 URL 클릭 시 즉시 공격 스크립트가 피해자에게 반사되어 접속 사이트에 민감정보를 공격자에게 전송하는 기법
DOM(Document
Object Model XSS)
공격자는 DOM 기반 XSS 취약점이 있는 브라우저를 대상으로 조작된 URL을 이메일을 통해 발송하고 피해자가 URL 클릭 시 공격 피해를 당하는 방법

 

[1-2] XSS 공격 방식

번호 공격 절차
1 임의의 XSS 취약점이 존재하는 서버에 XSS 코드를 작성하여 삽입 저장
2 해당 웹 서비스 사용자가 공격자가 작성해 놓은 XSS 코드에 접근
3 사용자가 XSS 코드가 저장된 페이지에 정보를 요청
4 사용자의 시스템에서 XSS 코드 실행
5 XSS 코드가 실행된 결과가 공격장게 전달되고 공격자는 결과를 가지고 웹 서버에서 2차 해킹 시도

 

[2] CSRF(Cross-Site Request Forgery) 공격 방식

번호 공격 절차
1 공격자는 CSRF 스크립트가 포함된 게시물을 등록
2 사용자는 CSRF 스크립트가 포함된 페이지의 게시물 열람 요청
3 게시물을 읽은 사용자의 권한으로 공격자가 원하는 요청 발생
4 공격자가 원하는 CSRF 스크립트 결과가 발생

 

** XSS는 악성코드가 클라이언트 PC에서 실행되서 클라이언트 PC의 정보가 공격자에게 탈취되는 공격방식이고, CSRF는 공격자의 악의적인 요청이 클라이언트로 하여금 희생자의 서버에서 실행되게 되는 공격

** CSRF 공격을 받는 피해자는 희생자 은행 사이트에 접속해서 피해자의 계좌에서 공격자의 계좌로 돈을 이체시키는 행위를 나도 모르게 하게 됨

** XSS와 CSRF의 차이점은 XSS는 사용자만 피해를 입고, CSRF는 웹서버, 사용자 모두 피해를 입음

 

[3] SQL 삽입(Injection)

번호 공격 절차
1 응용 프로그램의 취약점 탐지
2 악의적인 SQL 구문 삽입하여 인증 우회
3 권한이 상승되어 DB의 정보 탈취 및 조작 실행

3) 보안 기능

(1) 보안 기능 개념

 

  • 소프트웨어 개발 단계에서 인증, 접근제어, 기밀성, 암호화, 권한 관리 등을 적절하게 구현하기 위한 보안 점검 항목들이며, 각 보안 기능들은 서비스 환경이나 취급 데이터에 맞게 처리될 수 있도록 구현해야 함

(2) 보안 기능 취약점

 

  • 보안 기능에 대한 점검을 수행하여 적절한 인증 없이 중요 기능 허용, 부적절한 인가, 취약한 암호화 알고리즘 사용, 중요 정보의 평문 저장 및 전송, 하드 코드 된 비밀번호 등의 보안 취약점을 방지해야 함
취약점 설명 대책
적절한 인증 없이
중요한 기능 허용
보안 검사를 우회하여 인증과정 없이 중요정보 또는 기능에 접근 및 변경이 가능 중요정보나 기능을 수행하는 페이지에서는 재인증 기능을 통해 방지
부적절한 인가 접근제어 기능이 없는 실행 결로를 통해 정보 또는 권한 탈취 모든 실행 경로에 대해 접근제어 감사를 수행하고, 사용자에게는 반드시 필요한 접근권한만 부여하여 방지
취약한 암호화 알고리즘 사용 암호화된 환경설정 파일을 해독하여 비밀번호 등의 중요정보 탈취 안전한 암호화 알고리즘, 안정성이 인증된 암호 모듈을 이용하여 방지
중요 정보 평문 저장 및 전송 암호화되지 않은 평문 데이터를 탈취하여 중요 정보 획득 가능 중요한 정보 저장 및 전송 시 반드시 암호화 과정을 거치도록 하고, HTTPS, SSL/TLS 등의 보안 채널을 이용하여 방지
하드 코드 된 비밀번호 프로그램 코드 내부에 패스워드 포함시 관리자 정보가 노출될 수 있는 보안 취약점 패스워드는 암호화하여 별도 파일에 저장하고 소프트웨어 설치 시 직접 패스워드나 키를 입력하도록 설계하여 방지
취약한 패스워드 요구 조건 취약한 사용자 패스워드 조합 규칙에 따른 사용자 계정 보안 취약점 패스워드 생성 시 강한 조건 검증 필요

4) 에러 처리

(1) 에러 처리 개념

 

  • 프로그램 실행 시 발생하는 에러를 예외 처리하지 못하거나, 에러 정보에 중요한 정보(프로그램 정보, 상세한 에러 내역 등)가 포함될 때 발생할 수 있는 취약점을 예방하기 위한 보안 점검 항목들
  • 각 프로그래밍 언어의 예외 처리 구문을 통해 오류에 대한 사항을 정의하지 않으면 중요정보를 노출시키거나, 소프트웨어의 실행이 중단되는 등 예기치 못한 문제를 발생시킴

(2) 에러 처리 취약점

취약점 설명 대책
오류 메세지를 통한
정보 노출
프로그램이 실행환경, 사용자, 관련 데이터에 대한 민감한 정보를 포함하는 오류 메세지를 생성하여 공격자의 악성 행위를 도와주는 보안 취약점 - 에러 메세지는 정해진 사용자에게 유용한 최소한의 정보만 표현
- 예외 사항을 내부적으로 처리하고 사용자에게 민감한 정보를 포함하는 오류 출력 금지
오류 상황 대응 부재 오류가 발생할 수 있는 부분을 확인하였으나, 이러한 오류에 대하여 예외 처리를 하지 않았거니 미비로 인해 발생하는 보안 약점 오류가 발생할 수 있는 부분에 예외 처리 구문을 작성하고, 제어문을 활용하여 오류를 악용하지 않도록 코딩
적절하지 않은 예외 처리 프로그램 수행 중에 함수의 결괏값에 대한 적절한 처리 또는 예외상황에 대한 조건을 적절하게 검사하지 않을 경우 예기치 않은 문제를 일으킬 수 있는 보안 약점 값을 반환하는 모든 함수의 결괏값을 검하하여 그 값이 기대한 값인지 검사하고, 예외 처리를 사용하는 경우에는 광범위한 예외 처리 대신 구체적인 예외 처리를 통해 방

5) 세션 통제

(1) 세션 통제(Session Control) 개념

 

  • 다른 세션 간 데이터 공유 등 세션과 관련되어 발생할 수 있는 취약점을 예방하기 위한 보안 점검 항목들임
  • 이미 연결이 종료된 클라이언트의 정보가 사용 가능한 상태로 방치되는 경우 허가되지 않은 사용자가 시스템에 접근할 수 있는 보안 약점이 있으므로 안전한 세션 통제 정책이 적용되기 위해 세션 정보를 안전하게 관리해야 함

(2) 세션 통제 취약점

취약점 설명 대책
불충분한 세션 관리 - 인증 시 일정한 규칙이 존재하는 세션 ID 발급
- 세션 타입아웃을 길게 설정한 경우 공격자에 의해 사용자 권한이 도용
클래스 변수는 세션 간에 공유되는 데이터가 되므로 클래스 설계 시 세션 정보를 읽고 쓰기가 가능한 변수를 사용하지 않도록 설계

6) 코드 오류

(1) 코드 오류 개념

 

  • 소프트웨어 구현 단계에서 프로그램 변환시 오류, 서버의 리소스 자원(메모리 등)의 부적절한 반환(버퍼 오버플로) 등 개발자가 흔하게 실수하는 프로그램 오류를 예방하기 위한 보안 점검 항목들

(2) 코드 오류 취약점

취약점 설명 대책
널 포인터 역참조 - 일반적으로 그 객체가 Null이 될 수 없다. 라고 하는 가정을 위반했을 때 발생
- 대부분 운영체제 에서 널 포인터는 메모리의 첫 주소를 가리키며, 해당 주소를 참조할 경우 소프트웨어가 비정상적으로 종료
- 공격자가 의도적으로 Null 포인터 역참조를 실행하는 경우, 그 결과 발생하는 예외 사항을 추후에 공격자가 악용할 수 있음
Null이 될 수 있는 레퍼런스는(Reference) 참조하기 전에 Null값인지를 검사하여 안전한 경우에만 사용
정수를 문자로 변환 정수를 문자로 변환하면서 표현할 수 없는 범위의 값이 잘려나가 문자에 대한 저장 값이 올바르지 않은 보안 취약점 정수를 문자로 변환할 경우, 변환 값의 크기가 변환값이 저장되는 변수의 크기보다 크지 않도록 함
부적절한 자원 해제 힙 메모리, 소켓 등 프로그램 자원 사용 후, 프로그램 오류로 인해 종료된 자원을 반환 하지 못했을 때 발생할 수 있는 보안 취약점 자원을 획득하여 사용한 다음에는 finally 블록에서 반드시 자원이 반환 되도록 코딩함으로써 방지
초기화 되지 않은 변수 사용 - 초기화 되지 않은 변수 사용은 변수 선언 후 값이 부여되지 않은 변수를 사용할 때 발생 할 수 있는 보안 취약점
- 변수가 선언되어 메모리가 할당되면 해당 메모리에 이전에 사용하던 내용이 계속 남아있어 변수가 외부에 노출되는 경우 중요정보가 악용될 수 있음
변수 선언시 할당된 메모리를 초기화함으로써 방

 

** 널 포인터(Null Pointer) : 널은 값이 없음을 의미하며, 포인터(Pointer)는 메모리의 위치를 가리키는 요소로서 널 포인터는 포인터에 널이 저장되어 어떠한 곳도 가리키지 못하는 상태의 요소임

7) 캡슐화

(1) 캡슐화 개념

 

  • 외부에 은닉이 필요한 중요 데이터와 필요한 기능성을 불충분하게 캡슐화 했을 때 인가되지 않은 사용자에게 데이터 유출, 권한 문제 등이 발생할 수 있는 보안 취약점 예방을 위한 보안 검증 항목

(2) 캡슐화 취약점

취약점 설명 대책
잘못된 세션에 의한 데이터 정보 노출 다중 스레드 환경에서 싱글톤(Singleton) 객체 필드에서 경쟁 조건(Race condition)으로 인해 동기화 오류가 발생하거나, 멤버 변수의 정보가 노출되는 보안 취약점 싱글톤 패턴을 사용하는 경우, 변수 범위(Scope)에 주의하고, 멤버 변수보다 지역 변수를 활용하여 변수의 범위를 제한함으로써 방지
제거되지 않고 남은 디버그 코드 디버깅 목적으로 삽입된 코드가 제거 되지 않음으로 인해 공격자에게 의도하지 않은 정보와 제어 정보가 누출될 수 있는 보안 취약점 디버거 코드는 개발 완료 후 삭제 처리
민감한 데이터를 가진 내부 클래스 사용 권한이 없는 클래스를 사용하고자 할 때 발생하는 취약점 내부 클래스 사용 시 외부 클래스의 접근 금지
시스템 데이터 정보 노출 시스템, 관리자 DB 정보 등 시스템의 내부 데이터를 시스템 메시지 등을 통해 외부로 출력하도록 코딩했을 때 발생하는 보안 취약점 시스템 메세지를 통해 노출되는 메세지는 최소한의 정보만 제공함으로써 방지

8) API 오용

(1) API 오용 개념

 

  • 서비스에서 제공되는 이용에 반하는 방법으로 API를 이용하거나 보안에 취약한 API를 오용하여 발생할 수 있는 보안 취약점 예방을 위한 보안 검증 항목

(2) API 오용 취약점

취약점 설명 대책
DNS Lookup에
의존한 보안 결정
- 도메인명에 의존하여 인증이나 접근 통제 등의 보안 결정을 내리는 경우 발생하는 보안 약점
- DNS 엔트리를 속여 동일한 도메인에 속한 서버인 것처럼 위장하거나, 사용자와 서버 간의 네트워크 트래픽을 유도하여 악성 사이트를 경우하도록 조작할 수 있음
- 보안 결정에서 도메인명을 이용한 DNS Lookup을 하지 않도록 함
- DNS 이름 검색 함수를 사용한 후 조건문에서 인증 여부를 수행하는 것보다 IP 주소를 이용하는 것이 DNS 이름을 직접 사용하는 것보다 안전
위험하다고 알려진
함수 사용
보안 취약점을 고려하지 않고 개발되어 사용자체가 취약한 함수들의 보안 취약점
ex) strcpy 함수(글자 수 상관없이 문자열 복사가 가능하여 위험)
안전한 함수 사용
ex)strncpy 함수(문자열 복사 시 글자 길이 지정)
널(Null) 매개변수
미검사
자바표준에서 특정 메서드 사용 시 매개변수가 널인경우 지정된 값을 반환하지 못해 발생하는 예기치 못한 동작에 대한 보안 취약점 널 여부를 점검하는 과정을 거친 후 사용해야 함