정보처리기사 실기/소프트웨어 개발 보안 구축

소프트웨어 개발 보안 구현

· 코딩마이데이

시큐어 코딩 가이드

SW 보안 취약점, 약점 및 대응 방안이 구체적으로 서술

구분 내용
입력 데이터 검증 및 표현 소스코드 취약점 점검
API 이용 시스템 접근 API 오용
보안 특성 인증, 접근 제어, 기밀성, 암호화, 권한 관리, 취약점 알고리즘, 부적절 인가로 인한 취약점
시간 및 상태 프로세스 동시 수행 시, 잘못된 권한위임 가능성
에러 처리 에러 처리가 부적절하거나 에러에 정보가 과도하게 많이 포함된 경우
코드 품질 복잡한 소스코드가 가독성과 유지 보수성을 저하함.
캡슐화 중요 데이터의 불충분한 캡슐화로 악의적 접근 가능

 

SW 개발보안 구현을 위한 시큐어 코딩

1. 소프트웨어 개발보안 측면의 시큐어 코딩의 목적

(1) 보안 취약점과 결함방지

최근 사이버 공격의 진화에 따라 사전에 정보처리시스템의 보안취약점을 사전에 대응하고 SQL injection 취약점, Zero Day Attack 공격, 침입차단시스템(TMS System) 등 보안장비의 우회 등과 같은 보안 취약점을 사전에 제거하여 개

 

(2) 안전한 대고객 서비스 확대

대부분의 대고객 서비스가 ICT신기술을 통하여 인터넷을 통해 제공되면서, 대고객 서비스의 보안취약점을 제거에 효율적 관리 방안을 마련

 

(3) 안정성 및 신뢰성 확보

대고객 서비스의 신뢰성을 기반으로 하는 안정성에 기반한 보안확보를 위해 정보시스템의 기초 단계부터 설계 개념 및 시큐어 코드의 수준에서의 대응 조치를 제안하여 대고객 서비스의 보안성을 강화

 

2. SW보안을 위한 시큐어 코딩의 점검내용

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

이용자, 프로그램에서 입력되는 데이터에 대한 유효성 사전 검증체게를 갖추고, 오류 발생 시 처리가 가능하도록 개발을 수행

보안 약점 설명
SQL삽입 사용자의 입력 값 등 외부 입력 값이 SQL 쿼리에 삽입되어 공격
자원 삽입 외부 입력된 값의 사전 감증이 없거나 또는 잘못 처리된 검증을 거쳐서 제공되는 시스템 자원에 접근 경로 등의 정보로 이용될 때 발생
크로스사이트
스크립트
검증되지 않은 외부 입력 값에 의해 브라우저에서 악의적인 코드가 실행되는 보안약점
운영체제
명령어 삽입
운영체제(OS) 명령어 파라메터 입력 값이 적절한 시전검증을 거치기 않고 사용되어 공격자가 운영체제 명령어를 조작할 수 있는 보안약점
기타 신뢰성이 낮은 URL 주소로 자동으로 접속되는 LDAP 삽입, 디렉토리 경로 조작, 연결 크로스사이트 요청 위초, XQuery 삽입, XPath 삽입, HTTP 응답분할 등

 

SQL 삽입 공격

SELECT * FROM MEMBER WHERE id = 'janu1' AND password = 'star123'

SELECT * FROM MEMBER WHERE id = ' ' OR 1 = 1 -- janu1' AND password = 'star123'

설계시 고려사항
애플리케이션에서 DB연결을 통해 데이터를 처리하는 경우 최소 권한이 설정된 계정 사용.
외부입력값을 이용해 동적으로 SQL 쿼리문을 생성해야 하는 경우, 입력값에 대한 검증을 수행한 뒤 사용.

 

크로스 사이트 스크립트(XSS) 공격

웹 애플리케이션에서 일어나는 취약점으로 관리자가 아닌 권한이 없는 사용자가 웹 사이트에 스크립트를 삽입하는 공격 기법

설계시 고려사항
사용자로부터 입력 받은 값을 동적으로 생성되는 응답페이지에 사용하는 경우 크로스사이트스크립트(XSS) 필터링을 수행한 뒤 사용해야 한다.
DB조회결과를 동적으로 생성되는 응답페이지에 사용하는 경우 HTML 인코딩 또는 크로스사이트스크립트(XSS) 필터링릏 수행한 뒤 사용해야 한다.

 

2) 보안기능

보안기능(인증, 접근제어, 기밀성, 암호화, 권환 권리 등)을 적절히지 않게 구현 시 발생할 수 있는 보안약점이다.

보안 약점 설명
적절한 인증 없는
중요기능 허용
적절하지 못한 인증 없이 중요정보(개인정보, 계좌이체 정보 등)를 열람 또는 변경 가능한 보안 취약점
부적절한 인가 적절하지 못한 접근제어로 외부 입력 파라미터 값이 포함된 문자열로 서버 인프라 자원에 접근되고나 (또는 서버 실행 인가) 가능케 하는 보안약점
중요한 자원에 대한
잘못된 권한설정
중요한 자원(프로그램 설정 값, 민감한 사용자 데이터의 노출 등)에 대한 적절하지 못한 접근권한을 부여되어, 의도치 않게 중요정보가 노추르 수정되는 보안약점
취약한 암호화
알고리즘 사용
중요한 민감성 정보(패스워드, 개인정보 등)의 기밀성이 취약한 암호화 알고리즘을 사용하여 정보가 노출되는 보안 취약점

 

인증 수행 제한

가. 취약점 개요

로그인 시도에 대한 횟수를 체크하지 않으면 로그인 시도 횟수가 초과 되었을 때 계정에 대한 보호조치가 설정되어 있지 않은 경우 패스워드 무작위 대입공격이 시도될 수 있다.

 

나. 설계시 고려사항

① 로그인 기능 구현시, 인증시도 횟수제를 제한하고, 초과된 인증코드에 대해 인증제한 정책을 적용해야 한다.

② 실패한 인증시도에 대한 정보를 로깅하여 인증시도 실패가 추적될 수 있게 해야 한다.

 

비밀번호 관리

가. 취약점 개요

사례1 : 취약한 비밀번호 사용

회원가입시에 안전한 패스워드 규칙이 적용되지 않아서 취약한 패스워드로 회원가입이 가능할 경우 무차별 대입 공격을 통해 패스워드가 노출될 수 있음.

사례2 : 취약한 비밀번호 복구

패스워드 복구 메커니즘(아아디/패스워드 찾기 등)이 취약한 경우 공격자가 불법적으로 다른 사용자의 패스워드를 획득, 변경, 복구할 수 있음.

사례3 : 하드코드왼 비밀번호

프로그램 코드 내부에 하드코드된 패스워드를 포함하고, 이를 이용하여 내부 인증에 사용하거나 외부 컴포넌트와 통신을 하는 경우, 관리자 정보가 노출될 수 있어 위험하다. 또한, 코드 내부에 하드코드된 패스워드가 인증실패를 야기하는 경우, 시스템 관리자가 그 실패의 원인을 파악하기 쉽지 않음.

 

나. 설계시 고려사항

 

① 패스워드를 설정할 때 한국 인터넷진흥원 암호 이용 안내서의 패스워드 설정 규칙을 적용해야 함

② 네트워크를 통해 패스워드를 전송하는 경우 반드시 패스워드를 암호화하거나 암호화된 통신 채널을 이용해야 함

③ 패스워드 저장시, 솔트가 적용된 안전한 해시함수를 사용해야 하며, 해시 함수 실행은 서버에 해야 함

④ 패스워드 재설정/변경시 안전하게 변경할 수 있는 규칙을 정의해서 적용해야 함

⑤ 패스워크 관리 규칙을 정의해서 적용해야 함

중요자원 접근 통제

가. 취약점 개요

사례1 : 관리자 페이지 노출

관리자페이지가 인터넷을 통해 접근 가능할 경우, 공격자의 주 타겟이 되어, 공격자의 SQL 삽입, 무차별 대입공격 등 다양한형태의 공격의 별미를 제공하게 되는 취약접

사례2 : 부적절한 인가

프로그램이 모든 가능한 실행경로에 대해서 접근제어를 감사하지 않거나 불완전하게 검사하는 경우, 공격자는 접근 가능한 실행경로를 통해 정보를 유출할 수 있는 취약점

사례3 : 중요자원에 대한 잘못된 권한 설정

SW가 중요한 보안관련 자원에 대하여 읽기 또는 수정받기 권한을 의도하지 않게 허가할 경우 권한을 갖지 않는 사용자가 해당 자원을 사용하게 될 수 있는 취약점

 

나. 설게시 고려사항

RBAC(Role Based Access Control : 역할기반 접근제어) 모을 사용하여 기업, 정부 등 다수의 사용자와 정보객체들로 구성된 조직체계에서 사용자에게 할당된 역할을 기반으로 권한을 부여하도록 설계

중요자원에 대한 접근통제 정책을 수립하여 적용

중요기능에 대한 접근통제 정책을 수립하여 적용

관리자 페이지에 대한 접근통제 정책을 수립하여 적용

 

접근 통제

 

3) 시간 및 상태

프로그램 실행 중에 동시에 수행되는 병렬 처리 시스템, 다수의 프로세스가 실행되는 환경에서 시간과 실행 상태를 부적절하게 처리되어 발생 가능한 보안 취약점

보안 약점 설명
경쟁조건: 검사시점과
사용시점
다수의 멀티 프로세스 상에서 인프라 지원을 체크하는 시점과 사용되는 시점이 달라서 발생하는 보안 취약점
제어문을 사용하지
않는 재귀함수
적절한 제어문 처리가 되어있지 않는 재귀함수에서 무한재귀가 (무한루프) 발생하는 보안약점

 

4) 에러 처리 표현

에러를 처리하지 않거나, 불충분하게 처리하여 에러 정보에 중요정보(시스템 등)가 포함될 때 발생할 수 있는 보안약점

보안 약점 설명
부적절한 오류 메시지 개발자가 에러 처리 활용을 위하여 오류정보의 출력메시지를 배포될 서비스 버전의 소프트웨어에 오류 메시지 또는 디버깅 메시지를 소스 내에 포함시킬 때 발생하는 보안 약점
오류 상황 대응 부재 시스템에서 발생되는 오류를 처리하지 못하여 프로그램 다운등 의도하지 못하는 경우가 발생할 수 있는 보안 취약점
적절하지 않은
예외처리
예외에 대한 부적절한 처리로 인해 의도하지 않은 상황이 발생될 수 있는 보안 약점

 

5) 코드 오류

프로그램의 형(type) 변환 오류, 인프라 자원(메모리 사용현황 등)의 적절하지 못한 반환 값 등과 같이 개발자가 범할 수 있는 개발 오류로 인해 발생되는 보안약점

보안 약점 설명
널(Null) 포인터 역참조 Null값으로 설정된 중여 변수의 메모리 주소 값을 참조했을 때 발생하는 보안 취약점
부적절한 자원 해제 사용되는 리소스 자원을 적절하게 해제하지 못하면 리소스 자원의 누수 등이 발생하고, 리소스 자원이 부족하여 새로운 입력에 처리 못하게 되는 보안 취약점

 

Null Pointer 역참조

가. 개요

널 포인터(Null Pointer) 역참조는 '일반적으로 그 객체가 널(Null)이 될 수 없다'라고 하는 가정을 위반했을 때 발생했을 때 발생한다. 공격자가 의도적으로 널 포인터 역참조를 빌생시키는 경우, 그 결과가 발생하는 예외 상황을 이용하여 추후의 공격을 계획하는 데 사용될 수 있음.

 

나. 보안대책

널이 될 수 있는 레퍼런스(Reference0는 참조하기 전에 널 값인지를 감사하여 안전한 경우에만 사용

 

부적절한 자원 해제

가. 개요

프로그램의 자원, 예를 들면 열린 파일디스크립트(Open File Decriptor), 힙 메모리(Heap Memory), 소켓(Socket) 등은 유한한 자원

이러한 자원을 할당받아 사용한 후, 더 이상 사용하지 않는 경우에는 적절히 반환하여야 하는데, 프로그램 오류 또는 에러로 사용이 끝난 자원을 반환하지 못하는 경우

 

나. 보안대책

자원을 획득하여 사용한 다음에는 반드시 자원을 해제하여 반환

 

해제된 자원 사용

가. 개요

C언어에서 동적 메모리 관리는 보안 취약점을 유발하는 대표적인 프로그램 결함의 원인

해제한 메모리를 참조하게 되면 예상치 못한 값 또는 코드를 실행하게 되어 의도하지 않은 결과가 발생

 

나. 보안대책

동적으로 할당된 메모리를 해제한 후 그 메모리를 참조하고 있던 포인터를 참조 추적이나 형 변환, 수식에서의 피연산자 등으로 사용하여 해제된 메모리에 접근하도록 해서는 안됨.

또한, 메모리 해제 후, 포인터에 널(Null)값을 저장하거나 다른 적절한 값을 저장하면 의도하지 않은 코드의 실행을 막을 수 있음.

 

초기화되지 않은 변수 사용

가. 개요

C언어의 경우 스택 메모리에 저장되는 지역변수는 생성될 때 자동으로 초기화되지 않음

초기화되지 않은 변수를 사용하게 될 경우 임의 값을 사용하게 되어 의도하지 않은 결과를 출력하거나 예상치 못한 동작을 수행할 수 있음

 

나. 보안대책

초기화되지 않은 스택 메모리 영역의 변수는 임의 값이라 생각해서 대수롭지 않게 생각할 수 있으나 사실은 이전 함수에서 사용되었던 내용을 포함하고 있음.

공격자는 이러한 약점을 사용하여 메모리에 저장되어 있는 값을 읽거나 특정 코드를 실행

모든 변수를 사용 전에 반드시 올바른 초기값을 할당함으로써 이러한 문제를 예방

 

6) 캡슐화

중요한 데이터를 은닉하기 위한 확장개념이라고 볼 수 있으며, 캡슐화는 객체들의 내부와 외부 간의 분리 역할을 수행하고 사용자에게 상세 구현을 감추고 필요사항만 보이게 함으로써, 객체의 속성과 메소드를 다른 객체가 접근할 수 없도록 하기 떄문에 메시지 수신에 의해 요구된 작업을 수행함. 따라서 소프트웨어의 부품의 재사용증대와, 소프트웨어의 수정, 시험, 유지보수성이 향상되는 효과가 있음.

보안 약점 설명
잘못된 세션에 의한
정보 노출
잘못된 통신 세션에 의해 권한없는 사용자에게 데이터 노출이 일어날 수 있는 보안 취약점
제거되지 않고 남은
디버그 코드
프로그램 디버깅을 위해 작성된 코드를 통해 권한이 없는 사용자 인증이 우회되거나, 또는 중요 정보에 접근이 가능해지는 보안약점
시스템 데이터
정보 노출
사용자가 볼 수 있는 에러처리 메시지나 오류가 스택 정보에 시스템 내부 데이터나 내부 로직 등 디버깅 관련 정보가 공개되는 보안 취약점

 

세션통제

세션은 클라이언트와 서버의 논리적인 연결

이미 연결이 종료된 클라이언트의 정보가 삭제되지 않고 사용가능한 상태로 방치되는 경우

해당 연결을 탈취한 허가되지 않은 사용자에 의해 시스템의 의해 시스템의 기능이 사용되거나 다른 개인의 중요정보에 접근하는 침해사고를 발생시킬 수 있으므로 안전한 세션 통제 정책이 적용되어야 함.

또한, 사용자가를 구분하기 위한 세션 ID를 안전하게 관리하지 않으면 세션 하이재킹과 같은 허가되지 않은 사용자가 시스템

을 사용할 수 있게 되므로 반드시 언전하게 관리해야 함.

 

* 세션 하이재킹이란?

시스템에 접근할 적법한 사용자 아이디와 패스워드를 모를 경우 공격 대상이 이미 시스템에 접속되어 세션이 연결되어 있는 상태를 가로채기 하는 공격으로 아이디와 패스워드를 몰라도 시스템에 접근하여 자원이나 데이터를 사용할 수 있는 공격

 

제거되지 않고 남은 디버그 코드

가. 개요

디버깅 목적으로 삽입되는 코드는 개발이 완료되면 제거해야 함

디버그 코드는 설정 등의 민감한 정보를 담거나 시스템을 제어하게 허용하는 부분을 담고 있을 수 있음

만일, 남겨진 채로 배포될 경우, 공격자가 식별 과정을 우회하거나 의도하지 않은 정보와 제어 정보가 노출될 수 있음

 

나. 보안대책

소프트웨어 배포 전, 반드시 디버그 코드를 확인 및 삭제함.

일반적으로 Java 개발자의 경우 웹 응영프로그램을 제작할 깨 디버그용도의 코드를 main() 에 개발한 후 이를 삭제하지 않는 경우가 많음

디버깅이 끝나면 main() 메소드를 삭제해야 함.

 

시스템 데이터 정보노출

가. 개요

시스템, 관리자, DB 정보 등 시스템의 내부 데이터가 공개되면, 공격자에게 또 다른 공격의 빌미를 제공하게 됨

 

나. 보안 대책

일부 개발자의 경우 예외상황이 발생할 경우 시스템 메시지 등의 정보를 화면에 출력하도록 하는 경우가 많음

예외상황이 빌생할 때 시스템의 내부 정보가 화면에 출력되지 않도록 개발

 

다. API 오용

의도된 사용에 반하는 방법으로 API를 사용하거나, 보안에 취약한 API를 사용하여 발생할 수 있는 보안약점

보안 약점 설명
DNS lookup에 의존한
보안 결정
보안결정을 DNS 이름에 의존할 경우, DNS는 공격자에 의해 DNS 스푸핑 공격 등이 가능하게 되는 보안결정 등이 노출되는 보안약점

 

DNS lookup에 의존한 보안결정

가. 개요

도메인명에 의존에서 보안결정(인증 및 접근 통제 등)을 내리는 경우 발생하는 보안 약점

만약, 로컬 DNS 서버의 캐시가 공격자에 의해 오염된 상황이라면, 사용자와 특정 서버간의 네트워크 트래픽이 공격자를 경유하도록 할 수도 있음.

또한, 공격자가 마치 동일 도메인에 속한 서버인 것처럼 위장할 수도 있음.

 

나. 보안대책

보안결정에서 도메인명을 이용한 DNS lookup을 하지 않도록 함.