업로드·다운로드 파일의 무결성, 실행권한 등에 관한 유효성 검증방법과 부적합한 파일에 대한 처리방법을 설계해야 한다.
(입력데이터 검증 및 표현) 위험한 형식 파일 업로드
(보안기능) 무결성 검사 없는 코드 다운로드
(보안기능) 부적절한 전자서명 확인
txt, jpg, doc와 같은 데이터 파일종류 이외에 악의적으로 제작된 스크립트 파일인 ‘웹쉘(Web‐Shell)’을 업로드 해 사이버 공격을 하는 사고가 빈번히 발생합니다.
웹쉘이란 공격자가 원격에서 대상 웹서버에 명령을 수행할 수 있도록 작성한 웹 스크립트(asp, jsp, php, cgi) 파일을 말합니다.
zip, jpg, doc와 같은 데이터 파일종류 이외에 악의적으로 제작된 스크립트 파일인 웹쉘을 정상 파일처럼 숨겨 업로드 해 웹서버를 해킹하는 것이지요.
최근에는 파일 업로드뿐만 아니라 SQL삽입(Injection)와 같은 웹취약점을 공격한 후 지속적으로 피해시스템을 관리할 목적으로 웹쉘을 생성해 업로드 하는 고도의 해킹도 발생하고 있습니다.
① 업로드 되어 저장되는 파일의 타입, 크기, 개수, 실행권한 제한
② 업로드 되어 저장되는 파일은 외부에서 식별 제한
③ 파일 다운로드 요청 시, 요청파일명에 대한 검증작업을 수행
④ 다운로드 받은 소스코드나 실행파일은 무결성 검사 실행
① (ㄱ) 업로드 파일의 크기 제한
업로드 되는 파일의 크기 제한은 프레임워크에서 설정할 수도 있고, 프로그램에서 설정 가능
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과 확장자가 동시에 검사(업로드 파일 필터링 기능을 수행하는 공통모듈 설계)
파일 업로드 기능에 적용하거나 업로드 기능을 가진 컴포넌트에서 직접 필터링하도록 정의(시큐어코딩 규칙)
(ㄷ) 업로드 되어 저장되는 파일은 실행권한 제거
업로드 된 파일은 반드시 실행권한을 가지지 않도록 시스템이 설정
업로드 된 파일이 저장되는 디렉터리의 파일 또는 디렉터리 생성 시 기본 권한을 확인
업로드 된 파일에 실행 권한이 주어지지 않도록 시스템 설정
파일이 읽기 권한을 가지고 있기만 해도 서버에서 해당 파일을 읽어서 실행 가능
서버 설정으로 업로드 경로의 파일이 실행되지 않도록 설정.
② (ㄱ) 업로드 되는 파일의 저장경로는 외부에서 직접 접근이 불가능한 경로 사용
파일이 저장되는 경로는 URL으로 직접적으로 접근 가능하지 않은 디렉터리를 사용
외부에서 URL 조작으로 업로드 된 파일에 접근이 불가능하므로, 업로드 되어 저장된 파일에 대한 통제 가능
업로드 된 파일을 다운로드 하기 위해서는 다운로드 처리를 수행하는 컨트롤러를 구현 필요
컨트롤러 구현 시 안전하게 파일을 다운로드 처리하기 위한 통제 기능을 적용
(ㄴ) 업로드 되어 저장되는 파일의 파일명은 랜덤하게 생성하여 사용
저장된 파일을 공격자가 찾을 수 없도록 파일명을 랜덤하게 생성하여 디렉터리에 저장
업로드 한 파일명과 저장된 파일명이 매핑 되어 관리될 수 있도록 DB 테이블의 칼럼을 설계할 때 업로드 파일명, 저장된 파일명이 함께 저장되도록 설계
③ (ㄱ) 파일 다운로드를 위해 요청되는 파일명에 경로를 조작하는 문자가 포함되어 있는지 점검
파일명에 경로조작이 가능한 ‘..’(점두개), ‘ /’(슬래시), ‘ \’(백슬래시) 문자는 제거하고 사용할 수 있도록 필터링한다.
(ㄴ) 허가된 사용자의 허가된 안전한 파일에 대한 다운로드 요청인지 확인
파일 다운로드 요청 시 허가된 사용자와 파일인지를 확인하는 기능이 구현되도록 파일 다운로드 컴포넌트가 설계
파일에 대한 악성코드 또는 바이러스 검사를 수행한 뒤 파일이 다운로드 되도록 기능을 설계
(ㄷ) 사용자의 요청에 의해 서버에 존재하는 파일이 참조되는 경우 화이트리스트 정책으로 접근통제
시스템에 저장되어 있는 파일을 다운로드 서비스 하는 경우, 허용 파일에 대한 목록을 작성
목록의 범위안의 파일에 대해서만 제한적으로 접근 또는 다운로드 할 수 있도록 설계
④ 원격지에서 다운로드 받은 파일을 사용하거나 실행하는 기능을 구현해야 하는 경우
해당 파일과 파일의 체크섬 값(해시 값 등)을 같이 다운로드 받아 파일에 대한 무결성 검사를 수행 한 뒤 사용
파일 업로드 기능 구현 시 아래와 같은 프레임워크의 사용을 고려하여 기능의 목적에 부합하는 형식의 파일만 업로드 하도록 허용
Java : Spring
Php : CodeIgniter
ASP.NET : .NET Framework
서버 측에서 실행될 수 있는 스크립트 파일(asp, jsp, php 파일 등)을 업로드 가능하고, 이 파일을 공격자가 웹으로 직접 실행시킬 수 있는 경우 시스템 내부 명령어를 실행하거나 외부와 연결하여 시스템을 제어할 수 있게 된다.
외부입력값에 대해 경로조작에 사용될 수 있는 문자를 필터링하지 않으면, 예상 밖의 접근제한 영역에 대한 경로 문자열 구성이 가능해져 시스템 정보누출, 서비스 장애 등을 유발할 수 있는 취약점
원격으로부터 소스코드 또는 실행파일을 무결성 검사 없이 다운로드 받고 이를 실행할 경우, 호스트 서버의 변조, DNS 스푸핑(Spoofing) 또는 전송 시의 코드 변조 등의 방법을 이용하여 공격자가 악의적인 코드를 실행 가능