이전 포스팅에서는 OWASP의 File Upload Cheat Sheet를 통해 파일 업로드 과정에서 발생할 수 있는 보안 위협과 주요 보안 원칙을 살펴보았습니다.

국내 기관에서 제공하는 보안 가이드도 함께 참고하면 좋을 것 같았습니다. 그래서 이번에는 KISA(한국인터넷진흥원)의 소프트웨어 개발보안 가이드에서 파일 업로드와 관련된 보안약점과 이를 예방하기 위한 대응 방법을 어떻게 설명하고 있는지 살펴보려고 합니다.

이를 통해 앞서 학습한 OWASP의 권고사항과 어떤 공통점과 차이점이 있는지도 비교해 보겠습니다.

참고


1. 파일 업로드와 관련된 보안약점

KISA의 소프트웨어 개발보안 가이드는 소프트웨어 개발 과정에서 발생할 수 있는 보안 취약점을 예방하기 위한 보안 요구사항과 대응 방법을 분석·설계 단계와 구현 단계로 구분하여 설명하고 있습니다.

그중 파일 업로드와 관련된 내용은 다음과 같습니다.

구분 항목 주요 내용
분석·설계 단계 업로드·다운로드 파일 검증 파일 형식, 크기, 접근 경로, 실행 권한 등의 보안 요구사항 정의
구현 단계 위험한 형식 파일 업로드 악의적인 파일이 업로드되어 서버에서 실행되는 보안약점과 대응 방법

1.1. 업로드·다운로드 파일 검증

KISA에서는 파일 업로드 및 다운로드 기능을 설계할 때 다음과 같은 보안 위협을 고려해야 한다고 설명합니다.

  • 위험한 형식 파일 업로드: JSP, PHP 등의 스크립트 파일이 업로드되어 서버에서 실행될 위험
  • 경로 조작을 이용한 파일 다운로드: 파일 경로를 조작하여 허용되지 않은 파일에 접근할 위험
  • 무결성 검사 없는 코드 다운로드: 변조된 소스코드나 실행파일을 다운로드하여 실행할 위험

이러한 위협을 예방하기 위해 파일 업로드 및 다운로드 과정에서 필요한 유효성 검증 방법과 검증 실패 시의 처리 방법을 설계하도록 요구하고 있습니다.

1.2. 위험한 형식 파일 업로드

또한 구현 단계에서는 위험한 형식 파일 업로드를 별도의 보안약점으로 설명하고 있습니다.

예를 들어 공격자가 악의적인 JSP 파일을 업로드한 뒤 웹을 통해 해당 파일을 실행할 수 있다면, 서버 내부에서 명령어를 실행하거나 시스템을 제어하는 공격으로 이어질 수 있습니다.

이러한 공격에 사용되는 대표적인 파일이 웹쉘(Web Shell)입니다.

따라서 단순히 파일의 업로드 성공 여부만 확인하는 것이 아니라, 허용되지 않은 파일이 저장되거나 실행되지 않도록 검증하는 것이 중요합니다.


2. 안전한 파일 업로드 기능 구현을 위한 보안 원칙

KISA에서는 파일 업로드와 다운로드 기능을 안전하게 구현하기 위해 다음과 같은 보안 대책을 제시하고 있습니다.

보안 대책 주요 내용
파일 형식 제한 허용된 확장자와 파일 형식만 업로드
파일 크기 및 개수 제한 업로드 가능한 파일의 크기와 개수 제한
파일명 보호 외부에서 추측하기 어려운 파일명과 확장자로 변경하여 저장
저장 경로 보호 웹을 통해 직접 접근할 수 없는 위치에 파일 저장
실행 권한 제한 업로드된 파일이 서버에서 실행되지 않도록 설정
다운로드 파일명 검증 경로 조작 등을 이용한 비인가 파일 접근 방지
다운로드 코드 무결성 검사 다운로드한 소스코드나 실행파일의 변조 여부 확인

이 중 몇 가지를 조금 더 살펴보겠습니다.

2.1. 파일 형식 및 크기 제한

업로드할 수 있는 파일의 확장자는 허용 목록(Allowlist) 방식으로 관리하고, 업무에 필요한 파일 형식만 허용해야 합니다.

또한 파일 크기와 개수를 제한하여 과도한 파일 업로드로 인한 시스템 자원 소비를 방지해야 합니다.

KISA에서는 파일 형식을 검증할 때 확장자와 MIME 타입을 함께 확인하는 방법도 설명하고 있습니다.

다만 MIME 타입은 클라이언트에서 조작할 수 있으므로, 앞서 OWASP 가이드에서 살펴본 것처럼 단독으로 신뢰해서는 안 됩니다.

2.2. 파일명 및 저장 경로 보호

업로드된 파일은 외부에서 쉽게 식별하거나 접근할 수 없도록 관리해야 합니다.

이를 위해 KISA에서는 다음과 같은 방법을 제시합니다.

  • 업로드된 파일의 이름과 확장자를 추측하기 어려운 값으로 변경
  • 웹 서버의 문서 루트(Web Document Root) 외부에 파일 저장
  • 업로드된 파일에 대한 직접적인 웹 접근 제한

파일을 다운로드할 때는 서버에서 접근 권한과 요청한 파일을 확인한 후 제공하는 방식으로 통제할 수 있습니다.

특히 파일명을 임의의 값으로 변경하는 것만으로는 접근 권한을 보장할 수 없으므로, 파일에 대한 접근 통제도 함께 적용해야 합니다.

2.3. 파일 실행 권한 제한

업로드된 파일이 서버에서 실행되지 않도록 제한하는 것도 중요합니다.

KISA에서는 파일 시스템의 실행 권한을 제거하는 것뿐만 아니라, 웹 서버 설정을 통해 업로드된 파일이 실행되지 않도록 해야 한다고 설명합니다.

예를 들어 업로드된 JSP 파일에 운영체제의 실행 권한이 없더라도 웹 애플리케이션 서버가 해당 파일을 실행할 수 있는 경로에 저장된다면 보안 문제가 발생할 수 있습니다.

따라서 파일 시스템 권한과 웹 서버 및 애플리케이션 서버의 실행 설정을 함께 고려해야 합니다.

2.4. 다운로드 파일 검증

KISA에서는 파일 업로드뿐만 아니라 다운로드 과정에서 발생할 수 있는 보안 위협도 다루고 있습니다.

파일 다운로드 요청에서 전달된 파일명을 검증하지 않으면 경로 조작을 통해 의도하지 않은 파일이 노출될 수 있습니다.

또한 외부에서 다운로드한 소스코드나 실행파일을 사용하는 경우에는 무결성을 검증하여 변조된 코드가 실행되지 않도록 해야 합니다.

다만 소스코드나 실행파일의 무결성 검사는 일반적인 이미지 다운로드와는 사용 목적이 다르므로, 서비스에서 제공하는 파일의 종류와 처리 방식에 따라 적용 여부를 판단해야 합니다.


3. OWASP와 KISA 가이드 비교

두 가이드를 살펴보니 파일 업로드 보안에 대한 기본적인 원칙은 상당 부분 공통적이었습니다.

보안 항목 OWASP KISA
파일 형식 검증 확장자, Content-Type, 파일 시그니처 등 구분하여 설명 허용 확장자 및 MIME 타입 검증 등 제시
파일명 관리 서버에서 생성한 안전한 파일명 사용 추측하기 어려운 파일명과 확장자로 변경
저장 위치 별도 서버 또는 웹 루트 외부 저장 권고 웹 문서 루트 외부 저장 및 직접 접근 제한
실행 권한 최소 권한 원칙 적용 실행 권한 제거 및 서버 실행 설정 제한
시스템 자원 보호 파일 크기, 압축파일, 다운로드 요청 제한 등 업로드 파일의 크기와 개수 제한
다운로드 보안 공개 파일 조회에 따른 정보 노출 및 DoS 위험 설명 파일명 검증과 다운로드 코드 무결성 검사 제시

두 가이드 모두 허용된 파일 형식만 업로드하고, 안전한 파일명과 저장 위치를 사용하며, 불필요한 실행 권한을 제한하는 것을 중요하게 다루고 있습니다.

다만 설명하는 방식에는 차이가 있었습니다.

OWASP의 File Upload Cheat Sheet는 파일 업로드라는 특정 기능에 집중하여 다양한 보안 위협과 개별 검증 방법의 한계를 비교적 상세하게 설명하고 있습니다.

반면 KISA의 소프트웨어 개발보안 가이드는 소프트웨어 개발 전반의 보안약점을 다루면서 파일 업로드와 다운로드에 필요한 보안 요구사항과 구현 대책을 제시하고 있습니다.

따라서 두 가이드는 서로 다른 보안 원칙을 제시한다기보다는 유사한 보안 요구사항을 서로 다른 범위와 관점에서 설명하고 있다고 이해할 수 있었습니다.


4. 학습을 통해 알게 된 점

KISA의 소프트웨어 개발보안 가이드를 살펴보니 파일 업로드와 관련된 보안 대책은 앞서 학습한 OWASP의 권고사항과 상당 부분 유사했습니다.

다만 KISA에서는 분석·설계 단계부터 파일 업로드와 다운로드에 필요한 보안 요구사항을 정의해야 한다는 점을 명확하게 설명하고 있었습니다.

이를 통해 안전한 파일 업로드 기능을 구현하려면 단순히 개발 단계에서 보안 검증 코드를 추가하는 것이 아니라, 어떤 파일을 허용하고 어디에 저장하며 어떻게 접근을 통제할 것인지 설계 단계부터 고려해야 한다는 것을 다시 확인할 수 있었습니다.


5. 다음 포스팅

지금까지 OWASP와 KISA의 보안 가이드를 통해 안전한 파일 업로드 기능을 구현하기 위해 고려해야 할 주요 보안 원칙을 살펴보았습니다.

다음 포스팅에서는 처음에 정의했던 세 가지 관점 중 아직 살펴보지 않은 정확성(Correctness)과 안정성(Reliability)에 대해 알아보려고 합니다.

특히 파일을 의도한 대로 정확하게 처리하기 위해 고려해야 할 사항과 파일 처리 과정에서 오류가 발생했을 때 안정적으로 대응하기 위한 방법을 중점적으로 살펴보겠습니다.