-
Secure SDLC의 개요
- 보안상 안전한 소프트웨어를 개발하기 위해 SDLC에 보안 강화를 위한 프로세스를 포함한 것
- 유지 보수 단계에서 보안 이슈를 해결하기 위해 소모되는 많은 비용을 최소화하기 위해 등장
- 방법론에는 CLASP, SDL
-
요구사항 분석 단계에서의 보안 활동
- 보안 항목에 해당하는 요구사항을 식별하는 작업을 수행, 문서화
- 보안 요소
- 기밀성(Confidentiality)
- 무결성(Integrity)
- 가용성(Avalibility)
- 인증(Authentication)
- 부인 방지(Nonrepudiation) : 부인 할 수 없게 증거 제공
-
설계 단계에서의 보안 활동
-
식별된 보안 요구사항들을 소프트웨어 설계서에 반영하고, 보안 설계서를 작성
-
소프트웨어에서 발생할 수 있는 위협을 식별하여 보안 대책, 소요예산, 사고 발생시 영향 범위와 대응책 등을 수립
-
네트워크, 서버, 물리적 보안, 개발 프로그램 등 환경에 대한 보안통제 기준을 수립. 설계에 반영
-
-
구현 단계에서의 보안 활동
- 표준 코딩 정의서 및 소프트웨어 개발 보안 가이드를 준수하며, 설게서에 따라 보안 요구사항들을 구현
- 개발 과정 중에는 지속적인 단위 테스트를 통해 소프트웨어에 발생할 수 있는 보안 취약점을 최소화
- 코드 점검 및 소스 코드 진단 작업을 통해 소스 코드의 안정성을 확보
- 시큐어 코딩
- 소프트웨어의 구혀 단게에서 발생할 수 있는 보안 취약점들을 최소화하기 위해 보안 요소들을 고려하며 코딩하는 것
-
테스트 단게에서의 보안 활동
- 설계 단계에서 작성한 보안 설계서를 바탕으로 보안 사항들이 정확히 반영되고 동작되는지 점검
- 동적 분석 도구 또는 모의 침투 테스트를 통해 설계 단계에서 식별된 위협들의 해결여부를 검증
- 문서화하여 보존, 개발자에게 피드백
-
유지보수 단계에서의 보안 활동
- 이전 과정을 모두 수행하였음에도 발생할 수 있는 보안사고들을 식별하고, 사고 발생 시 이를 해결하고 보안 패치를 실시
-
세션 통제의 개요
- 서버와 클라이언트의 연결을 의미하고, 셔션 통제는 세션의 연결과 연결로 인해 발생하는 정보를 관리하는 것을 의미
- 소프트웨어 개발 과정 중 요구사항 분석 및 설계 단계에서 진단해야하는 보안 점검 내용
-
불충분한 세션 관리
- 일정한 규칙이 존재하는 세션ID가 발급되거나 타임아웃이 너무 길게 설정되어 있는 경우 발생할 수 있는 보안 약점
- 세션 관리가 충분하지 않으면 침입자는 세션 하이재킹과 같은 공격을 통해 획득한 세션ID로 인가되지 않은 시스템의 기능을 이용하거나 중요한 정보에 접근할 수 있음
-
잘못된 세션에 의한 정보 노출
- 다중 스레드 환경에서 멤버 변수에 정보를 저장할 때 발생하는 보안 약점
- 싱글톤 패턴에서 발생하는 레이스컨디션으로 인해 동기화 오류가 발생하거나, 멤버 변수의 정보가 노출될 수 있음
- 멤버 변수보다 지역 변수를 활용하여 변수의 범위를 제한함으로써 방지할 수 있음
-
세션 설계시 고려 사항
- 모든 페이지에서 로그아웃이 가능하도록 UI를 구성
- 로그아웃 요청 시 할당된 세션이 완전히 제거되도록 함
- 이전 세션이 종료되지 않으면 새 세션이 생성되지 못하도록 설계
- 중복 로그인을 혀용하지 않은 경우 클라잉너트의 중복 접근에 대한 세션 관리 정책을 수립
- 패스워드 변경 시 활성화된 세션을 삭제하고 재할당
-
세션ID의 관리 방법
- 안전한 서버에서 최소 128비트의 길이로 생성
- 예측이 불가능하도록 안전한 난수 알고리즘을 적용
- 노출되지 않도록 URL Rewrite(URL에 세션ID를 포함하는 것) 기능을 사용하지 않는 방향으로 설계
- 로그인 시 로그인 전의 세션ID를 삭제하고 재할당
- 장기간 접속하고 있는 세션ID는 주기적으로 재할당되도록 설계
-
입력 데이터 검증 및 표현의 개요
- 입력 데이터로 인해 발생하는 문제들을 예방하기 위해 구현 단계에서 검증해야 하는 보안 점검 항목들
- 유효성 검증 체계를 갖추고, 검증되지 않은 데이터가 입력되는 경우 이를 처리할 수 있도록 구현
- 입력 데이터를 처리하는 객체에 지정된 자료형이 올바른지 확인하고, 일관된 언어셋을 사용하도록 코딩
-
입력 데이터 검증 및 표현의 보안 약점
- SQL 삽입
- 동적 쿼리에 사용되는 입력 데이터에 예약어 및 특수문자가 입력되지 않게 필터링 되도록 설정하여 방지
- 경로 조작 및 자원 삽입
- 사용자 입력값을 식별자로 사용하는 경우, 경로 순회 공격을 막는 필터를 사용하여 방지할 수 있음
- 크로스사이트 스크립팅(XSS)
- 웹페이지에 악의적인 스크립트를 삽입하여 방문자들의 정보를 탈취하거나, 비정상적인 기능 수행을 유발하는 보안 약점
- HTML 태그의 사용을 제한하거나 스크립트에 삽입되지 않도록 '<', '>', '&' 등의 문자를 다른 문자로 치환함으로써 방지할 수 있음
- 운영체제 명령어 삽입
- 웹 인터페이스를 통해 시스템 명령어가 전달되지 않도록 하고, 외부 입력값을 검증 없이 내부 명령어로 사용하지 않음으로써 방지할 수 있음
- 위험한 형식 파일 업로드
- 업로드 되는 파일의 확장자 제한, 파일명의 암호화, 웹사이트와 파일 서버의 경로 분리, 실행 속성을 제거하는 등의 방법으로 방지
- 신뢰되지 않는 URL 주소로 자동접속 연결
- 연결되는 외부 사이트의 주소를 화이트 리스트로 관리함으로써 방지
- SQL 삽입
-
보안 기능의 개요
- 소프트웨어 개발의 구현 단계에서 코딩하는 기능인 인증, 접근제어, 기밀성, 암호화 등을 올바르게 구현하기 위한 보안 점검 항목들
- 사용자 별로 중요도를 구분, 차별화도니 인증 방안을 적용
- 개별적으로 접근 권한을 부여하여 인가되지 않은 기능과 데이터로의 접근을 차단
- 암호화 기술을 적용
-
보안 기능의 보안 약점
- 적절한 인증 없이 중요기능 허용
- 재인증 기능을 수행하도록 하여 방지
- 부적절한 인가
- 모든 실행경로에 대해 접근제어 검사를 수행하고, 사용자에게는 반드시 필요한 접근 권한 만을 부여하여 방지
- 중요한 자원에 대한 잘못된 권한 설정
- 소프트웨어 관리자만 자원들을 읽고 쓸 수 있도록 설정하고, 인가되지 않은 사용자의 중요 자원에 대한 접근 여부를 검사함으로써 방지
- 취약한 암호화 알고리즘 사용
- 안전한 암호화 알고리즘을 이용, 업무관련 내용이나 개인정보 등에 대해서는 IT 보안인증 사무국이 안정성을 확인한 암호모듈을 이용함으로써 방지
- 중요정보 평문 저장 및 전송
- 암호화 과정을 거치도록 하고, HTTPS 또는 SSL과 같은 보안 채널을 이용함으로써 방지
- 하드코드된 비밀번호
- 패스워드는 암호화하여 별도의 파일에 저장하고, 디폴트 해스워드나 디폴트 키의 사용을 피함으로써 방지
- 적절한 인증 없이 중요기능 허용
-
에러처리의 개요
- 소프트웨어 실행 중 발생할 수 있는 오류들을 사전에 정의하여 오류로 인해 발생할 수 있는 문제들을 예방하기 위한 보안 점검 항목
- 각 프로그래밍 언어의 예외처리 구문을 통해 오류에 대한 사항을 정의
- 에러처리의 미비로 인한 코딩이 유발하는 보안 약점에는 오류 메시지를 통한 정보 노출, 오류 상황 대응 부재, 부적절한 예외처리 등이 있음
-
오류 메시지를 통한 정보노출
- 오류 발생으로 실행 환경, 사용자 정보, 디버깅 정보 등의 중요 정보를 소프트웨어가 메시지로 외부에 노출하는 보안 약점
- 예외처리 구문에 예외의 이름이나 스택 트레이스를 출력하도록 코딩한 경우 해커는 소프트웨어의 내부구조를 쉽게 파악할 수 있음
-
오류 상황 대응 부재
- 소프트웨어 개발 중 예외처리를 하지 않았거나 미비로 인해 발생하는 보안 약점
- 오류가 발생할 수 있는 부분에 예외처리 구문을 작성하고, 제어문을 활용하여 오류가 악용되지 않도록 코딩함으로써 방지
-
부적절한 예외처리
- 함수의 반환값 또는 오류들을 세분화하여 처리하지 않고 광범위하게 묶어 한 번에 처리하거나, 누락된 예외가 존재할 때 발생하는 보안 약점
-
코드 오류의 개요
- 소트으웨어 구현 단계에서 개발자들이 코딩 중 실수하기 쉬운 형(Type) 변환, 자원 반환 등의 오류를 예방하기 위한 보안 점검 항목들
- 넌 포인터 역참조, 부적절한 자원해제, 해제된 자원 사용, 초기화되지 않은 병수 사용이 있음
-
널 포인터(Null Pointer) 역참조
- 널 포인터가 가리키는 메모리에 어떠한 값을 저장할 때 발생하는 보안 약점
- 많은 라이브러리 함수들이 오류가 발생할 경우 널 값을 반환하는데, 이 반환값을 포인터로 참조하는 경우 발생
-
부적절한 자원 해제
- 자원을 반환하는 코드를 누락하거나 프로그램 오류로 할당된 자원을 반환하지 봇했을 때 발생하는 보안 약점
- 힙 메모리, 소켓 등의 유한한 시스템 자원이 계속 점유하고 있으면 자원 부족으로 인해 새로운 입력을 처리하지 봇 할 수 있음
- 프로그램 내에 자원 반환 코드가 누락되었는지 확인하고, 오류로 인해 함수가 중간에 종료되었을 때 예외처리에 관계없이 자원이 반환되도록 코딩함으로써 방지
-
해제된 자원 사용
- 이미 사용이 종료되어 반환된 메모리를 참조하는 경우 발생하는 보안 약점
- 반환된 메모리에 접근할 수 없도록 주소를 저장하고 있는 포인터를 초기화함으로써 방지
-
초기화되지 않은 변수 사용
- 변수 선언 후 값이 부여되지 않은 변수를 사용할 때 발생하는 보안 약점
-
암호 알고리즘의 개요
- 패스워드, 주민번호, 은행계좌와 같은 중요정보를 보호하기 위해 평문을 암호화된 문장으로 만드는 절차 또는 방법을 의미
- 해시(Hash)를 사용하는 단방향 암호화 방식과, 개인키 및 공개키로 분류되는 양방향 암호화 방식이 있음
-
개인키 암호화(Private Key Encryption) 기법
- 동일한 키로 데이터를 암호화하고 복호화
- 데이터베이스 사용자는 평문의 정보 M을 암호화 알고리즘 E와 개인키(Private Key) K를 이용하여 암호문 C로 바꾸어 저장시켜 놓으면 사용자는 그 데이터베이스에 접근하기 위해 복호화 알고리즘 D와 개인키 K를 이용하여 다시 평문의 정보 M으로 바꾸어 이용하는 방법
- 대칭 암호 기법 또는 단일키 암호화 기법이라고도 함
- 한번에 하나의 데이터 블록을 암호화 하는 블록 암호화 방식과, 평문과 동일한 길이의 스트림을 생성하여 비트 단위로 암호화 하는 스트림 암호화 방식으로 분류됨
- 종류
- 블록 암호화 방식 : DES, SEED, AES, ARIA
- 스트림 암호화 방식 : LFSR, RC4
- 장점 : 암호화/복호화 속도가 빠르며, 알고리즘이 단순하고, 공개키 암호 기법보다 파일의 크기가 작음
- 단점 : 사용자의 증가에 따라 관리해야 할 키의 수가 상대적으로 많아짐
-
공개키 암호화(Pubilc Key Encryption) 기법
- 데이터를 암호화할 때 사용하는 공개키는 데이터베이스 사용자에게 공개하고, 복호화할 때의 비밀키(Secret Key)는 관리자가 비밀리에 관리
- 데이터베이스 사용자는 평문의 정보 M을 암호화 알고리즘 E와 공객키 P를 이용하여 암호문 C로 바꾸어 저장시켜 놓고, 이를 복호화하기 위해서는 비민키와 복호화 알고리즘에 권한이 있는 사용자만이 복호화 알고리즘D와 비밀키 S를 이용하여 다시 평문의 정보 M으로 바꿀 수 있는 기법
- 비대칭 암호 기법이라고도 하며, 대표적으로는 RSA(Rivest Shamir Adleman) 기법이 있음
- 장점 : 키의 분배가 용이하고, 관리해야 할 키의 개수가 적음
- 단점 : 암호화/복호화 속도가 느리며, 알고리즘이 복잡하고, 개인키 암호화 기법보다 파일의 크기가 큼
-
양방향 알고리즘 종류
- SEED
- 한국인터넷진흥원(KISA)에서 개발한 블록 암호화 알고리즘
- 블록 크기 128비트이며, 키 길이에 따라 128, 256으로 분류
- ARIA(Academy Research Institute Agency)
- 국가정보원과 산합연협회가 개발한 블록 암호화 알고리즘
- ARIA는 학계(Academy), 연구기관(Research Institute), 정부(Agency)의 영문 앞글자로 구성
- 블록 크기는 128비트이며, 키 길이에 따라 128, 192, 256으로 분류됨
- DES(Data Encryption Standard)
- 미국 NBS에서 발표한 개인키 암호화 알고리즘
- DES를 3번 적용하여 보안을 더욱 강화한 3DESeh dlTdma
- 블록 크기는 64비트이며, 키 길이는 56비트
- AES(Advanced Encryption Standard)
- 미국 표준 기술 연구소(NIST)에서 발표한 개인키 암호화 알고리즘
- DES의 한계를 느낀 NIST에서 공모한 후 발표
- 블록 크기는 128비트이며, 키 길이에 따라 128, 192, 256으로 분류
- RSA(Rivest Shamir Adleman)
- MIT의 Rivest, Shamir, Adelman 에 의해 제안된 공개키 암호화 알고리즘
- 큰 숫자를 소인수분해 하기 어렵다느 것에 기반하여 만들어짐
- 공개키와 비밀키를 사용하는데, 여기서 키란 메시지를 열고 잠그는 상수(Constant)를 의미
- SEED
-
해시(Hash)
- 임의의 길이의 입력 데이터나 메시지를 고정된 길이의 값이나 키로 변환하는 것을 의미
- 해시 함수라고 부르며, 해시 함수로 변환된 값이나 키를 해시값 또는 해시키라고 부름
- 데이터의 암호화, 무결성 검증을 위해 사용될 뿐만 아니라 정보보호의 다양한 분야에서 활용
- 해시 함수의 종류에는 SHA 시리즈, MD5, N-NASH, SNEFRU 등이 있음