개발자 채용 제안으로 받은 SVG 파일 내부에 자바스크립트가 포함되어 있다면, 브라우저가 파일을 렌더링하는 순간 악성 스크립트가 즉시 실행된다. 이 과정에서 세션 쿠키와 로컬 스토리지의 인증 토큰이 탈취된다. 이렇게 빠져나간 정보는 공격자의 외부 서버로 전송되어 세션 하이재킹이나 계정 권한 탈취 같은 심각한 보안 사고로 이어진다.
SVG 파일의 구조적 특성과 SVG 악성코드 개발자 피싱의 메커니즘
SVG(Scalable Vector Graphics)는 일반적인 이미지 파일과 달리 XML 기반의 텍스트 형식이다. 덕분에 SVG 파일 내부에는 <script> 요소를 넣을 수 있고, 브라우저는 이 파일을 열 때 내장된 자바스크립트를 정상적인 코드로 인식해 실행한다. 공격자들은 XML 구조의 유연성과 브라우저 렌더링 방식을 악용해 단순한 이미지로 위장한 악성 페이로드를 배포한다.
최근 공격 트렌드는 단순 피싱을 넘어 정교한 사회공학적 기법을 결합한다. 특히 개발자에게 매력적인 채용 제안이나 코딩 테스트 과제 파일로 SVG 파일을 보내는 사례가 늘고 있다. 개발자가 내용을 확인하려 파일을 브라우저로 여는 순간, 숨겨진 자바스크립트가 실행되며 백그라운드에서 정보 탈취 프로세스가 시작된다.
이런 공격은 기존 백신이나 보안 스캐너를 우회할 만큼 정교하다. VirusTotal 분석 결과, 정교하게 설계된 SVG 악성코드는 다수의 보안 스캐너가 탐지하지 못하는 낮은 탐지율을 보였다. SVG가 표준 이미지 포맷으로 인식되기에 파일 시그니처 검사만으로는 내부 스크립트 실행 여부를 완전히 걸러내기 어렵기 때문이다.
개발자를 타겟으로 한 구체적인 공격 벡터와 피해 사례
최근 보안 사고들은 SVG 악성코드가 얼마나 광범위하고 치명적인지 보여준다. 2025년 9월 보고된 피싱 캠페인에서는 콜롬비아 사법 제도를 사칭한 이메일로 악성 SVG 파일을 배포했다. 사용자가 파일을 여는 즉시 악성 페이로드가 실행되어 시스템 제어권을 획득하거나 내부 정보를 유출했다.
개발자 생태계를 겨냥한 S1ngularity 캠페인은 피해가 더 컸다. AI 지원 공격 방식을 도입한 이 캠페인은 npm 공급망을 침투해 2,000개 이상의 GitHub 계정에 영향을 미쳤다. 공격자들은 개발 환경에 침투해 프라이빗 시크릿과 인증 토큰을 가로챘고, 이를 통해 오픈소스 프로젝트 코드베이스를 오염시키거나 기업 내부 저장소 접근 경로를 확보했다.
파일 업로드 기능을 통한 Stored XSS(저장형 크로스 사이트 스크립팅) 공격도 빈번하다. 2025년 말 공개된 유튜브 버그바운티 영상 “Stored xss via File Upload Leads to $3000 Bounty” 사례에서는 보안 플랫폼의 파일 업로드 취약점을 통해 SVG 내 <script> 태그를 삽입해 실제 보상금을 획득한 과정이 공개됐다. 공격자가 업로드한 SVG 파일을 다른 사용자가 조회할 때마다 악성 코드가 자동으로 동작해 지속적으로 정보를 탈취할 수 있음을 시사한다.
SVG 기반 정보 탈취의 기술적 경로 및 프로세스
SVG 파일에 숨겨진 악성 코드가 실행되면 브라우저 보안 컨텍스트 내에서 다음과 같은 단계로 정보 탈취가 진행된다.
- 파일 실행 및 스크립트 활성화: 사용자가 SVG 파일을 브라우저로 열거나 Stored XSS가 적용된 페이지에 방문하면, 브라우저가 XML 내
<script>태그를 해석해 자바스크립트를 실행한다. - 브라우저 저장소 접근: 실행된 스크립트가
document.cookie,localStorage,sessionStorage등 브라우저 저장소에 접근해 세션 ID, JWT(JSON Web Token), API 키 등을 읽어 들인다. - 데이터 외부 전송: 탈취한 데이터를
fetchAPI나XMLHttpRequest로 공격자가 제어하는 외부 C2(Command and Control) 서버에 전송한다. - 세션 하이재킹 수행: 공격자는 탈취한 세션 쿠키를 자신의 브라우저에 주입해 피해자의 로그인 상태를 복제하며, 비밀번호 없이 계정에 접속한다.
이 과정에서 onerror나 onload 같은 이벤트 핸들러 속성을 쓰면 <script> 태그 없이도 자바스크립트를 실행할 수 있다. 단순한 문자열 필터링 기반 보안 솔루션을 더 쉽게 우회하는 수법이다.
SVG 보안 위험성 및 대응 방안 비교
개발자와 보안 담당자가 SVG 파일을 다룰 때 적용해야 할 보안 기준과 대응 방안은 다음과 같다.
| 구분 | 위험 요소 | 권장 대응 방안 (Best Practice) |
|---|---|---|
| 파일 수신 및 확인 | 알 수 없는 출처의 SVG 실행을 통한 XSS | 뷰어가 아닌 텍스트 에디터(VS Code, Vim 등)로 열어 스크립트 포함 여부 확인 |
| 인증 정보 관리 | 토큰 및 프라이빗 시크릿 탈취 | 정기적인 토큰 로테이션 수행 및 최소 권한 원칙 적용 |
| 서비스 렌더링 | 사용자 업로드 SVG를 통한 Stored XSS | DOMPurify 라이브러리를 통한 태그 정제(Sanitization) 적용 |
| 브라우저 보안 설정 | 임의의 스크립트 실행 및 외부 전송 | Content-Security-Policy(CSP) 설정 및 iframe sandbox 속성 부여 |
| 서버측 검증 | MIME 타입 우회 및 악성 파일 업로드 | Magic Number 검사 및 허용되지 않은 XML 태그 필터링 |
실무자를 위한 단계별 SVG 보안 체크리스트
외부 파일을 처리하거나 서비스 내에 SVG 업로드 기능을 구현할 때 준수해야 할 가이드는 다음과 같다.
- 출처 불분명한 SVG 파일 실행 금지: Circuit Brief(2025-09-06)의 권고대로, 신뢰할 수 없는 소스에서 온 SVG 파일은 브라우저로 바로 클릭하지 않는다.
- 텍스트 기반 정적 분석 수행: 파일을 열기 전 텍스트 에디터에서
<script>,onerror,onload,href="javascript:..."같은 키워드가 있는지 검색해 검증한다. - 인증 시크릿 즉각 교체: 의심스러운 SVG 파일을 실행했거나 오픈소스 프로젝트 계정이 노출되었다고 판단되면 즉시 모든 API 토큰과 프라이빗 시크릿을 Rotate(교체)한다.
- 프론트엔드 렌더링 최적화: SVG를 화면에 출력할 때는
<img>태그를 사용한다.<img>태그로 불러온 SVG는 브라우저가 스크립트 실행을 자동으로 차단하기 때문이다. 반면 인라인 SVG나<object>,<iframe>태그는 스크립트가 실행될 위험이 있어 주의해야 한다. - 백엔드 필터링 강화: 파일 업로드 시 확장자뿐 아니라 실제 바이너리 헤더(Magic Number)를 확인하고, XML 파서를 통해 위험한 태그를 제거하는 화이트리스트 기반 필터링을 적용한다.
결론 및 요약
SVG 파일은 단순한 이미지가 아니라 실행 가능한 코드를 담을 수 있는 XML 문서다. 최근 개발자 타겟 피싱은 이 특성을 이용해 채용 제안이나 과제 파일로 위장해 세션 토큰과 프라이빗 시크릿을 가로챈다. 이는 2,000개 이상의 GitHub 계정이 영향을 받은 사례처럼 대규모 공급망 공격으로 이어진다. 개발자는 SVG 파일을 텍스트 에디터로 먼저 확인하는 습관을 들여야 하며, 서비스 구현 시 DOMPurify와 CSP 같은 다층 방어 체계를 구축해야 한다.
지금 관리하는 오픈소스 프로젝트의 토큰 설정과 업로드 모듈 보안 설정을 점검해 예기치 못한 보안 사고를 방지하자.