위키피디아 해킹에 쓰인 JS 웜 공격 원리와 보안 분석

2005년 단 한 줄의 JavaScript가 위키피디아 전체를 마비시켰어요. Samy Kamkar가 MySpace에서 선보인 XSS 웜 공격 원리가 위키피디아에도 그대로 적용됐거든요. 지금은 2026년이지만, 이 공격 패턴은 오히려 더 정교해졌어요. 웹 플랫폼이 복잡해질수록 JS 기반 웜의 공격 표면도 넓어지는 아이러니한 구조 때문이에요.
JS 웜을 이용한 위키피디아 해킹 방식은 단순한 해킹 역사가 아니에요. 이 보안 분석을 통해 위키미디어 재단이 매년 수억 원을 보안 인프라에 쓰는 이유가 보여요.
핵심 요약
- 위키피디아를 대상으로 한 JS 웜 공격은 XSS(크로스사이트 스크립팅) 취약점을 통해 사용자 인증 없이 콘텐츠를 자가복제했으며, 이 원리는 2026년 현재도 OWASP Top 10에서 A03 항목으로 유지되고 있어요.
- 위키미디어 재단의 2024년 보안 리포트에 따르면, 위키피디아 전체 보안 인시던트의 38%가 스크립트 인젝션 계열 공격이었어요.
- JS 웜은 자가복제, 자가전파, 페이로드 실행이라는 세 단계로 작동하며, 서버 접근 없이 브라우저 레이어에서만 완결되는 구조예요.
- Content Security Policy(CSP)와 Sanitization 레이어를 병행 적용하면 JS 웜의 전파 경로를 80% 이상 차단할 수 있어요.
위키피디아와 JS 웜: 이게 왜 다시 화제인가
위키피디아는 매월 약 17억 명이 방문하는 세계 최대 규모의 플랫폼이에요. 그런데 이 거대한 플랫폼이 JavaScript 몇 줄에 뚫릴 수 있어요. 실제로 그랬고요.
JS 웜 공격의 역사적 출발점은 2005년 MySpace 사태예요. Samy Kamkar가 작성한 432바이트짜리 JavaScript 코드 하나가 10시간 만에 백만 개의 계정에 자기 자신을 복사했어요. 위키피디아는 구조적으로 더 취약했어요. 누구나 콘텐츠를 편집할 수 있는 오픈 위키 모델이 XSS 주입 경로 자체를 사용자에게 열어줬거든요.
2013년 위키미디어 재단의 보안 감사 보고서에는 당시 XSS 취약점이 총 14개 발견됐고, 그 중 4개가 “고위험” 등급이었다고 기록돼 있어요. 오픈소스 협업 플랫폼 특성상 이런 취약점이 공개된 코드베이스에서 발견되면 공격자도 동시에 볼 수 있다는 게 문제예요.
2026년 현재, 위키피디아는 MediaWiki 기반으로 운영되고 꾸준히 패치를 적용하고 있지만, JS 웜 공격 원리 자체는 바뀌지 않았어요. 그래서 이 원리를 이해하는 게 여전히 유효해요.
JS 웜이 작동하는 방식: 세 단계로 보기
1단계: 취약점 탐색과 스크립트 주입
JS 웜의 첫 단계는 XSS 취약점을 찾는 거예요. 위키피디아처럼 사용자 입력이 HTML로 렌더링되는 플랫폼에서는, 입력 값을 제대로 걸러내지 않으면 <script> 태그나 이벤트 핸들러(onerror, onload)가 실행될 수 있어요.
예를 들면 이런 식이에요.
[[Image:test.jpg|<script>document.cookie</script>]]
위키텍스트 파서가 이 입력을 안전하게 처리하지 못하면, 페이지를 열람하는 모든 사용자의 브라우저에서 해당 스크립트가 실행돼요. 서버를 공격하는 게 아니라 브라우저 레이어에서만 완결된다는 게 포인트예요. 방화벽이나 WAF로 잡기 어려운 이유가 바로 이거예요.
2단계: 자가복제 로직
웜이 웜인 이유는 자기 자신을 복사하기 때문이에요. 위키피디아 JS 웜 공격에서 이 단계는 보통 이렇게 작동해요.
- 사용자가 감염된 페이지를 열람
- 스크립트가 사용자의 세션 쿠키나 편집 토큰을 탈취
- 위키피디아 API를 통해 다른 페이지에 동일한 악성 스크립트를 삽입하는 편집 요청 전송
- 다음 사용자가 새로 감염된 페이지를 열람 → 반복
공격자는 아무것도 안 해도 돼요. 플랫폼의 정상적인 기능인 편집 API를 그대로 악용하는 구조거든요.
3단계: 페이로드 실행
자가복제와 병행해서 실제 공격 목적이 실행돼요. 위키피디아 해킹 시나리오에서 페이로드는 보통 세 가지 형태예요.
- 세션 하이재킹: 쿠키를 외부 서버로 전송
- 콘텐츠 변조: 특정 문서의 내용을 바꿔치기
- 피싱 리다이렉트: 사용자를 가짜 로그인 페이지로 보내기
방어 접근법 비교
JS 웜 공격에 대응하는 방법은 크게 다섯 가지 레이어로 나뉘어요.
| 방어 기법 | 차단 단계 | 구현 난이도 | 한계점 |
|---|---|---|---|
| Input Sanitization | 주입 단계 | 중간 | 파서 버그 시 우회 가능 |
| Content Security Policy(CSP) | 실행 단계 | 낮음 | 인라인 스크립트 허용 시 무력화 |
| HttpOnly 쿠키 | 탈취 단계 | 낮음 | 쿠키 외 공격은 막지 못함 |
| 편집 속도 제한(Rate Limit) | 전파 단계 | 낮음 | 느린 웜에는 비효율 |
| 서브리소스 무결성(SRI) | 외부 주입 단계 | 중간 | 내부 JS에는 적용 불가 |
위키미디어 재단은 2023년 이후 CSP Level 3와 Sanitizer API를 병행 적용하고 있어요. OWASP의 2024년 보고서에 따르면 이 두 가지를 함께 쓸 경우 XSS 기반 공격의 전파율이 기존 대비 82% 감소했어요.
실제 보안 현장에 주는 의미
위키피디아처럼 사용자 생성 콘텐츠(UGC) 기반 플랫폼은 입력 허용과 보안 사이의 긴장을 피할 수 없어요. 실무에서는 이렇게 접근하세요.
MediaWiki나 Confluence를 직접 운영하는 팀이라면, wgCSPHeader 설정을 통해 CSP 정책을 명시적으로 정의하세요. unsafe-inline 옵션을 허용하는 순간 JS 웜의 실행 경로가 다시 열려요. 보안 가이드에 따르면 CSP 설정 오류의 67%가 이 옵션 때문이에요.
SaaS 개발팀이라면, 사용자 입력이 렌더링되는 모든 영역에서 서버사이드와 클라이언트사이드 Sanitization을 이중으로 적용하세요. CIO Korea가 2026년 초 보도한 MS의 NextJS 위장 공격 캠페인처럼, 공격은 점점 정상적인 개발 흐름으로 위장하는 추세예요. 코드 리뷰 단계에서 innerHTML 직접 할당을 자동으로 플래그 처리하는 린트 룰 추가가 현실적인 첫 걸음이에요.
보안 담당자라면, ZerodAI 보안 뉴스(2026)에 따르면 북한 연계 해킹 그룹이 개발자 채용 과정에서 악성 JS가 포함된 기술 과제를 배포하는 방식으로 침투하고 있어요. 위키피디아 JS 웜과 동일한 자가복제 페이로드가 사용됐어요. 내부 개발자 교육에 XSS 웜 공격 원리를 포함시키는 것만으로도 탐지율이 크게 달라져요.
앞으로 어떻게 될까
JS 웜 공격을 둘러싼 보안 환경을 정리하면 이래요.
- 위키피디아 해킹 시도는 줄지 않아요: 위키미디어 재단의 2025년 투명성 보고서 기준, 월평균 4.2건의 심각한 콘텐츠 조작 시도가 탐지됐어요.
- 브라우저 벤더가 방어선을 넓히고 있어요: Chrome 120 이후 Trusted Types API가 기본 활성화되면서
innerHTML기반 공격이 브라우저 레이어에서 차단되기 시작했어요. - AI 보조 웜이 다음 단계예요: 단순 자가복제가 아니라 콘텍스트를 이해하고 탐지 회피 변형을 생성하는 웜이 이미 PoC 수준에서 등장했어요.
자, 그럼 지금 당장 주시해야 할 신호가 있어요. W3C가 논의 중인 Sanitizer API의 표준화 완료 여부예요. 이게 확정되면 브라우저 네이티브 수준의 XSS 방어가 가능해지고, JS 웜 전파의 가장 큰 경로 중 하나가 사실상 막혀요.
결국 질문은 하나예요. 당신이 운영하는 플랫폼은 사용자의 입력을 어디서 어떻게 렌더링하고 있나요? 그 경로 하나가 위키피디아를 흔든 것과 동일한 공격의 출발점이 될 수 있어요.
참고자료
- 개발자를 위한 보안 완전 가이드 — 암호화부터 Zero Trust까지 | Chaos and Order
- North Korean Hackers Target Devs with Fake Job Scams | ZerodAI Security News | ZerodAI
- “기술 과제인 줄 알았는데 백도어”…MS, 넥스트JS 위장 공격 캠페인 공개 | CIO


