flawopen.com/XSS/SVG 업로드
SVG 업로드는 XSS 위험이 있나요?
참고 페이지
핵심 답변
업로드된 SVG는 단순한 픽셀이 아니라 문서이며 스크립트나 이벤트 핸들러 같은 활성 요소를 포함할 수 있습니다. 실행 여부는 브라우저 컨텍스트에 달려 있습니다. <img>는 제한된 이미지 컨텍스트지만 인라인, 직접 탐색, 문서 임베딩은 활성화될 수 있습니다.
SVG가 다른 이미지 형식과 다른 점
PNG나 JPEG와 달리 SVG는 활성 콘텐츠를 포함할 수 있는 XML입니다. 브라우저는 <img> 같은 제한된 이미지 컨텍스트에서는 스크립트를 비활성화하지만 직접 열기, <object>, <iframe>, <embed>를 통한 문서 임베딩 또는 인라인 삽입에서는 그렇지 않습니다. 애플리케이션 origin의 활성 문서 컨텍스트에서 제공되는 프로필 이미지가 stored XSS가 될 수 있습니다. 동작은 컨텍스트에 달렸으며 확장자와 MIME은 정화가 아닙니다.
업로드를 안전하게 처리하기
- ✓저장 또는 표시 전에 유지 관리되는 SVG 전용 정화기와 명시적 allowlist를 사용하세요. 필요하지 않다면 실행 요소, 이벤트 핸들러, 외부 참조 및
foreignObject를 제거하고 정규식으로 XML을 정화하지 마세요. - ✓사용자에게 이미지 기능만 필요하다면 격리된 리소스 제한 프로세스에서 SVG를 래스터화해 결과를 제공하세요. 원본이 필요하지 않으면 web root 밖에 보관하세요.
- ✓애플리케이션 쿠키를 받지 않는 별도의 등록 가능 도메인에서 업로드를 제공하세요. 형제 하위 도메인도 부모 도메인 쿠키를 받을 수 있습니다.
- ✓신뢰할 수 없는 SVG 문서를 보존해야 한다면 다운로드를 강제하고 Content-Disposition: attachment 및
X-Content-Type-Options: nosniff를 설정하거나 <img> 같은 제한된 이미지 컨텍스트에서만 표시하세요. 인라인, <object>, <iframe>, 동일 origin의 문서 제공은 피하세요.
자주 묻는 질문
파일 확장자나 MIME 유형을 검증하면 해결되나요?
['파일 확장자나 MIME 유형을 검증하면 해결되나요?', '아닙니다. 확장자와 선언된 MIME은 메타데이터일 뿐 활성 문서 콘텐츠를 확인하지 않습니다. 실제 형식을 검증한 뒤 SVG 전용 allowlist 정화기를 적용하거나 SVG 기능이 필요하지 않으면 래스터 형식으로 변환하세요.']