9장 : 소프트웨어 개발 보안 구축(5과목)
1. Secure SDLC (Secure Software Development Life Cycle, 보안 소프트웨어 개발 생명 주기) ★★★
- SDLC에 보안 강화를 위한 프로세스를 포함시킨 것
1-2. 요구사항 분석 단계에서의 보안 활동
- 요구사항을 식별하는 작업
- 보안 요소별로 등급을 구분
- 보안 정책 항목들의 출처, 요구 수준, 세부 내용 등을 문서화
1-3. 설계 단계에서의 보안 활동
- 소프트웨어 설계서에 보안 요구사항을 반영
- 네트워크 : 방화벽을 설치
- 서버 : 보안이 좋은 운영체제를 사용
- 물리적 보안 : 출입 통제, 개발 공간의 제한, 폐쇄 회로 감시
- 개발 프로그램 : 허가되지 않은 프로그램을 통제
1-4. 구현 단계에서의 보안 활동
- 지속적인 단위 테스트를 통해 보안 취약점을 최소화
- 소스 코드의 안정성을 확보
- 시큐어 코딩: 구현 단계에서 발생할 수 있는. 보안 취약점들을 최소화하기 위해 보안 요소들을 고려하며 코딩하는 것
1-5. 테스트 단계에서의 보안 활동
- 설계 단계에서 식별된 위협들의 해결 여부를 검증
- 모든 결과를 문서화
1-6. 유지보수 단계에서의 보안 활동
- 보안 패치를 실시한다.
2. 세션 통제
- 세션 : 서버와 클라이언트의 연결을 의미
- 세션 통제 : 세션의 연결로 인해 발생하는 정보를 관리하는 것
- 세션 통제는, 연결만을 관리할 뿐, 접근 권한을 통제하지 않음
- 요구사항 분석 및 설계 단계에서 진행
2-1. 세션 관련 약점
불충분한 세션 관리 | 일정한 규칙이 존재하는 세션ID의 발급이 이루어지는 경우 타임아웃이 너무 길게 설정된 경우 |
잘못된 세션에 의한 정보 노출 | 다중 스레드 환경에서, 멤버 변수에 정보를 저장할 때 발생하는 보안 약점 동기화 오류가 발생하거나, 멤버 변수의 정보가 노출 멤버 변수보다 지역 변수를 활용하여 범위를 제한한다면 방지 가능 |
2-2. 세션 설계 시 고려 사항
- 모든 페이지에서 로그아웃이 가능해야 함
- 로그아웃 요청 시, 할당된 세션이 완전히 제거되어야 함
- 타임아웃은 중요도가 높다면 2~5분, 낮으면 15~30분으로 설정
- 이전 세션이 종료되지 않으면, 새 세션이 생성되면 안 됨
3. 입력 데이터 검증 및 표현의 보안 약점
종류 | 정의 | 막는 방법 |
SQL 삽입 | 응용 프로그램의 보안 취약점을 이용해 악의적인 SQL구문을 삽입/실행해 데이터베이스에 접근하여 정보 탈취, 조작 |
예약어 및 특수문자가 입력되지 않게 함 |
경로 조작 및 자원 삽입 | 경로 순회 공격을 막는 필터를 사용 | |
크로스 사이트 스크립팅 (XSS) | 검증되지 않은 외부 입력 데이터가 포함된 웹페이지가 전송되는 경우, 사용자가 해당 페이지를 열람했을 때 웹 페이지에 포함된 부적절한 스트립트가 실행 |
'<', '>', '&' 등의 문자를 다른 문자로 치환 |
운영체제 명령어 삽입 | 웹 인터페이스를 사용 | |
위험한 형식 파일 업로드 | 확장자 제한, 파일명의 암호화 | |
신뢰되지 않은 URL 주소로 자동 접속 연결 |
화이트 리스트로 관리 | |
사이트 간 요청 위조(CSRF) | 사용자가 자신의 의지와 무관하게 공격자가 의도한 행위를 특정 웹 사이트에 요청하게 공격 |
4. 보안 기능의 보안 약점
종류 | 막는 방법 |
적절한 인증 없이 중요 기능 허용 | 재인증 기능을 수행 |
부적절한 인가 | 모든 경로에 대해 검사를 수행하고, 반드시 필요한 접근 권한만 부여 |
중요한 자원에 대한 잘못된 권한 설정 | 관리자만 읽고 쓸 수 있도록 |
취약한 알고리즘 사용 | 안전한 알고리즘을 이용 |
중요 정보 평문 저장 및 전송 | 저장 또는 전송 시 암호화 과정 |
하드코드된 비밀번호 | 암호화하여 별도로 저장 |
4. 널 포인터 역참조 (Null Pointer)
- 널 포인터가 가리키는 메모리에 어떠한 값을 저장할 때, 발생하는 보안 약점
- 대부분의 운영체제에서, 널 포인터는 메모리의 첫 주소를 가리키며 이 주소를 참조할 경우 SW의 비정상적 종료가 가능
- 널 포인터를 접근하기 전에, 널 값을 가지는지 검사함으로써 방지 가능
5. 암호 알고리즘
암호화 방식 | 양방향 방식 | 개인키 | 속도가 빠름 단순 파일의 크기가 작음 사용자가 증가하면, 관리할 키의 수가 증가 |
DES, AED, SEED, ARIA 등 |
공개키 | 속도가 느림 복잡 파일의 크기가 큼 키의 분배가 쉬움 관리할 키의 수가 적음 |
RSA 등 | ||
단방향 방식 | HASH | 고정된 길이의 값이나 키로 변환 |