본문 바로가기

정보처리기사 실기/06. 보안엔지니어링

[2020 정보처리기사 실기 - 소프트웨어 개발 보안 구축] 2. 소프트웨어 개발 보안 구현하기 (1)

 

 

* 소스코드 구현단계의 보안 약점 유형

- 소스코드 구현단계에서 제거 조치를 해야 하는 보안약점은 SW 개발보안 가이드 기준으로 7개 카테고리에 47개 항목으로 정의

   입력데이터 검증 및 표현, 보안기능, 시간 및 상태, 에러처리, 코드오류, 캡슐화, API오용

- 소스코드 구현단계에서 제거 조치 해야하는 47개 보안약점 중

  입력값 검증,  보안기능 등 설계단계에서 미리 검토되어야 하고

  시간 및 상태 카테고리 등 소스코드 코딩 단계에서만 고려되어야 하는 항목도 있음

 

 

* 카테고리별 주요 보안약점 및 조치 방안

 

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

 

 (1) SQL 삽입

   - 해커가 웹사이트의 입력값이나 URL에 SQL문을 삽입하여 DB로부터 정보를 열람하거나 조작, 파괴할 수 있는 보안약점

   - preparedStatement객체를 이용하거나 myBatis등의 프레임워크를 이용해서 SQL구문에 입력변수가 정적 바인딩되도록 구현

   - 정적바인딩은 입력변수를 SQL 구문에 정적인 변수로써 입력되도록 하는 것으로써

     정적바인딩이 될 경우 해커가 SQL 구문변경을 하고자 특수문자를 입력하더라도,

     특수문자가 포함된 입력변수로 해석할 뿐 SQL 구문이 변경되지 않음

 

(2) 경로 조작 및 자원 삽입

   - 외부 입력값을 검증없이 시스템 자원을 식별하거나 접근하는 용도로 사용하도록 구현된 경우

     입력값 조작을 통해 보호가 필요한 내부자원에 임의로 접근하여 내부 정보 유출, 조작, 서비스 장애를 유발할 수 있는 보안약점

   - 외부 입력값을 자원의 직접적인 식별자로 사용하지 않는 것이 바람직

     식별자로 사용해야하는 경우, 입력값이 적정한지 검증해야하고 파일명을 호출하는 경우 "../","\"등 경로순회 문자 먼저 제거

 

(3) 크로스사이트 스크립트 XSS

   - 외부입력값을 이용해서 웹페이지를 동적으로 구성하는 경우

     웹 페이지를 사용자의 권한으로 부적절한 스크립트 실행을 유도함으로써, 정보유출 등의 문제를 유발할 수 있는 보안약점

   - 외부 입력값을 통한 스크립트 실행이 불가능하도록

     외부 입력값의 입력경로에서 <> &등 특수문자를 &lt; &gt; &amp; &quot로 치환하고

     출력경로에서 정보를 HTML 인코딩함으로써 스크립트 실행을 차단해야함

 

(4) 운영체제 명령어 삽입

   - 외부 입력값을 검증하는 시스템 내부 운영체제의 명령어로 실행하도록 구현된 경우

     입력값 조작을 통해 의도치 않은 운영쳋제 명령어가 실행됨으로써 시스템 동작문제를 유발할 수 있는 보안약점

   - 외부 입력값을 직접적인 운영체제 명령어로 사용하지 않는 것이 바람직

     사용해야하는 경우 명령어 목록을 미리 생성하고 외부 입력값을 통해 선택하도록 구현해야함

 

(5) 위험한 형식 파일 업로드

   - Web Shell 파일 등과 같은 실행 가능한 스크립트 파일을 서버로 업로드 가능하고

     외부에서 웹브라우저를 통해 업로드파일에 접근하여 실행할 수 있는 경우 시스템의 제어권이 탈취될 수 있는 보안 약점

   - 허용된 확장자만 업로드를 허용하고 업로드된 파일을 저장할 때는 파일명과 확장자를 추측불가능한 임의의 문자열로 변경해야 함

     파일 저장경로를 오이부에서 직접 접근이 불가능 하도록 외부에 저장해야하며 파일이 실행되지 않도록 실행 속성을 제거해야 함

   - 시스템에 대한 가용성 공격을 대응하고자 하는 경우 업로드되는 파일의 개수, 크기 제한을 추가로 구현해야 함

 

(6) 신뢰되지 않은 URL로 자동 접속 연결

   - 외부 입력값을 검증없이 자동 연결 URL 주소로 사용하도록 구현된 경우

     입력값 조작을 통해 위험한 URL로 접속되어 피싱 등의 피해를 유발할 수 있는 보안약점

   - 자동 연결한 URL 주소는 허용목록으로 등록하고 외부 입력된 URL이 허용목록에 포함되어 있는지 검증해야 함

 

(7) 크로스사이트 요청위조 CSRF

   - 사용자가 인지하지 못한 상태에서 사용자의 권한으로 사용자의 의도와는 무관하게 공격자가 의도한 행위를 요청하는 보안약점

   - 입력화면 폼 작성시 GET대신 POST를 사용, 입력화면 폼과 서버 프로그램 사이에 토큰을 사용하여,

     공격자의 URL 직접 호출이 동작되지 않도록 처리해야하며, 중요 기능에 대해서 CAPTCHA 입력 혹은 사용자 재인증 유도

 

(8) 정수형 오버플로우

   - 배열의 크기 설정 등에 사용되는 정수값이 허용된 가장 큰 값보다 커짐으로써

     실제 저장되는 값이 의도치 않게 아주 작은 수거나 음수가 되어 발생하는 보안 약점

   - 언어 플랫폼별 정수타입의 범위를 확인하고, 정수형 변수를 연산에 사용하는 경우 결과값의 볌위를 체크해야하고,

     외부입력값을 동적 메모리 할당에 사용하는 경우, 변수값이 적절한 범위 내에 존재하는 값인지 확인해야 함

 

(9) 보안기능 결정에 사용되는 부적절한 입력값

   - 인증이나 권한관리와 같은 보안 기능이 쿠키, 환경변수, 히든 필드 등 외부 입력값을 기반으로 하여 수행되는 경우

     프로그램의 보안기능을 우회할 수 있는 보안약점

   - 사용자의 세션정보 등 중요 정보는 서버에 저장, 보안 확인 절차 및 페이지 포워드 등 후속처리 절차 또한 서버에서 수행,

     외부 입력값에 의존할 필요가 없는 구조로 변경하는 것이 바람직

 

(10) 메모리 버퍼 오버플로우

   - 연속된 메모리 공간을 사용하는 프로그램에서 할당된 메모리 범위를 넘어선 위치에 자료를 읽거나 쓰게 됨으로써

     오동작을 유발시키거나 악의적인 코드를 실행시켜 공격자가 프로그램을 통제할 수 있는 권한을 획득하게 되는 보안약점

   - 메모리 버퍼를 사용할 경우 적절한 버퍼의 크기를 설정하고,

     설정된 범위의 메모리 내에서 올바르게 읽거나 쓸 수 있도록 통제해야하며,

     버퍼 오버플로우를 유발할 수 있는 gets() strcpy() strcat() 등의 함수 대신 fgets() strcpy_s() strcat_s()등 사용

 

 

 

2) 보안기능

 

(1) 인증 및 비밀번호 관련 보안약점

적절한 인증 없는 중요기능 허용, 반복된 인증시도 제한 기능 부재, 취약한 비밀번호 허용 등 보안약점에 대한 안전한 조치방안 필요

- 적절한 인증없는 중요기능 허용 : (조치) 업무상 중요 정보, 기능 제공사에 인증기능을 구현하고  필요시 재인증 적용

- 반복된 인증시도 제한 기능 부재 : 인증시도 횟수를 적절히 제한하고 인증실패 횟수 초과 경우 잠그거나 추가적 인증과정 

- 취약한 비밀번호 허용 : 이전 비밀번호 사용 금지, 변경 주기, 비밀번호 생성 규칙

 

(2) 권한관리 관련 보안약점

부적절한 인가, 중요한 자원에 대한 잘못된 권한 설정 등의 보안약점에 대한 안전한 조치 방안 적용이 필요

- 부적절한 인가 : 프로그램이 제공하는 정보, 기능에 대한 접근권한이 있는지에 대해 사용자의 권한을 검사

- 중요한 자원에 대한 잘못된 권한 설정 : 자원에 대한 최소권한의 원칙 적용

 

(3) 암호연산 관련 보안약점

- 취약한 암호화 알고리즘 사용 : 이미 검증되고 국내외 표준화된 AES, SEED, ARIA 등의 알고리즘을 사용

- 충분하지 않은 키 길이 사용 : RSA 알고리즘은 최소 2048비트 이상,  대칭키는 최소 128비트 이상의 키를 사용

- 하드코드된 암호화 키 : 암호화 과정에서 사용하는 암호화키는 외부공간에 안전한 방식을 암호화하여 보관하고

                                             암호화된 암호화 키는 복호화하여 사용

- 적절하지 않은 난수값 사용 : 자바에서는 java.util.Random이나 java.security.SecureRandom 클래스 사용

                                                       C에서는 randomize(seed)를 사용

- 솔트없이 일방향 해시함수 사용 : 패스워드를 저장할 때 패스워드와 솔트를 결합하고 해시처리한 값을 저장

 

(4) 중요정보 처리 관련 보안 약점

- 중요정보 평문저장 : 법규상 지정되거나 정보보호 관점에서 중요한 기밀정보를 저장할 때 반드시 암호화 저장

- 중요정보 평문전송 : 중요정보를 정보통신망으로 전송할 경우 암호화 과정을 거치거나

                                        SSL 인증서기반의 전송구간 암호화를 적용하고 특히 개인정보를 전송할 때 의무적으로 적용

- 사용자 하드디스크에 저장되는 쿠키를 통한 정보노출 : 영속 쿠키에는 사용자 권한 등급, 세션ID 등 중요정보가 포함되지 않도록

 

(5) 보안기능의 기타 보안약점

- 주석문 안에 포함된 시스템 주요정보 : 주석에는 ID 패스워드 등 보안 관련 내용을 기입하지 않음

- 하드코드된 비밀번호 : DB접속 비밀번 등 저장이 될 중요한 정보는 별도의 파일에 암호화 하여 저장

- 무결성 검사없는 코드 다운로드 : 코드 전송시 암호화하여 변조를 방지하거나 체크섬 검사등의 방법을 통해 무결성 검사 수행

 

 

3) 시간 및 상태

 

(1) 경쟁조건 : 검사시점과 사용시점

- 동일 자원에 대한 검사시점과 사용시점이 달라 동기화 오류뿐만 아니라 교착상태 등과 같은 문제점을 유발할 수 있는 보안약점

- 파일과 같은 공유자원을 여러 프로세스가 접근하여 사용할 경우, 동기화 구현 을 사용하여

  한번에 하나의 프로세스만 접근해서 처리하도록하며, 성능 영향의 최소화를 위해 임계코드 주변만 동기화 구문을 사용

 

(2) 종료되지 않은 반복문 또는 재귀함수

- 종료조건이 없는 재귀함수, 무한루프로 자원고갈을 유발하여 정상적인 서비스를 제공할 수 없는 보안약점

- 재귀함수 사용시 종료조건을 정의하고 반복문도 흐름 검증을 통해 반복문이 종료될 수 있도록 구현

 

 

4) 에러처리

 

(1) 오류 메세지를 통한 정보 노출

- 응용프로그램 실행환경, 사용자 등에 대한 민감한 정보가 오류 메세지를 통해 외부에 노출되는 보안약점

- 소스코드의 예외 상황은 내부적으로 처리하고 사용자에게 민감한 정보를 포함하는 오류를 노출하지 않도록 미리 정의된 메세지 제공

 

(2) 오류 상황 대응 부재

- 오류가 발생할수 있는 부분 예외처리를 구현하지 않으면 공격자에 의해 의도하지 않은 프로그램 동작을 유발할 수 있는 보안약점

- C에서 if/switch, JAVA에서 try-catch등의 구문을 이용해서 오류가 발생할 부분에 대해 예외 처리 구현

 

(3) 부적절한 예외처리

- 예외상황에 대한 조건을 적절하게 검사하지 않을 경우 의도치 않은 시스템 문제 야기 또는 원인 분석을 어렵게 만드는 보안약점

- 함수의 결과값에 대한 적정성을 검증하고 예외처리할 경우 광범위한 예외 처리하는 대신 구체적인 예외 처리 수행

 

 

 

5) 코드오류

 

(1) 널 포인터 역참조

- 객체가 널이 될 수 없다는 전제로 구현된 콛에서 공격자가 의도적으로 객체가 널인 상황을 유발하는 경우

   발생하는 예외상황을 이용하여 추후의 공격을 계획하는 데 사용될 수 있는 보안약점

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

 

(2) 부적절한 자원 해제

- 열린 파일 디스크립터, 힙 메모리, 소캣 등의 유한한 자원을 할당 받아 사용 후

   프로그램 오류나 에러로 인해 사용이 끝난 자원을 반환하지 못하는 경우 자원 고갈로 인한 시스템 오류를 유발하는 보안약점

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

 

(3) 해제된 자원 사용

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

- 동적으로 할당된 메모리를 해제한 후에 해당 메모리에 다시 접근하지 않도록 해야하며

   메모리 해제 후 포인터에 널 값 등을 저장하여 의도하지 않은 코드의 실행을 방지해야 함

 

(4) 초기화되지 않은 변수 사용

- C언어에서 함수내 지역변수를 초기화하지 않고 사용할 경우 임의값을 사용하게 되어 의도하지 않은 결과를 유발할 수 있는 보안약점

- 모든 변수는 사용하기 전에 초기값을 할당해야 함

 

 

6) 캡슐화

 

(1) 잘못된 세션에 의한 데이터 정보노출

- 하나의 프로그램에서 하나의 인스턴스만 생성해야하는 싱글톤객체에 포함되는멤버 변수는 전역범위로 공유되고

   멀티 스레드 환경인 java 서블릿의 경우 서로 다른 세션 간에 데이터가 공유될 수 있는 보안약점

- 싱글톤 패턴을 사용할 경우 변수 적용 범위를 주의하며 특히 java의 경우 HttpSevlet의 하위 클래스에서 멤버변수 사용하면 안됨

 

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

- 개발 완료 후 배포단계에서 디버그용 코드가 남아있는 경우 의도하지 않은 민감정보나 제어정보가 노출될 수 있는 보안 약점

- SW 배포 전 반드시 디버그 코드를 확인 및 삭제

 

(3) 시스템 데이터 정보노출

- 시스템, 관리자, DB 정보 등 시스템의 내부 데이터가 노출됨으로써 공격자에게 공격의 실마리 제공하는 보안약점

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

 

(4) PUBLIC 메서드로부터 반환된 PRIVATE 배열

- PRIVATE 배열을 PUBLIC 메서드가 반환하면 배열주소값이 외부 공개, 외부에서 배열 수정이 가능해지는 보안 약점

- PRIVATE 배열을 PUBLIC 메서드를 통해 반환하지 않도록 하고,

  필요시 배열의 복제본을 변환하거나, 배열을 처리하는 별도의 PUBLIC 메서드를 선언하여 사용

 

(5) PRIVATE 배열에 PUBLIC 데이터 할당

- PUBLIC으로 선언된 데이터 또는 메서드의 파라미터를 PRIVATE 배열에 저장하면

   PRIVATE배열을 외부에서 접근할 수 있게 되는 보안 약점

- PUBLIC으로 선언된 데이터가 PRIVATE으로 선언된 배열에 저장되지 않도록 함

 

 

7)API오용

 

(1) DNS에 의존한 보안 결정

- 도메인 명에 의존하여 인증, 인가 등 보안결정응ㄹ 수행하도록 구현된 경우,

   공격자가 DNS 정보를 변조할 경우 보안결정을 우회할 수 있게 되는 보안약점

- 보안 결정시 DNS Lookup을 통해 도메인명 정보대신 IP주소를 사용

 

(2) 취약한 API 사용

- 보안상 금지되거나 부주의하게 사용될 가능성이 높은 함수를 사용하는 보안약점

- 보안 관련 문제로 사용이 금지된 함수 대신 이를 대체하는 안전한 함수 사용