Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 자바의 정석 기초편 ch13
- 2024 정보처리기사 수제비 실기
- 자바의 정석 기초편 ch11
- @Aspect
- 스프링 mvc1 - 서블릿
- jpa - 객체지향 쿼리 언어
- 자바의 정석 기초편 ch14
- jpa 활용2 - api 개발 고급
- 스프링 db1 - 스프링과 문제 해결
- 자바의 정석 기초편 ch12
- 자바 기본편 - 다형성
- 자바의 정석 기초편 ch2
- 2024 정보처리기사 시나공 필기
- 스프링 고급 - 스프링 aop
- 자바의 정석 기초편 ch1
- 스프링 mvc2 - 타임리프
- 스프링 mvc2 - 로그인 처리
- 자바의 정석 기초편 ch5
- 자바의 정석 기초편 ch6
- 자바의 정석 기초편 ch9
- 스프링 입문(무료)
- 자바의 정석 기초편 ch7
- 스프링 mvc1 - 스프링 mvc
- 스프링 mvc2 - 검증
- 게시글 목록 api
- 자바의 정석 기초편 ch4
- 코드로 시작하는 자바 첫걸음
- 자바의 정석 기초편 ch3
- 자바의 정석 기초편 ch8
- 스프링 db2 - 데이터 접근 기술
Archives
- Today
- Total
나구리의 개발공부기록
3장 - 소프트웨어 개발 보안 구축 | 섹션24. 에러처리, 섹션25. 코드 오류, 섹션26. 캡슐화, 섹션27. 암호 알고리즘 본문
2024정보처리기사 준비 정리(필기 - 시나공, 실기 - 수제비)/필기 5강 - 정보시스템 구축 관리
3장 - 소프트웨어 개발 보안 구축 | 섹션24. 에러처리, 섹션25. 코드 오류, 섹션26. 캡슐화, 섹션27. 암호 알고리즘
소소한나구리 2024. 5. 8. 21:302024년도 시나공 필기 책 내용 정리
섹션24. 에러처리
1. 에러처리의 개요
- 소프트웨어 실행 중 발생할 수 있는 오류들을 사전에 정의하여 오류로 인해 발생할 수 있는 문제들을 예방하기 위한 보안 점검 항목들
- 각 프로그래밍 언어의 예외처리 구문을 통해 오류에 대한 사항을 정의
- 예외처리 구문으로 처리하지 못한 오류들은 중요정보를 노출시키거나 소프트웨어의 실행이 중단되는 등 예기치 못한 문제를 발생시킬 수 있음
2. 오류 메세지를 통한 정보노출
- 오류 발생으로 실행 환경, 사용자 정보, 디버깅 정보 등의 중요 정보를 소프트웨어가 메세지로 외부에 노출하는 보안 약점
- 오류 메세지를 통해 노출되는 경로 및 디버깅 정보는 해커의 악의적인 행위를 도울 수 있음
- 예외처리 구문에 예외의 이름이나 스택 트레이스를 출력하도록 코딩한 경우 해커는 소프트웨어의 내부구조를 쉽게 파악할 수 있음
- 오류 발생 시 가능한 한 내부에서만 처리되도록 하거나 메세지를 출력할 경우 최소한의 정보 또는 사전에 준비된 메세지만 출력되도록 함으로써 방지할 수 있음
3. 오류 상황 대응 부재
- 소프트웨어 개발 중 예외처리를 하지 않았거나 미비로 인해 발생하는 보안 약점
- 예외처리를 하지 않은 오류들로 인해 소프트웨어의 실행이 중단되거나 의도를 벗어난 동작이 유도될 수 있음
- 오류가 발생할 수 있는 부분에 예외처리 구문을 작성하고 제어문을 활용하여 오류가 악용되지 않도록 코딩함으로써 방지할 수 있음
4. 부적절한 예외처리
- 함수의 반환값 또는 오류들을 세분화하여 처리하지 않고 광범위하게 묶어 한번에 처리하거나, 누락된 예외가 존재할 때 발생하는 보안 약점
- 모든 오류들을 세세하게 정의하여 처리할 필요는 없지만 모든 오류들을 광범위한 예외처리 구문으로 정의해 버리면 예기치 않은 문제가 발생할 수 있음
- 함수 등이 예상했던 결과와 다른 값을 반환하여 예외로 처리되지 않은 경우 잘못된 값으로 인해 다양한 문제가 발생할 수 있음
- 모든 함수의 반환값이 의도대로 출력되는지 확인하고 세분화된 예외처리를 수행함으로써 방지할 수 있음
섹션25. 코드 오류
1. 코드 오류의 개요
- 소프트웨어 구현 단계에서 개발자들이 코딩 중 실수하기 쉬운 형변환 자원반환 등의 오류를 예방하기 위한 보안 점검 항목들임
2. 널 포인터(Null Pointer) 역참조
- 널 포인터가 가리키는 메모리에 어떠한 값을 저장할 때 발생하는 보안 약점
- 많은 라이브러리 함수들이 오류가 발생할 경우 널 값을 반환하는데, 이 반환값을 포인터로 참조하는 경우 발생함
- 대부분의 운영체제에서 널 포인터는 메모리의 첫 주소를 가리키며 해당 주소를 참조할 경우 소프트웨어가 비정상적으로 종료 될 수 있음
- 공격자가 널 포인터 역참조로 발생하는 예외상황을 악용할 수 있음
- 널이 될 수 있는 포인터를 이용하기 전에 널 값을 갖고 있는지 검사함으로써 방지할 수 있음
- 널포인터 역참조로 오류가 발생하는 경우 메모리 0x00000000을 참조하였습니다 라는 오류 메세지가 발생함
스택 가드(Stack Guard)
- 널 포인터 역참조와 같이 주소가 저장되는 스택에서 발생하는 보안 약점을 막는 기술 중 하나
- 메모리상에서 프로그램의 복귀 주소와 변수 사이에 특정 값을 저장한 후 그 값이 변경되었을 경우 오버플로우 상태로 판단하여 프로그램 실행을 중단함으로써 잘못된 복귀 주소의 호출을 막는 기술
3. 부적절한 자원 해제
- 자원을 반환하는 코드를 누락하거나 프로그램 오류로 할당된 자원을 반환하지 못했을 때 발생하는 보안 약점
- 힙 메모리, 소켓 등 유한한 시스템 자원이 계속 점유하고 있으면 자원 부족으로 인해 새로운 입력을 처리하지 못할 수 있음
- 프로그램 내에서 자원 반환 코드가 누락되었는지 확인하고, 오류로 인해 함수가 중간에 종료되었을 때 예외처리에 관계없이 자원이 반환되도록 코딩함으로써 방지할 수 있음
4. 해제된 자원 사용
- 이미 사용이 종료되어 반환된 메모리를 참조하는 경우 발생하는 보안 약점
- 반환된 메모리를 참조하는 경우 예상하지 못한 값 또는 코드를 수행하게 되어 의도하지 않은 결과가 발생할 수 있음
- 반환된 메모리에 접근할 수 없도록 주소를 저장하고 있는 포인터를 초기화함으로써 방지할 수 있음
5. 초기화되지 않은 변수 사용
- 변수 선언 후 값이 부여되지 않은 변수를 사용할 때 발생하는 보안 약점
- 변수가 선언되어 메모리가 할당되면 메모리에 이전에 사용하던 내용이 계속 남아있어 변수가 외부에 노출되는 경우 중요 정보가 악용될 수 있음
- 변수 선언 시 할당된 메모리를 초기화함으로써 방지할 수 있음
섹션26. 캡슐화
1. 캡슐화의 개요
- 정보 은닉이 필요한 중요한 데이터와 기능을 불충분하게 캡슐화 하거나 잘못 사용함으로써 발생할 수 있는 문제를 예방하기 위한 보안 점검 항목들
2. 잘못된 세션에 의한 정보 노출
- 다중 스레드 환경에서 멤버 변수에 정보를 저장할 때 발생하는 보안 약점
- 싱글톤 패턴에서 발생하는 레이스컨디션으로 인해 동기화 오류가 발생하거나 멤버 변수의 정보가 노출 될 수 있음
- 멤버 변수보다 지역 변수를 활용하여 변수의 범위를 제한함으로써 방지할 수 있음
3. 제거되지 않고 남은 디버그 코드
- 개발 중에 버그 수정이나 결과값 확인을 위해 남겨둔 코드들로 인해 발생하는 보안 약점
- 소프트웨어 제어에 사용되는 중요한 정보가 디버그 코드로 인해 노출 될 수 있음
- 디버그 코드에 인증 및 식별 절차를 생략하거나 우회하는 코드가 포함되어 있는 경우 공격자가 이를 악용할 수 있음
- 소프트웨어를 배포하기 전에 코드 검사를 통해 남아있는 디버그 코드를 삭제함으로써 방지할 수 있음
4. 시스템 데이터 정보 노출
- 시스템의 내부 정보를 시스템 메시지 등을 통해 외부로 출력하도록 코딩했을 때 발생하는 보안 약점
- 시스템 메세지를 통해 노출되는 메세지는 최소한의 정보만을 제공함으로써 방지 할 수 있음
5. Public 메소드로부터 반환된 Private 배열
- 선언된 클래스 내에서만 접근이 가능한 Private 배열을 모든 클래스에서 접근이 가능한 Public 메소드에서 반환할 때 발생하는 보안약점
- Public 메소드가 Private 배열을 반환하면 배열의 주소가 외부로 공개되어 외부에서 접근할 수 있게 됨
- Private 배열을 별도의 메소드를 통해 조작하거나, 동일한 형태의 복제본으로 반환받은 후 값을 전달하는 방식으로 방지할 수 있음
접근 지정자(접근 제어자)
한정자 | 클래스 내부 | 패키지 내부 | 하위 클래스 | 패키지 외부 |
Public | O | O | O | O |
Protected | O | O | O | X |
Default | O | O | X | X |
Private | O | X | X | X |
6. Private 배열에 Public 데이터 할당
- Private 배열에 Public 으로 선언된 데이터 또는 메소드의 파라미터를 저장할 때 발생하는 보안 약점
- Private 배열에 Public 데이터를 저장하면 Private 배열을 외부에서 접근할 수 있게 됨
- Public으로 선언된 데이터를 Private 배열에 저장할 때 레퍼런스(메모리의 위치를 공유, 참조 값)가 아닌 값을 직접 저장함으로써 방지할 수 있음
섹션27. 암호 알고리즘
1. 암호 알고리즘의 개요
- 패스워드, 주민번호, 은행계좌와 같은 중요정보를 보호하기 위해 평문을 암호화된 문장으로 만드는 절차 또는 방법을 의미함
- 암호 알고리즘은 해시(Hash)를 사용하는 단방향 암호와 방식과 개인키 및 공개키로 분류되는 양방향 암호화 방식이 있음
2. 개인키 암호화(Private Key Encryption)
- 동일한 키로 데이터를 암호화하고 복호화
- 데이터베이스 사용자는 평문의 정보 M을 암호화 알고리즘 E와 개인키 K를 이용하여 암호문 C로 바꾸어 저장시켜 놓으면 사용자는 그 데이터베이스에 접근하기 위해 복호화 알고리즘 D와 개인키 K를 이용하여 다시 평문의 정보 M으로 바꾸어 이용하는 방법
- 암호화 대상이 n개일 때 사용되는 키의 개수는 n(n-1)/2 임
- 대칭 암호 기법 또는 비밀키 암호화 기법이라고도 함
- 한번에 하나의 데이터 블록을 암호화 하는 블록 암호화 방식과, 평문과 동일한 길이의 스트림을 생성하여 비트/바이트/워드 단위로 암호화 하는 스트림 암호와 방식으로 분류됨
- 종류
- 블록 암호화 방식 : DES, SEED, AES, ARIA, IDEA
- 스트림 암호화 방식 : LFSR, RC4
- 장점 : 암호화/복호화 속도가 빠르며, 알고리즘이 단순하고 공개키 암호 기법보다 파일의 크기가 작음
- 단점 : 사용자의 증가에 따라 관리해야 할 키의 수가 상대적으로 많아짐
3. 공개키 암호화(Public key Encryption) 기법
- 데이터를 암호화할 때 사용하는 공개키는 데이터 베이스 사용자에게 공개하고, 복호화 할때의 비밀키는 관리자가 비밀리에 관리
- 데이터베이스 사용자는 평문의 정보 M을 암호화 알고리즘 E와 공개키 P를 이용하여 암호문 C로 바꾸어 저장시켜 놓고, 이를 복호화 하기 위해서는 비밀키와 ㅂ족호화 알고리즘에 권한이 있는 사용자만이 복호화 알고리즘 D와 비밀키 S를 이용하여 다시 평문의 정보 M으로 바꿀 수 있는 기법
- 암호화 대상이 n개일 때 사용되는 키의 개수는 2n
- 비대칭 암호 기법이라고도 하며, 대표적으로 RSA기법이 있음
- 장점 : 키의 분배가 용이하고 관리해야할 키의 개수가 적음
- 단점 : 암호화/복호화 속도가 느리며, 알고리즘이 복잡하고 개인키 암호화 기법보다 파일의 크기가 큼
공개키 기반 구조(PKI: Public Key Infrastructure)
- 공개키 암호 시스템을 안전하게 사용하고 관리하기 위한 정보 보호 표준 방식으로 ITU-T의 X.509방식과 비X.509 방식으로 구분됨
- X.509 방식 : 인증기관에서 발생하는 인증서를 기반으로 상호 인증을 제공
- 비X.509 방식 : 국가별, 지역별로 맞게 보완 및 개발
대표적인 양방향 알고리즘 종류 정리
SEED | 1999년 한국인터넷진흥원(KISA)에서 개발한 블록 암호화 알고리즘 블록 크기는 128비트이며 키 길이에 따라 128, 256으로 분류됨 |
ARIA(Academy, Research Insitute, Agency) |
2004년 국가정보원과 산학연협회가 개발한 블록 암호화 알고리즘 ARIA는 학계, 연구기관, 정부의 영문 앞글자로 구성되었음 블록 크기는 128비트이며 키 길이에 따라 128, 192, 256으로 분류됨 |
DES(Data Encryption Strandard) |
1975년 미국 NBS(NIST의 과거이름)에서 발표한 개인키 암호화 알고리즘 DES를 3번 적용하여 보안을 더욱 강화한 3DES도 있음 블록 크기는 64비트이며 키 길이는 56비트 |
AES(Advanced Encryption Strandard) |
2001년 미국 표준 기술 연구소(NIST)에서 발표한 개인키 암호화 알고리즘 DES의 한계를 느낀 NIST에서 공모한 후 발표 블록 크기는 128비트이며 키 길이에 따라 128, 192, 256으로 분류 |
RSA(Rivest Shamir Adleman) |
1978년 MIT의 라이베스트, 샤미르, 애들먼에 의해 제안된 공개키 암호화 알고리즘 큰 숫자를 소인수분해하기 어렵다는 것에 기반하여 만들어짐 공개키와 비밀키를 사용하는데 여기서 키란 메세지를 열고 잠그는 상수(Constant)를 의미함 |
ECC(Elliptic Curve Cryptography) |
1985년 RSA 암호 방식의 대안으로 제안됨 이산대수 문제를 타원곡선으로 옮겨 기밀성과 효율성을 높인 암호화 알고리즘 |
Rabin | 1979년 미하엘 라빈이 제안함 소인수분해의 어려움에 안정성의 근거를 둔 암호화 알고리즘 |
4. 해시(Hash)
- 임의의 길이의 입력 데이터나 메시지를 고정된 길이의 값이나 키로 변환하는 것을 의미
- 해시 알고리즘을 해시 함수라고 부르며 해시 함수로 변환된 값이나 키를 해시 값 또는 해시 키라고 부름
- 무결성 검증을 위해 사용될 뿐만 아니라 정보보의 다양한 분야에서 활용됨
- 복호화가 거의 불가능한 일방향 함수에 해당함
- 해시 함수의 종류
SHA 시리즈 | 1993년 미국 국가안보국(NSA)이 처음 설계했으며 미국 국립표준기술연구소에 의해 발표됨 초기 개발된 SHA-0이후 SHA-1이 발표되었고 SHA-2라 불리는 SHA-224, SHA-256, SHA-384, SHA-512가 발표됨 |
MD5 | 1991년 R.Rivest가 MD4를 대체하기 위해 고안한 암호화 해시 함수 블록 크기는 512비트이며 키 길이는 128비트 |
N-NASH | 1989년 일본의 전신전화주식회사(NTT)에서 발표한 암호화 해시 함수 블록 크기와 키 길이가 모두 128비트 |
SNEFRU | 1990년 R.C.Merkle가 발표한 해시 함수 32비트 프로세서에서 구현을 용이하게 할 목적으로 개발됨 블록 크기는 512비트이며 키 길이에 따라 128과 256으로 분류 됨 |
솔트(Salt)
- 둘 이상의 계정에 대해 패스워드를 qwer1234라고 지정하고 같은 암호화 알고리즘을 적용하게 되면 결과도 마찬가지로 동일하게 나타남 -> 이 경우 공격자가 나타난다면 하나의 암호만 해제해도 둘 이상의 계정을 얻게 되는데, 이를 방지하고자 암호화를 수행하기에 앞서 원문에 무작위의 값을 덧붙이는 과정을 수행하게 되는데 이 값을 솔트(Salt)라고 함
- 솔트를 사용하면 같은 패스워드에 대해 암호화를 수행하더라도 서로 다른 결과가 나타나게 되어 더 안전하게 암호화된 데이터를 관리할 수 있게 됨