본문 바로가기
공부/KISA

업로드·다운로드 파일 검증 - KISA 소프트웨어 개발 보안 가이드

by Skogkatt의 개인 블로그 2020. 7. 10.
반응형

https://www.kisa.or.kr/public/laws/laws3.jsp

 

기술안내서 가이드 < 관련법령·기술안내서 < 자료실 : 한국인터넷진흥원

기술안내서 가이드 한국인터넷진흥원 기술안내서 가이드 입니다. 게시판 목록 보기 기술안내서 가이드 표 대분류 소분류 기술안내서 가이드 대상 수준 인터넷 진흥 및 이용 활성화 인터넷 진흥

www.kisa.or.kr


분석∙설계단계 SW 보안강화 - 설계보안항목 정의 및 설계 시 고려 사항 - 업로드·다운로드 파일 검증

설명 

  • 업로드·다운로드 파일의 무결성, 실행권한 등에 관한 유효성 검사 방법을 설계하고, 검사 실패 시 대응방안을 설계해야 한다.

설계항목내용

  • 업로드되어 저장되는 파일의 타입, 크기, 개수, 실행 권한을 제한해야 한다.
  • 업로드되어 저장되는 파일은 외부에서 식별되지 않아야 한다.
  • 파일 다운로드 요청 시, 요청 파일명에 대한 검증작업을 수행해야 한다.
  • 다운로드한 소스코드나 실행파일은 무결성 검사를 실행해야 한다.

가. 취약점 개요

사례 1: 위험한 형식 파일 업로드
  • 서버 측에서 실행될 수 있는 스크립트 파일(asp, jsp, php 파일 등)을 업로드 가능하고, 이 파일을 공격자가 웹을 통해 직접 실행시킬 수 있는 경우 시스템 내부 명령어를 실행하거나 외부와 연결하여 시스템을 제어할 수 있게 된다.
사례 2: 경로 조작 문자를 이용한 파일 다운로드 취약점
  • 외부 입력값에 대해 경로 조작에 사용될 수 있는 문자를 필터링하지 않으면, 예상 밖의 접근 제한 영역에 대한 경로 문자열 구성이 가능해져 시스템 정보 누출, 서비스 장애 등을 유발할 수 있는 취약점이다.
사례 3: 무결성 검사 없는 코드 다운로드
  • 원격으로부터 소스코드 또는 실행파일을 무결성 검사 없이 다운로드하고, 이를 실행할 경우 호스트 서버의 변조, DNS 스푸핑 (Spoofing)또는 전송 시의 코드 변조 등의 방법을 이용하여 공격자가 악의적인 코드를 실행할 수 있게 된다.

나. 설계 시 고려사항

1. 업로드되어 저장되는 파일의 타입, 크기, 개수, 실행 권한을 제한해야 한다.

(ㄱ) 업로드 파일의 크기 제한
  • 업로드되는 파일의 크기 제한은 프레임워크에서 설정할 수도 있고, 프로그램에서 설정할 수도 있다. Spring 프레임워크를 사용하는 경우 MultipartResolver 컴포넌트의 속성 값을 설정하여 업로드 파일의 크기를 제한할 수 있다.
<bean id="multipartResolver"

class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!‐‐ 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과 확장자가 동시에 검사될 수 있도록 업로드 파일에 대한 필터링 기능을 구현한 공통모듈을 설계하여 모든 파일 업로드 기능에 적용하거나 업로드 기능을 가진 컴포넌트에서 직접 필터링하도록 시큐어 코딩 규칙을 정의한다.
(ㄷ) 업로드되어 저장되는 파일은 실행 권한 제거
  • 업로드된 파일은 반드시 실행 권한을 가지지 않도록 시스템이 설정되어 있어야 한다. 업로드된 파일이 저장되는 디렉터리에 대한 디폴트 파일 또는 디렉터리 생성 시 퍼미션을 확인하고, 업로드된 파일에 실행 권한이 주어지지 않도록 시스템 설정을 확인한다. 파일이 read퍼미션을 가지고 있기만 해도 서버에서 해당 파일을 읽어서 실행할 수 있으므로 서버 설정을 통해 업로드 경로의 파일이 실행되지 않도록 설정해야 한다

2. 업로드되어 저장되는 파일은 외부에서 식별되지 않아야 한다.

(ㄱ) 업로드되는 파일의 저장 경로는 외부에서 직접 접근이 불가능한 경로 사용.
  • 파일이 저장되는 경로는 URL을 통해 직접적으로 접근 가능하지 않은 디렉터리를 사용한다. 이 경우 외부에서 URL 조작을 통해 업로드된 파일에 접근이 불가능하므로 업로드되어 저장된 파일에 대한 통제가 가능하다. 이렇게 업로드된 파일을 다운로드하기 위해서는 다운로드 처리를 수행하는 컨트롤러를 구현해야 하며, 컨트롤러 구현 시 안전하게 파일을 다운로드 처리하기 위한 통제 기능을 적용할 수 있다.
(ㄴ) 업로드되어 저장되는 파일의 파일명은 랜덤하게 생성하여 사용.
  • 저장된 파일을 공격자가 찾을 수 없도록 랜덤하게 생성된 파일명을 이용하여 디렉터리에 저장한다. 이 경우 업로드한 파일명과 저장된 파일명이 매핑되어 관리될 수 있도록, DB 테이블의 칼럼을 설계할 때 업로드 파일명, 저장된 파일명이 함께 저장되도록 설계한다.

3. 파일 다운로드 요청 시, 요청 파일명에 대한 검증작업을 수행해야 한다.

(ㄱ) 파일 다운로드를 위해 요청되는 파일명에 경로를 조작하는 문자가 포함되어 있는지 점검
  • 파일명에 경로 조작이 가능한 .. / \ 문자는 제거하고 사용할 수 있도록 필터링한다
(ㄴ) 허가된 사용자의 허가된 안전한 파일에 대한 다운로드 요청인지 확인
  • 파일 다운로드 요청 시 허용된 사용자와 허용된 파일인지를 확인하는 기능이 구현되도록 파일 다운로드 컴포넌트가 설계되어야 하며, 파일을 다운로드하는 사용자의 안전을 위해 파일에 대한 악성코드 또는 바이러스 검사를 수행한 뒤 파일이 다운로드되도록 기능을 설계한다.
(ㄷ) 사용자의 요청에 의해 서버에 존재하는 파일이 참조되는 경우 화이트리스트 정책으로 접근통제
  • 시스템에 저장되어 있는 파일을 다운로드 서비스하는 경우, 허용 파일에 대한 목록을 작성하고 목록의 범위 안의 파일에 대해서만 제한적으로 접근 또는 다운로드할 수 있도록 설계한다.

4. 다운로드 받은 소스코드나 실행파일은 무결성 검사를 실행해야 한다.

  • 원격지에서 다운로드 받은 파일을 사용하거나 실행하는 기능을 구현해야 하는 경우 해당 파일과 해당 파일의 체크섬 값(해쉬값)을 같이 다운로드 받아 파일에 대한 무결성 검사를 수행한 뒤 사용할 수 있도록 설계한다.
  • 파일 업로드 기능 구현 시 아래와 같은 프레임워크의 사용을 고려하여 기능의 목적에 부합하는 형식의 파일만 업로드하도록 허용한다.

 


참고자료

반응형

댓글