버퍼 오버플로우·파일 업로드 보안: 크기·형식·실행 권한의 경계

1장 개념과 보호 목표#

버퍼 오버플로우는 할당된 버퍼의 경계를 넘어 쓰는 오류입니다. 경계 밖의 읽기 역시 정보 노출을 일으킬 수 있는 메모리 안전성 문제입니다. 파일 업로드 취약점은 외부 파일을 신뢰하거나 실행 가능한 위치에 저장하는 등의 처리 실패입니다. 두 문제 모두 입력과 자원 경계를 명확히 해야 합니다.


2장 원리와 구분#

메모리 안전 언어와 경계 검증을 우선 고려하고 ASLR·실행 방지·스택 보호 같은 완화 기법을 결합합니다. 완화 기법은 잘못된 메모리 처리를 수정하는 일을 대체하지 못합니다. 업로드는 확장자와 MIME 헤더만 믿지 않고 허용 형식, 실제 콘텐츠, 크기와 압축 해제 후 자원 사용을 검증합니다.

압축 파일은 작은 업로드라도 해제 후 매우 큰 데이터를 만들 수 있습니다. 전체 해제 크기와 파일 수·중첩 깊이·처리 시간을 제한하고 임시 저장소의 용량도 분리 관리합니다. 검사나 변환 도구 자체가 외부 파일을 처리하므로 업데이트와 낮은 실행 권한, 격리된 처리 환경을 적용해야 합니다.


3장 비교와 판단 기준#

경계 검증 대상 통제
메모리 길이·인덱스·수명 안전한 언어·경계 검증
파일 처리 형식·크기·압축 해제 허용 목록·자원 상한
파일 저장 경로·이름·실행 분리 저장·서버 생성명·실행 차단
파일 제공 소유권·검사 상태 다운로드 인가·검사 완료 확인

4장 메모리의 길이·인덱스·수명을 구분한다#

할당 범위를 넘는 쓰기는 데이터나 제어 상태를 손상시킬 수 있고 범위 밖 읽기는 정보를 노출할 수 있습니다. 길이 검사뿐 아니라 정수 변환·할당 크기·객체 수명·동시 접근의 조건을 봅니다. 서로 다른 메모리 안전성 문제를 모두 같은 문자열 길이 문제로만 설명하지 않습니다.

네이티브 코드와 외부 라이브러리는 사용하는 언어가 메모리 안전해도 남을 수 있습니다. 안전한 언어·API를 우선 검토하고 위험 영역의 검증·패치·격리를 유지합니다.


5장 완화 기법과 원인 수정#

ASLR·실행 방지·스택 보호 등은 악용 가능성을 줄이는 수단입니다. 경계 오류를 직접 고치는 일의 대체가 아닙니다. 장비·컴파일·런타임에서 실제 활성화된 조건을 확인하고 원래의 잘못된 메모리 처리를 수정합니다.

결함의 원인: 잘못된 경계·길이·수명 처리
완화: 악용 경로의 일부를 어렵게 함
수정: 잘못된 처리 제거와 결과 검증
운영: 패치·격리·관측으로 남은 위험 관리

6장 업로드는 여러 단계의 신뢰 경계를 지난다#

파일을 받는 것, 디코딩·검사·변환하는 것, 저장하는 것, 제공하는 것은 각각 다른 경계입니다. 어느 단계에서 외부 데이터를 신뢰하기 시작하는지 명시해야 합니다. 파일의 내용뿐 아니라 이름·경로·형식·크기·수량·권한·상태도 검증 대상입니다.

flowchart LR
 U["업로드"] --> Q["대기 저장소"]
 Q --> V["형식·자원·악성 검사"]
 V --> C["필요한 안전한 변환"]
 C --> S["허용 상태로 저장"]
 S --> D["다운로드 인가와 제공"]

7장 확장자와 MIME을 그대로 믿지 않는다#

클라이언트가 제시한 이름과 헤더는 조작될 수 있습니다. 허용 형식과 실제 콘텐츠의 처리 결과를 확인합니다. 형식이 맞아도 파서의 취약점이나 매우 큰 해상도·구조로 자원을 소모할 수 있어 시간·메모리·크기 제한이 필요합니다.

지원 형식은 업무상 필요한 범위로 줄이고 유지보수되는 파서·변환기를 사용합니다. 검사 도구 자체가 공격 표면이므로 낮은 권한과 격리 환경을 적용합니다.


8장 압축 해제의 크기를 따로 제한한다#

업로드 파일이 작아도 해제 결과는 클 수 있습니다. 파일 수·총 해제량·중첩 깊이·처리 시간·임시 저장소를 제한합니다. 업로드 바이트 한도만 설정했다는 사실로 압축 파일의 비용을 제한했다고 보지 않습니다.

압축 내 경로가 저장 디렉터리 밖으로 나가는지와 파일 이름·링크 처리도 검토합니다. 실제 사용하는 라이브러리의 안전한 추출 기능과 제한을 시험해야 합니다.


9장 저장 이름과 경로는 서버가 결정한다#

사용자 파일명을 실제 저장 경로에 그대로 결합하지 않습니다. 서버가 식별자를 만들고 정해진 저장소 안에 보관합니다. 원래 파일명은 필요한 표시용 메타데이터로 취급하고 출력 문맥에서도 안전하게 처리합니다.

실행 권한이 없는 분리 저장소와 제공 경로를 사용합니다. 웹 서버의 실행 디렉터리에 올려 두고 확장자 검사만 하는 방식은 불필요한 위험을 남길 수 있습니다.


10장 검사 대기와 공개 상태#

검사 전에 URL을 만들어 공개하면 비동기 검사 시간 동안 접근할 수 있습니다. 대기·검사 중·승인·거부·실패의 상태 전이를 정하고 허용 상태만 제공하도록 합니다. 중단·재시도에서 파일이 누락되거나 잘못 공개되는지도 확인합니다.

flowchart TB
 A["수신: 비공개 대기"] --> B["검사·변환"]
 B --> C{"통과했는가?"}
 C -->|"예"| D["허용 상태와 제공 정책"]
 C -->|"아니오"| E["거부·격리·정리"]
 B --> F["실패 시 비공개 상태 유지"]

11장 이미지 재인코딩의 의미#

지원 형식의 데이터를 안전한 파서로 읽고 필요한 표현으로 다시 만들면 일부 불필요한 내용이나 형식을 제한하는 데 활용할 수 있습니다. 그러나 파서의 취약점과 자원 비용까지 없어지는 것은 아닙니다. 메타데이터의 개인정보와 유지 필요도 검토합니다.

악성코드 검사도 보완 수단입니다. 통과한 파일을 무제한 실행하거나 다른 사용자가 모두 읽게 하지 않습니다. 형식·격리·인가와 제공 헤더를 함께 설계합니다.


12장 다운로드의 소유권과 응답 헤더#

파일 ID를 알더라도 대상 파일의 소유 조직·권한·검사 상태를 서버에서 확인합니다. 임의 이름의 URL이나 추측하기 어려운 ID만으로 인가를 대신하지 않습니다. 제공 방식과 Content-Type·다운로드 정책은 실제 브라우저의 해석을 고려합니다.

단말과 공유 링크의 보유기간·회수도 정합니다. 저장 경로가 안전해도 공개 링크의 권한·만료가 부적절하면 데이터가 노출될 수 있습니다.


13장 시험에 실패·대량·동시 상태를 넣는다#

경계 시험 조건
형식 불일치 확장자·헤더·손상 파일
자원 큰 해상도·해제량·파일 수·시간
저장 경로 조작·충돌·실행 차단
상태 검사 중 접근·중단·재시도
인가 타인 파일·다른 조직·만료 링크

허용된 정상 파일의 업무 성공과 모든 실패 상태의 비공개 유지까지 확인합니다. 검사를 추가했다는 사실보다 실제 신뢰 경계가 유지되는지가 핵심입니다.


14장 적용 사례와 운영 방법#

프로필 이미지는 서버가 파일명을 새로 부여하고 실행 권한이 없는 분리 저장소에 보관합니다. 필요하면 안전한 디코딩·재인코딩을 거치고 악성코드 검사를 적용합니다. 다운로드에서도 사용자 소유권을 검증해야 하며 검사 완료 전 공개되는 경쟁 조건을 피합니다.


15장 메모리 경계와 파일 처리 경계는 연결되지만 다르다#

버퍼 경계를 넘는 쓰기는 데이터나 제어 흐름을 손상시킬 수 있고 경계를 넘는 읽기는 정보를 노출할 수 있습니다. 길이 검사만 아니라 정수 오버플로우·할당 크기·객체 수명과 동시 접근도 검토해야 합니다. 메모리 안전 언어를 도입해도 외부 네이티브 라이브러리와 unsafe 영역은 별도 점검 대상입니다.

파일 업로드는 업로드 바이트, 디코딩·압축 해제 결과, 검사·변환 도구, 저장 경로, 다운로드의 여러 경계를 거칩니다. MIME 값은 클라이언트가 제시할 수 있어 실제 형식 확인과 허용 목록을 함께 사용합니다. 파일명이 경로나 실행 정책을 결정하지 않도록 서버에서 이름을 새로 부여합니다.


16장 검사 대기 상태와 공개 상태를 분리하기#

파일을 받자마자 공개 URL을 만들고 나중에 검사하면 검사 전에 접근하는 경쟁 조건이 생길 수 있습니다. 대기 저장소에서 검사를 수행하고 통과한 파일만 공개 또는 허용된 다운로드 경로로 이동시키는 상태 전이를 설계합니다. 실패·중단·재시도 때 대기 파일이 남거나 공개되는지도 시험합니다.

허용된 이미지라도 파서 취약점이나 큰 해상도로 자원을 소모할 수 있습니다. 격리 환경, CPU·메모리·시간·압축 해제량 제한과 라이브러리 갱신을 적용합니다. 다운로드는 소유권·조직 권한·검사 상태와 적절한 응답 헤더를 검증해야 합니다.


17장 적용 전 확인할 사항#

  • 입력·압축 해제·처리 시간의 상한을 둔다
  • 저장 경로와 이름을 서버에서 결정한다
  • 검사 상태와 다운로드 인가를 함께 확인한다

18장 자주 묻는 질문#

백신 검사에 통과한 파일은 바로 신뢰해도 되나요?#

검사는 보완 수단입니다. 실행 차단, 형식 검증, 격리 저장과 접근 권한을 함께 적용해야 미탐이나 새로운 위협의 영향을 줄일 수 있습니다.

확장자를 jpg로 바꾸면 이미지로 판단해도 되나요?#

확장자는 실제 내용의 증거가 아닙니다. 허용 형식과 콘텐츠 파싱 결과를 확인하고 실행·제공 정책을 함께 적용해야 합니다.

ASLR과 실행 방지가 있으면 버퍼 결함을 수정하지 않아도 되나요?#

악용 가능성을 줄이는 완화 수단입니다. 원래의 메모리 처리 결함을 수정하고 영향 범위를 검증해야 합니다.


함께 읽기#