가. 취약점 개요
사례1 : 위험한 형식 파일 업로드
서버 측에서 실행될 수 있는 스크립트 파일(asp, jsp, php 파일 등)을 업로드 가능하고, 이 파일을 공격자가 웹으로 직접 실행시킬 수 있는 경우 시스템 내부 명령어를 실행하거나 외부와 연결하여 시스템을 제어할 수 있게 된다.
사례2 : 경로조작 문자를 이용한 파일 다운로드 취약점
외부입력값에 대해 경로 조작에 사용될 수 있는 문자를 필터링하지 않으면, 예상 밖의 접근제한 영역에 대한 경로 문자열 구성이 가능해져 시스템 정보누출, 서비스 장애 등을 유발할 수 있는 취약점이다.
사례3 : 무결성 검사 없는 코드 다운로드
원격으로부터 소스코드 또는 실행파일을 무결성 검사 없이 다운로드 받고 이를 실행할 경우, 호스트 서버의 변조, DNS 스푸핑 (Spoofing) 또는 전송 시의 코드 변조 등의 방법을 이용하여 공격자가 악의적인 코드를 실행할 수 있게 된다.
나. 설계시 고려사항
① 업로드되어 저장되는 파일의 타입, 크기, 개수, 실행권한을 제한해야 한다.
(ㄱ) 업로드 파일의 크기 제한
업로드되는 파일의 크기 제한은 프레임워크에서 설정할 수도 있고, 프로그램에서 설정할 수도 있다.
Spring 프레임워크를 사용하는 경우 MultipartResolver 컴포넌트의 속성 값을 설정하여 업로드 파일의 크기를 제한할 수 있다.
<bean id=”multipartResolver”
class=”org.springframework.web.multipart.commons.CommonsMultipart Resolver”>
<!‐‐ max upload size in bytes ‐‐>
<property name=”maxUploadSize” value=”20971520” /> <!‐‐ 20MB ‐‐>
<!‐‐ max size of file in memory (in bytes) ‐‐>
<property name=”maxInMemorySize” value=”1048576” /> <!‐‐ 1MB ‐‐>
</bean>
(ㄴ) 파일의 타입 제한
업로드되는 파일유형의 통제는 서버와 클라이언트가 동일한 정책을 적용하도록 설계해야 하며, 파일의 MIME‐TYPE과 확장자가 동시에 검사될 수 있도록 업로드 파일에 대한 필터링 기능을 구현한 공통모듈을 설계하여 모든 파일 업로드 기능에 적용하거나 업로드 기능을 가진 컴포넌트에서 직접 필터링하도록 시큐어 코딩 규칙을 정의한다.
(ㄷ) 업로드되어 저장되는 파일의 실행권한 제거
업로드된 파일은 반드시 실행권한을 가지지 않도록 시스템이 설정되어 있어야 한다. 업로드된 파일이 저장 되는 디렉터리에 대한 디폴트 파일 또는 디렉터리 생성시 권한을 확인하고, 업로드된 파일에 실행권한이 주어지지 않도록 시스템설정을 확인한다. 파일이 읽기 권한을 가지고 있기만 해도 서버에서 해당 파일을 읽어서 실행할 수 있으므로 서버 설정으로 업로드 경로의 파일이 실행 되지 않도록 설정해야한다.
② 업로드되어 저장되는 파일은 외부에서 식별되지 않아야 한다.
(ㄱ) 업로드되는 파일의 저장경로는 외부에서 직접 접근이 불가능한 경로사용
파일이 저장되는 경로는 URL로 직접적으로 접근 가능하지 않은 디렉터리를 사용한다. 이 경우 외부 에서 URL을 조작하여 업로드된 파일에 접근할 수 없으므로, 업로드로 저장된 파일에 대한 통제가 가능하다. 업로드된 파일을 다운로드하기 위해서는 다운로드 처리를 수행하는 컨트롤러를 구현해야 하며, 컨트롤러 구현 시 허가된 파일에 대한 허가된 사용자만 다운로드 기능을 사용할 수 있도록 통제한다.
(ㄴ) 업로드되어 저장되는 파일의 파일명은 랜덤하게 생성하여 사용
저장된 파일을 공격자가 찾을 수 없도록 랜덤하게 생성된 파일명을 이용하여 디렉토리에 저장한다. 이 경우 업로드한 파일명과 저장된 파일명이 매핑되어 관리될 수 있도록, DB 테이블의 칼럼을 설계할 때 업로드 파일명, 저장된 파일명이 함께 저장되도록 설계한다.
③ 파일 다운로드 요청시, 요청파일명에 대한 검증작업을 수행해야 한다.
(ㄱ) 파일 다운로드를 위해 요청되는 파일명에 경로를 조작하는 문자가 포함되어 있는지 점검
파일명에 경로조작이 가능한 ‘..’, ‘/’, ‘₩’ 문자는 제거하고 사용할 수 있도록 필터링한다.
(ㄴ) 허가된 사용자의 허가된 안전한 파일에 대한 다운로드 요청인지 확인
파일 다운로드 요청 시 허가된 사용자와 파일인지를 확인하는 기능이 구현되도록 파일 다운로드 컴포넌트가 설계되어야 하며, 파일을 다운로드하는 사용자의 안전을 위해 파일에 대한 악성코드 또는 바이러스 검사를 수행한 뒤 파일이 다운로드 되도록 기능을 설계한다.
(ㄷ) 사용자의 요청에 의해 서버에 존재하는 파일이 참조되는 경우 화이트리스트 정책으로 접근 통제
시스템에 저장되어 있는 파일을 다운로드 서비스하는 경우, 허용 파일에 대한 목록을 작성하고 목록의 범위 안의 파일에 대해서만 제한적으로 접근 또는 다운로드할 수 있도록 설계한다.
④ 다운로드 받은 소스코드나 실행파일은 무결성 검사를 실행해야 한다.
원격지에서 다운로드 받은 파일을 사용하거나 실행하는 기능을 구현해야 하는 경우 해당 파일과 파일의 체크섬 값(해시 값 등)을 같이 다운로드 받아 파일에 대한 무결성 검사를 수행한 뒤 사용 할 수 있도록 설계한다.
[테스트 문제]
문제: Spring 프레임워크를 사용하는 경우 MultipartResolver 컴포넌트의 속성 값을 설정하여 업로드 파일의 크기를 제한하는 것은 보안기능 입력값 검증 항목에 대한 설명이다.
정답: X
해설: 업로드·다운로드 파일 검증에 대한 항목 설명
문제: DB 테이블의 칼럼을 설계할 때 업로드 파일명, 저장된 파일명이 함께 저장되도록 설계한다.
정답: O
문제: 보안대책을 서술하시오.
정답:
① 파일 크기, 형식 제한
② 업로드 된 파일 외부 식별 제한
③ 파일 다운로드 시, 요청파일명에 대한 검증
④ 다운로드 파일 무결성 검증
문제: 빈칸을 채우시오.
나. 설계시 고려사항
① 업로드되어 저장되는 파일의 (ㄱ)을 제한해야 한다.
1. 업로드 파일의 크기 제한
업로드되는 파일의 크기 제한은 프레임워크에서 설정할 수도 있고, 프로그램에서 설정할 수도 있다.
Spring 프레임워크를 사용하는 경우 (ㄴ)의 속성 값을 설정하여 업로드 파일의 크기를 제한할 수 있다.
2. 파일의 타입 제한
업로드되는 파일유형의 통제는 서버와 클라이언트가 동일한 정책을 적용하도록 설계해야 하며, 파일의 (ㄷ)과 (ㄹ)가 동시에 검사될 수 있도록 업로드 파일에 대한 필터링 기능을 구현한 (ㅁ)을 설계하여 모든 파일 업로드 기능에 적용하거나 업로드 기능을 가진 컴포넌트에서 직접 필터링하도록 시큐어 코딩 규칙을 정의한다.
3. 업로드되어 저장되는 파일의 (ㅂ) 제거
업로드된 파일은 반드시 (ㅂ) 을 가지지 않도록 시스템이 설정되어 있어야 한다. 업로드된 파일이 저장 되는 디렉터리에 대한 디폴트 파일 또는 디렉터리 생성시 권한을 확인하고, 업로드된 파일에 (ㅂ) 이 주어지지 않도록 시스템설정을 확인한다. 파일이 (ㅅ)을 가지고 있기만 해도 서버에서 해당 파일을 읽어서 실행할 수 있으므로 서버 설정으로 업로드 경로의 파일이 실행 되지 않도록 설정해야한다.
② 업로드되어 저장되는 파일은 외부에서 식별되지 않아야 한다.
1. 업로드되는 파일의 저장경로는 외부에서 (ㅇ) 이 불가능한 경로사용
파일이 저장되는 경로는 URL로 (ㅇ) 이 가능하지 않은 디렉터리를 사용한다. 이 경우 외부 에서 URL을 조작하여 업로드된 파일에 접근할 수 없으므로, 업로드로 저장된 파일에 대한 통제가 가능하다. 업로드된 파일을 다운로드하기 위해서는 다운로드 처리를 수행하는 (ㅈ)를 구현해야 하며, (ㅈ) 구현 시 허가된 파일에 대한 허가된 사용자만 다운로드 기능을 사용할 수 있도록 통제한다.
2. 업로드되어 저장되는 파일의 파일명은 (ㅊ)하게 생성하여 사용
저장된 파일을 공격자가 찾을 수 없도록 (ㅊ) 하게 생성된 파일명을 이용하여 디렉토리에 저장한다. 이 경우 업로드한 파일명과 저장된 파일명이 매핑되어 관리될 수 있도록, DB 테이블의 칼럼을 설계할 때 업로드 파일명, 저장된 파일명이 함께 저장되도록 설계한다.
③ 파일 다운로드 요청시, 요청파일명에 대한 검증작업을 수행해야 한다.
1. 파일 다운로드를 위해 요청되는 파일명에 (ㅋ)하는 문자가 포함되어 있는지 점검
파일명에 경로조작이 가능한 ‘..’, ‘/’, ‘₩’ 문자는 제거하고 사용할 수 있도록 필터링한다.
2. 허가된 사용자의 허가된 안전한 파일에 대한 다운로드 요청인지 확인
파일 다운로드 요청 시 허가된 사용자와 파일인지를 확인하는 기능이 구현되도록 파일 다운로드 컴포넌트가 설계되어야 하며, 파일을 다운로드하는 사용자의 안전을 위해 파일에 대한 악성코드 또는 바이러스 검사를 수행한 뒤 파일이 다운로드 되도록 기능을 설계한다.
3. 사용자의 요청에 의해 서버에 존재하는 파일이 참조되는 경우 (ㅌ)으로 접근 통제
시스템에 저장되어 있는 파일을 다운로드 서비스하는 경우, 허용 파일에 대한 목록을 작성하고 목록의 범위 안의 파일에 대해서만 제한적으로 접근 또는 다운로드할 수 있도록 설계한다.
④ 다운로드 받은 소스코드나 실행파일은 (ㅍ)를 실행해야 한다.
원격지에서 다운로드 받은 파일을 사용하거나 실행하는 기능을 구현해야 하는 경우 해당 파일과 파일의 (ㅎ) 값(해시 값 등)을 같이 다운로드 받아 파일에 대한 (ㅍ)를 수행한 뒤 사용 할 수 있도록 설계한다.
정답:
ㄱ: 크기, 개수, 타입, 실행 권한
ㄴ: MultipartResolver 컴포넌트
ㄷ: MIME-TYPE
ㄹ: 확장자
ㅁ: 공통모듈
ㅂ: 실행 권한
ㅅ: 읽기 권한
ㅇ: 직접 접근
ㅈ: 컨트롤러
ㅊ: 랜덤
ㅋ: 경로 조작
ㅌ: 화이트리스트 정책
ㅍ: 무결성 검사
업로드·다운로드 파일 검증 | |
입력데이터 검증 및 표현 | 위험한 형식 파일 업로드 |
보안기능 | 부적절한 전자서명 확인 |
입력데이터 검증 및 표현 | 무결성 검사 없는 코드 다운로드 |