Skip to content

Fix: 이미지 파일 업로드 보안 강화#85

Closed
tember8003 wants to merge 7 commits intodevfrom
Fix/uploadImageSecurity
Closed

Fix: 이미지 파일 업로드 보안 강화#85
tember8003 wants to merge 7 commits intodevfrom
Fix/uploadImageSecurity

Conversation

@tember8003
Copy link
Collaborator

@tember8003 tember8003 commented Sep 27, 2025

이미지 업로드 보안성 높이기

Apache Tika 의존성 추가

  • 파일의 실제 MIME 타입을 검출하기 위해 Apache Tika 라이브러리를 build.gradle에 추가

Double Extension 공격 방어 코드 추가
-> 기존 generateUniqueFileName 메서드에서 test.php.jpg 같은 이중 확장자를 허용하는 문제

파일명을 점(.)으로 분리하여 개수를 체크하는 검증 로직을 추가
위험한 확장자 블랙리스트(jsp, php, asp 등)를 만들어 파일명 어디에든 해당 확장자가 포함되면 차단
허용된 확장자 화이트리스트(jpg, jpeg, png, gif, webp)만 통과하도록 이중 검증을 추가
null byte injection 공격 방어를 위해 파일명에 \0이 포함되어 있는지 검사
파일명 길이를 255자로 제한하여 버퍼 오버플로우를 방지

Magic Number(파일 시그니처) 검증 기능 추가

Content-Type 헤더는 클라이언트가 조작 가능하므로 신뢰 불가능
verifyImageSignature 메서드를 새로 만들어 파일의 실제 바이트를 읽어 진짜 이미지 파일인지 확인
JPEG는 FF D8 FF로 시작하는지, PNG는 89 50 4E 47로 시작하는지 등 각 이미지 포맷의 고유 시그니처를 검증
IMAGE_SIGNATURES라는 static Map을 추가하여 각 이미지 타입별 시그니처를 정의

Apache Tika를 통한 실제 MIME 타입 검출

validateImageFile 메서드에 Tika를 사용한 MIME 타입 검출 로직을 추가
클라이언트가 보낸 Content-Type과 Tika가 검출한 실제 타입을 비교하여 불일치 시 경고 로그를 남김
실제 검출된 MIME 타입이 허용된 이미지 타입 목록에 있는지 최종 검증

메모리 기반 DoS 공격 방어 추가

  • 전체 파일을 메모리에 로드하는 file.getBytes() 방식의 메모리 고갈 위험 해결
  • 스트림 기반 파일 처리로 전환하여 8KB 청크 단위로 파일 처리
  • MemoryMXBean을 활용한 실시간 메모리 사용률 모니터링 기능 추가
  • 메모리 사용률 80% 임계점 설정으로 대용량 파일 업로드 시 서버 보호
  • mark()/reset() 기능을 활용한 헤더만 읽기로 Magic Number 검증 시 메모리 효율성 극대화
  • Apache Tika MIME 타입 검출도 스트림 기반으로 변경하여 메모리 사용량 최소화
  • markSupported() 체크로 스트림 안전성 검증 추가
  • 다중 파일 업로드 시 전체 파일 크기 사전 계산 후 메모리 체크 수행
  • INSUFFICIENT_MEMORY 에러 코드 추가로 메모리 부족 상황 명확히 처리

참고로 위에 있는 대부분의 보안적 코드는 클로드가 작성해준다는 것을 알아주십쇼. (보안력 다 빠짐 이슈)
저는 먼저 코드를 작성 후 해당 보안 이슈에 대해 블로그, 공식 문서로 공부하고 있습니다.
그렇기에 먼저 PR을 작성해서 올려두고 계속 공부하면서 수정과 추가를 이어나갈 계획입니당
한번에 다 올리면 나도 기억 못해

고민중인 거 : Rate Limiting 추가 <- 예전에 혼자 Spring 가지고 놀 때 한번 만들어본 경험은 있음.

  • 근데 이거까지 필요할까? 라는 생각이 들긴 함. 파일 올리는 거에서 과부화 일으키거나 DDos 방지용의 의미가 클듯?

댓글로 한번씩 피드백 주시기를 오네가이시마스

@tember8003
Copy link
Collaborator Author

민수햄 비상!!!!!!!!!!!!!!!!!!

@tember8003
Copy link
Collaborator Author

42 minutes ago <- 42분째 도는데 이거 맞음? 진짜 모름....

@tember8003 tember8003 closed this Sep 30, 2025
@tember8003 tember8003 deleted the Fix/uploadImageSecurity branch March 2, 2026 07:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant