가. 취약점 개요
사례1 : 경로 조작 및 자원 삽입
공격자가 입력값 조작으로 시스템이 보호하는 자원에 임의로 접근하여 자원의 수정·삭제, 시스템 정보누출, 시스템 자원 간 충돌로 인한 서비스 장애 등을 유발시킬 수 있는 취약점이다. 즉, 경로 조작 및 자원 삽입으로 공격자가 허용되지 않은 권한을 획득하여, 설정에 관계된 파일을 변경하거나 실행 시킬 수 있다.
사례2 : 입력값을 조작하여 허가되지 않은 명령 실행 적절한 검증절차를 거치지 않은 사용자 입력값에 의해 의도하지 않은 시스템 명령어가 실행되어 부적절하게 사용자 권한이 변경되거나 시스템 동작 및 운영에 악영향을 미칠 수 있다.
나. 설계시 고려사항
① 외부입력값을 이용하여 시스템자원(IP, PORT번호, 프로세스, 메모리, 파일 등)을 식별하는 경우 허가되지 않은 자원이 사용되지 않도록 해야 한다.
외부입력값이 프로그램 내부에서 사용하는 리소스를 결정하는데 직접적으로 사용되지 않도록 설계한다. 즉, 기능 설계시 사용해야 하는 리소스 목록을 정의하여 지정된 범위 안에서 리소스를 선택하여 사용하도록 해야하며, 리소스 목록은 프로퍼티파일이나 XML파일로 정의하여 리소스 정보를 변경하는 경우 프로그램 수정을 최소화 할 수 있도록 관리한다. 사용자의 요청 리소스가 특정 디렉토리내의 모든 파일인 경우에는 모든 파일명을 목록화하는 것은 어렵다. 이런 경우는 입력값 중 경로조작을 일으킬 수 있는 문자(.. / ₩)를 제거하고 사용하여 지정된 경로내의 파일만 접근 가능하도록 시큐어코딩 규칙을 정의한다.
② 서버프로그램 안에서 셸을 생성하여 명령어를 실행해야 하는 경우 외부입력값에 의해 악의적인 명령어가 실행되지 않도록 해야 한다.
먼저, 서버프로그램 안에서 셸을 생성해서 명령어가 실행되는 구조를 가지지 않도록 설계하는 것이 우선이다. 하지만 경우에 따라 이러한 기능이 꼭 필요한 경우에는 외부입력값이 직접적으로 명령어의 일부로 사용되지 않도록 해야 한다. 명령어의 일부로 사용되어야 하는 값들을 목록화하여 목록 내에 있는 값들로만 명령어가 조립되어 실행 될 수 있도록 해야 하며, 목록화 되어 있는 값들이 경우에 따라 변경되어야 한다면, 이로 인해 프로그램이 수정되지 않도록 프로퍼티파일이나 XML파일을 사용하여 허용목록을 작성한다. 이 때 외부입력 값은 목록화된 정보를 검색하는 인덱스값으로 사용하여 시스템 명령어 사용을 최소화한다
다. 진단 요구사항
① 외부 입력값을 이용하여 시스템자원(IP, PORT번호, 프로세스, 메모리, 파일 등)을 식별하는 경우 허가되지 않은 자원이 사용되지 않도록 해야 한다.
IP, PORT, 파일 등 시스템자원을 식별하기 위해 사용자 입력값을 사용하는 경우 입력값을 검증하도록 설계하고 있는지 확인한다.
② 서버 프로그램 안에서 쉘을 생성하여 명령어를 실행해야 하는 경우 외부입력값에 의해 악의적인 명령어가 실행되지 않도록 해야 한다. 시스템 명령어를 사용할 때 외부 입력값을 사용하는 경우 입력값을 검증하도록 설계하고 있는지 확인한다.
[테스트 문제]
문제: 공격자가 입력값 조작으로 시스템이 보호하는 자원에 임의로 접근하여 부적절한 스크립트가 실행되어 정보 유출 등의 공격을 유발할 수 있다.
정답: X
해설: 공격자가 입력값 조작으로 시스템이 보호하는 자원에 임의로 접근하여 자원의 수정·삭제, 시스템 정보누출, 시스템 자원 간 충돌로 인한 서비스 장애 등을 유발시킬 수 있는 취약점이다.
문제: 보안대책을 서술하시오.
정답:
1. 외부입력값을 이용하여 시스템자원을 식별하는 경우 허가되지 않은 자원이 사용되지 않도록 조치
2. 외부입력값에 의해 악의적인 명령어가 실행되지 않도록 조치
문제: 빈칸을 채우시오.
공격자가 (ㄱ)으로 시스템이 보호하는 자원에 임의로 접근하여 자원의 수정·삭제, 시스템 정보누출, 시스템 자원 간 충돌로 인한 서비스 장애 등을 유발시킬 수 있는 취약점이다. 즉, 경로 조작 및 자원 삽입으로 공격자가 허용되지 않은 권한을 획득하여, 설정에 관계된 파일을 변경하거나 실행 시킬 수 있다.
① 외부입력값을 이용하여 (ㄴ)을 식별하는 경우 허가되지 않은 자원이 사용되지 않도록 해야 한다.
외부입력값이 프로그램 내부에서 사용하는 리소스를 결정하는데 직접적으로 사용되지 않도록 설계한다. 즉, 기능 설계시 사용해야 하는 리소스 목록을 정의하여 지정된 범위 안에서 리소스를 선택하여 사용하도록 해야하며, 리소스 목록은 (ㄷ)로 정의하여 리소스 정보를 변경하는 경우 프로그램 수정을 (ㄹ) 할 수 있도록 관리한다. 사용자의 요청 리소스가 특정 디렉토리내의 모든 파일인 경우에는 모든 파일명을 목록화하는 것은 어렵다. 이런 경우는 입력값 중 (ㅁ)을 일으킬 수 있는 문자(.. / ₩)를 제거하고 사용하여 지정된 경로내의 파일만 접근 가능하도록 시큐어코딩 규칙을 정의한다.
② 서버프로그램 안에서 셸을 생성하여 명령어를 실행해야 하는 경우 외부입력값에 의해 악의적인 명령어가 실행되지 않도록 해야 한다.
먼저, 서버프로그램 안에서 셸을 생성해서 명령어가 실행되는 구조를 가지지 않도록 설계하는 것이 우선이다. 하지만 경우에 따라 이러한 기능이 꼭 필요한 경우에는 외부입력값이 직접적으로 명령어의 일부로 사용되지 않도록 해야 한다. 명령어의 일부로 사용되어야 하는 값들을 (ㅂ) 하여 목록 내에 있는 값들로만 명령어가 조립되어 실행 될 수 있도록 해야 하며, 목록화 되어 있는 값들이 경우에 따라 변경되어야 한다면, 이로 인해 프로그램이 수정되지 않도록 프로퍼티파일이나 XML파일을 사용하여 허용목록을 작성한다. 이 때 외부입력 값은 목록화된 정보를 검색하는 (ㅅ) 값으로 사용하여 시스템 명령어 사용을 최소화한다
정답
ㄱ: 입력 값 조작
ㄴ: 시스템 자원
ㄷ: 프로퍼티파일이나 XML파일
ㄹ: 최소화
ㅁ: 경로 조작
ㅂ: 목록화
ㅅ: 인덱스
연관된 구현단계 보안약점 항목
입력데이터 검증 및 표현 | 코드 삽입 |
입력데이터 검증 및 표현 | 경로 조작 및 자원 삽입 |
입력데이터 검증 및 표현 | 서버사이드 요청 위조 |
입력데이터 검증 및 표현 | 운영체제 명령어 실행 |