일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 스프링 db2 - 데이터 접근 기술
- 자바의 정석 기초편 ch14
- 자바의 정석 기초편 ch7
- 스프링 고급 - 스프링 aop
- 스프링 mvc2 - 로그인 처리
- 자바의 정석 기초편 ch8
- 자바의 정석 기초편 ch1
- 자바의 정석 기초편 ch5
- 자바의 정석 기초편 ch9
- @Aspect
- 타임리프 - 기본기능
- 자바의 정석 기초편 ch13
- 스프링 mvc2 - 타임리프
- 스프링 mvc2 - 검증
- 자바의 정석 기초편 ch2
- 자바의 정석 기초편 ch6
- 게시글 목록 api
- 2024 정보처리기사 수제비 실기
- 스프링 db1 - 스프링과 문제 해결
- 코드로 시작하는 자바 첫걸음
- 자바의 정석 기초편 ch3
- 스프링 mvc1 - 서블릿
- 자바의 정석 기초편 ch11
- 스프링 입문(무료)
- 자바의 정석 기초편 ch4
- jpa - 객체지향 쿼리 언어
- 자바의 정석 기초편 ch12
- jpa 활용2 - api 개발 고급
- 스프링 mvc1 - 스프링 mvc
- 2024 정보처리기사 시나공 필기
- Today
- Total
나구리의 개발공부기록
CHAPTER 02 - 소프트웨어 개발 보안 구현(1) 본문
CHAPTER 02 - 소프트웨어 개발 보안 구현(1)
소소한나구리 2024. 7. 7. 15:222024년도 수제비 실기책(6판) 내용 정리
1. SW 개발 보안 구현
1) 시큐어 코딩 가이드(입보시에코캡A)
- 설계 및 구현 단계에서 해킹 등의 공격을 유발할 가능성이 있는 잠재적인 보안 취약점을 사전에 제거하고, 외부 공격으로부터 안전한 소프트웨어를 개발하는 기법
- 소프트웨어 보안 약점을 방지하기 위한 시큐어 코딩 가이드에 따른 개발 수행이 필요함
** 보안 취약점(Vulnerability) : 해킹 등 외부 공격으로 시스템의 보안정책을 침해하는 보안사고의 실제 원인이 되는 시스템상의 보안 허점, 운영 단계의 보안 리스크
** 보안 약점(Weakness) : 보안 취약점의 근본적인 원이이 되는 SW의 결함, 실수, 버그 등의 오류를 뜻함, 개발 단계의 보안 리스크
보안 약점 | 내용 | 대응방안 |
입력 데이터 검증 및 표현 |
프로그램 입력값에 대한 검증 누락 / 부적절한 검증, 잘못된 형식 지정 | 사용자 / 프로그램 입력 데이터에 대한 유효성 검증체계를 수립하고 실패 시 처리 설계 및 구현 |
보안 기능 | 보안 기능(인증, 접근 제어, 기밀성, 암호화, 권한 관리 등)의 부적절한 구현 | 인증 / 접근 통제, 권한 관리, 비밀번호 등의 정책이 적절하게 반영되도록 설계 및 구현 |
시간 및 상태 | 거의 동시에 수행 지원하는 병렬 시스템 또는 하나 이상의 프로세스가 동작하는 환경에서 시간 및 상태의 부적절한 관리 | 공유 자원의 접근 직렬화, 병렬 실행 가능 프레임워크 사용, 블록문 내에서만 재귀함수 호출 |
에러 처리 | 에러 미처리, 불충분한 처리 등으로 에러 메세지에 중요 정보가 포함 | 에러 또는 오류 상황을 처리하지 않거나, 불충분하게 처리되어 중요정보 유출 등 보안 약점이 발생하지 않도록 시스템 설계 및 구현 |
코드 오류 | 개발자가 범할 수 있는 코딩 오류로 인해 유발 | 코딩 규칙 도출 후 검증 가능한 스크립트 구성과 경고 순위의 최상향 조정 후 경고 메세지 코드 제거 |
캡슐화 | 기능성이 불충분한 캡슐화로 인해 인가되지 않은 사용자에게 데이터 누출 | 디버그 코드 제거와 필수 정보 외의 클래스 내 프라이빗 접근자 지정 |
API오용 | 의도된 사용에 반하는 방법으로 API를 사용하거나 보안에 취약한 API의 사용 | 개발 언어별 취약 API 확보 및 취약 API 검출 프로그램 사용 |
** 직렬화 : 데이터 구조나 오브젝트 상태를 다른 컴퓨터 환경으로 저장하고 재구성할 수 있는 포맷으로 변환하는 과정
2) 입력 데이터 검증 및 표현
(1) 입력 데이터 검증 및 표현 개념
- 입력 데이터 검증 및 표현은 입력 데이터로 인해 발생하는 문제들을 예방하기 위해 구현 단계에서 검증해야 하는 보안 점검 항목들임
- 입력 데이터로 인해 발생하는 문제를 예방하기 위해서는 소프트웨어 개발의 구현 단계에서 유효성 검증 체계를 갖추고 검증되지 않은 데이터의 입력을 처리할 수 있도록 구현해야 함
(2) 입력 데이터 검증 및 표현 취약점
취약점 | 설명 | 대책 |
XSS (Cross Site Scripting) |
검증되지 않은 외부 입력 데이터가 포함된 웹페이지가 전송되는 경우, 사용자가 해당 웹페이지를 열람함으로써 웹페이지에 포함된 부적절한 스크립트가 실행되는 공격 | - 특수문자 등록을 방지하기 위해 특수문자 필터링 - HTML 태그 사용금지(특히, < 문자사용 시 <로 변환처리) - 자바스크립트로 시작하는 문자열은 모두 문자열 변환처리 |
사이트 간 요청 위조 (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) 매개변수 미검사 |
자바표준에서 특정 메서드 사용 시 매개변수가 널인경우 지정된 값을 반환하지 못해 발생하는 예기치 못한 동작에 대한 보안 취약점 | 널 여부를 점검하는 과정을 거친 후 사용해야 함 |
'2024정보처리기사 준비 정리(필기 - 시나공, 실기 - 수제비) > 실기 9강 - 소프트웨어 개발 보안 구축' 카테고리의 다른 글
CHAPTER 03 - 소프트웨어 개발 보안 구현(기출문제, 예상문제) (0) | 2024.07.08 |
---|---|
CHAPTER 02 - 소프트웨어 개발 보안 구현(2) (0) | 2024.07.07 |
CHAPTER 01 - 소프트웨어 개발 보안 설계(예상문제) (0) | 2024.07.06 |
CHAPTER 01 - 소프트웨어 개발 보안 설계(기출문제) (0) | 2024.07.06 |
CHAPTER 01 - 소프트웨어 개발 보안 설계(2) (0) | 2024.07.06 |