악성코드 분석 2026-09-11
CVE-2026-42897 취약점을 악용한 자바스크립트 백도어
러시아 정부 연계 위협 그룹으로 알려진 TA488(Void Blizzard, Laundry Bear)이 2026년 7월부터 Microsoft OWA(Outlook Web Access) 환경을 타깃으로 한 대규모 하프클릭(Half-Click) 공격 캠페인을 전개하고 있음이 확인되었다. 이번 공격은 전 세계 정부 기관을 비롯해 텔레콤, 금융, 항공우주, 숙박업 등 다양한 핵심 산업군을 대상으로 진행되었으며, 단순 스팸으로 오인하기 쉬운 비즈니스 관련 메일을 활용해 피해자가 메일을 단순히 열람하기만 해도 악성 스크립트가 즉시 실행되는 방식을 취하고 있다.
공격진은 Exchange Server OWA의 HTML 입력값 검증 미흡으로 발생하는 CVE-2026-42897 취약점을 악용하였다. 본문에 링크나 악성 첨부파일을 포함시키는 대신, 이메일을 열어볼 때 동작하는 로더 스크립트를 통해 Base64로 인코딩되어 있던 OWAReaper 페이로드를 조립하고 브라우저 세션상에서 직접 실행시켰다. OWAReaper는 이전 Zimbra 메일 서버 공격에 쓰였던 ZimReaper의 변종이자 파일리스(Fileless) 기반의 정교한 브라우저 백도어로, 디바이스에 별도 파일 흔적을 남기지 않고 메모리 및 브라우저 세션 영역에서만 동작하는 특징을 가진다.
| CVE ID | CVE-2026-42897 |
|---|---|
| CVSS v3.1 | 8.1 (High) |
| 영향받는 제품 | Microsoft Exchange Server (온프레미스) — OWA(Outlook Web Access) |
| 영향받는 버전 | Exchange Server 2016 (CU23), 2019 (CU14/CU15), Subscription Edition RTM |
| 비고 | - 피해자가 악성 HTML 이메일을 OWA에서 열람(Preview/Read)하기만 해도 페이로드 실행 |
CVE-2026-42897은 이번 공격에 사용된 취약점으로 Exchange 기능 중 일부를 우회하여 공격하는 방식이다. Exchange는 수신 메일의 HTML 본문을 OWA 읽기 창에 렌더링하기 전에 서버 측에서 새니타이징(Sanitizing) 되면서, 스크립트 태그, 이벤트 핸들러, 위험한 URI 스킴 등을 제거하고 허용 목록(allow-list) 기반으로 태그·속성·스타일을 통과시키는 방식이다. 해당 취약점은 새니타이저가 일부 HTML/CSS 구조를 안전하다고 잘못 판정하는 결함으로 이를 통해 HTML 태그 내 특수 인코딩된 페이로드를 실행시키는 XSS 취약점이다.

<그림 1> CVE-2026-42897 공격 구조도
이번 공격에서는 CSS 문자열을 이용하여 새니타이저를 우회하였다. 공격 구문을 분석해보면 열린 따옴표 "Tahoma… 부터 마지막 " 까지를 하나의 문자열로 보고 "font-family 선언 하나"로 판정한다. 반면 브라우저의 CSS 파서는 “}” 를 만난 시점에서 문자열 블록을 닫고 에러 복구를 수행한 뒤, 뒤따르는 악성 셀렉터를 독립된 규칙으로 정상 적용한다. 결과적으로 <style> 태그가 허용되는 상황에서 임의의 CSS 규칙을 문서 전역에 주입할 수 있게 된다.

<그림 2> 새니타이저 우회 공격 부분
<그림 3>은 실제 공격에서 사용된 취약점 구문으로 해당 취약점을 이용하여 악성코드 은폐 목적의 스크립트를 실행하였다.

<그림 3> 취약점을 이용하여 새니타이저 탐지 우회 및 스크립트 실행
| 주요 기능 | 실행된 스크립트 |
|---|---|
| 화면 전체 투명 오버레이 | position:fixed; opacity:0; width:100%; height:100%; z-index:999999 |
| 보안 경고·확인 대화상자 은폐 | div.popupPanel { display:none } |
| 우클릭 메뉴 무력화("원본 보기" 차단) | div[class*='contextMenu'] { opacity:0 } |
<표 1> 공격 은폐에 사용된 스크립트
| 이름 | Language Preservation Brief.html |
|---|---|
| 파일 타입 | html |
| 파일 크기 | 67.22 KB (68829 bytes) |
| MD5 | 791e450f020f6858d312df484f43f8d4 |
| SHA256 | 6897b649f29e54d8910459963bbf94ed5c7a4fe66a56bc5962540b226b8e48c4 |
| 동작 |
1.CVE-2026-4289 취약점을 이용한 HTML 새니타이저 우회
2.페이로드를 조각내어 공격 코드 은폐
3.자바스크립트 기반 백도어 실행
|
CVE-2026-42897 취약점을 통해 공격 은폐를 진행한 뒤 숨겨진 스크립트를 실행한다. 스크립트는 Img src가 “data:image/svg+xml;base64” 인 인라인 이미지 코드 내 숨겨져 있어 원격 이미지 차단 정책을 우회하며, onload 이벤트로 되어 있어 메일을 여는 순간 스크립트가 즉시 실행된다.

<그림 4> Img src 내 숨겨진 악성 스크립트
스크립트는 Base64로 인코딩되어 있고, 복호화하면 html 전체에서 <img> 태그 중 src에 #이 포함된 데이터를 수집하여, join 함수를 통해 전체 페이로드를 완성하고, eval 함수로 페이로드를 실행한다.

<그림 5> 복호화한 스크립트
숨겨진 페이로드가 실행되면 <div title=“vexih”> 태그를 식별하여 감염 이메일 본문에서 제거한다. 해당 태그에는 CVE-2026-4289 취약점 코드가 포함되어 있다. 또한 img src 태그에 숨겨진 페이로드 또한 삭제한다. 공격 코드가 포함된 태그를 삭제하여 피해자가 이메일을 다시 열어도 악성코드 삽입 흔적을 확인할 수 없도록 한다.

<그림 6> 공격 스크립트가 숨겨진 태그 삭제

<그림 7> img src 태그 내 숨겨진 페이로드 삭제
C2와 통신을 위해 초기 세팅을 설정한다. 초기 설정으로 공격자의 공개키와 C2 도메인, C2 DNS 서버를 설정한다. Checkip.amazonaws.com, 1.1.1.1/cdn-cgi/trace에 접속하여 피해자의 IP를 확인한 뒤 C2에 전송한다.

<그림 8> C2 통신을 위한 초기 세팅

<그림 9> 피해자 IP 정보 수집
그 후 C2와 대리 통신할 프록시 서버를 랜덤하게 설정한다. 이러한 프록시를 통해 피해자단에서는 위장된 프록시 주소만 보이고, C2와의 통신은 프록시에서 진행된다.

<그림 10> 프록시 서버 설정
프록시가 설정되면 C2와 통신에 사용할 패킷을 조합한다. 패킷에는 피해자에게서 탈취한 정보가 포함되며, 해당 정보는 AES-CTR 알고리즘으로 암호화한다. 그 후 전체 패킷을 XOR로 인코딩한 뒤 C2에 전달한다.

<그림 11> C2 통신 패킷 조합
C2와 통신할 네트워크 설정이 완료되면 지속적인 공격을 위해 OWA localStorage에 공격 페이로드를 저장한다. 지속성 설정이 완료되면 Stage 3 공격 코드를 실행한다.

<그림 12> OWA localStorage에 공격 페이로드 저장
Stage 2와 같이 C2와 원활한 통신을 위해 네트워크 설정을 진행한다. 그 후 백도어의 기능을 실행하기 위해 공격 명령어들을 설정한다. 공격 명령어는 __ctx.abilities에 저장되며, C2에 의해 명령어 추가 및 강제 종료 기능도 같이 구현되어 있다.

<그림 13> C2 명령어 추가 및 실행중인 명령어 강제 종료 기능

<그림 14> C2 명령어 파서
__ctx.abilities에 설정된 기본 명령어는 8개가 있으며, 각 명령어들의 동작은 <표 2>와 같다.
| 명령어 | 주요 동작 |
|---|---|
| !email_commands | IndexedDB 메일 읽기 |
| !ews_token | EWS 토큰 획득 |
| !gather_autocomplete_password | 자격 증명 탈취 |
| !gather_info | 시스템 정보 수집 |
| !github_commands | GitHub 명령 수신 |
| !keepalive | 연결 확인 |
| !poison_db_cache | IndexedDB 오염 |
| !share_folders | 폴더 접근제어 변경 |
<표 2> 각 명령어 주요 동작
각 명령어를 분석해보면 !email_commands는 공격자가 피해자에게 특수 이메일을 보내 전달한 명령을 파싱하기 위한 명령어로 IndexedDB의 “owa_offline_db“ .message에서 최신 30개의 이메일을 스캔하고, 스캔한 이메일의 UniqueBody.Value에 대한 값을 파싱하여 공격자의 명령어를 확인한다.

<그림 15> IndexedDB 내 메일 파싱 및 명령 확인
!ews_token 명령어는 OWA의 Exchange 설치 앱 목록을 가지고와 ReadWriteMailbox 권한 앱을 찾는다. 그 후 GetClientAccessToken으로 Oauth Bearer 토큰을 탈취한다. 탈취한 토큰을 이용하면 EWS(Exchange Web Services) API로 직접 접근하여 메일 읽기, 삭제, 전달 등을 할 수 있게 된다.

<그림 16> EWS 토큰 탈취
!gather_autocomplete_password 명령어는 브라우저의 자동 완성을 하이재킹하는 공격으로 명령어가 실행되면 브라우저 DOM를 통해 숨겨진 계정 입력 폼을 삽입한다. 이 때 브라우저는 해당 입력 폼이 정상 로그인 폼인지 구별하지 못하고 자동 완성으로 저장된 계정 정보를 입력하게 된다. 하이재킹으로 수집한 계정 정보는 C2로 전송된다.

<그림 17> 브라우저 자동 완성 하이재킹
!gather_info 명령은 OWA 세션 데이터를 수집해 피해자의 신원 정보 및 Exchange 전체 환경 설정을 ‘msanalytics.json’ 파일에 저장하여 C2로 전송한다.

<그림 18> OWA 세션 데이터 수집 및 C2로 전송
!github_commands 명령은 Github API로 targetID가 포함된 커밋 메시지를 검색한다. targetID는 공격자가 임의로 정할 수 있으며, 커밋 메시지 안에는 암호화된 정보를 숨겨 C2에게 전달한다. 정상적인 Github 트래픽을 이용하여 중요한 정보를 C2와 공유하고, 보안 솔루션의 탐지를 피하기 위해 사용된다.

<그림 19> Github 커밋 기능을 이용한 정보 전달
!keepalive는 백도어 생존 여부 확인을 위한 Ping 명령 역할을 한다. !poison_db_cache 명령은 페이로드의 지속성을 위한 명령으로 OWA에 저장된 이메일함을 확인하기 위해 IndexedDB의 owa_offline_db 획득을 시도한다. 만약 DB가 없다면 숨겨진 iframe을 이용하여 OWA 설정 페이지를 직접 연 후 오프라인 DB 저장을 설정한다.

<그림 20> indexedDB에서 owa_offline_db 수집

<그림 21> iframe을 이용한 OWA 설정 페이지 조작
DB를 통해 저장된 피해자의 이메일을 확인한 뒤 최근 메일 순으로 500개의 이메일에 대해서 악성 iframe 삽입을 시도한다. 삽입된 iframe은 이메일을 열 때마다 Stage 3를 재실행하게 된다. 이로 인해 500개의 이메일을 재감염 시킨다.

<그림 22> 사용자 이메일에 악성 iframe 삽입

<그림 23> 디코딩된 iframe 코드
!share_folders 명령은 Exchange 메일함의 전체 폴더 권한을 조작하여 외부에서 접근할 수 있게 권한을 변경한다. !gather_info에서 확보한 OWA 세션을 이용하여 메일 폴더를 조회한다.

<그림 24> 탈취한 세션을 이용하여 사용자 메일함 권한 확인
메일함 폴더 권한 중 Default인 권한을 확인하여 Owner 권한으로 변경한다. Owner 권한으로 변경함으로써 어떤 계정이든 인증에 성공하기만 하면 해당 메일함의 소유자 권한으로 접근이 가능해 진다.

<그림 25> 메일함의 Default 권한을 Owner 권한으로 변경
OWAReaper는 자기삭제와 지속성을 동시에 구현하는 구조로 단순한 정보 탈취형 악성코드와 구별된다. 원본 감염 이메일을 자동 삭제해 최초 침투 경로의 흔적을 지우면서, 동시에 오염된 IndexedDB 캐시 수백 개를 새로운 재실행 트리거로 남겨두는 구조는 포렌식 분석과 이메일 격리 대응을 동시에 무력화한다. 지속적으로 실행되는 IndexedDB 오염 모듈이 새로 수신된 이메일에도 지속적으로 트리거를 심기 때문에, 불완전한 제거 시도는 즉시 무효화된다.
네트워크 탐지 측면에서 이 악성코드는 Jetpack·Weserv·Slack CDN 등 정상 사용되는 서비스를 C2 릴레이로 일관되게 활용하며, GitHub API 트래픽도 일반 사용과 형태상 구별되지 않는다. 이러한 구조는 네트워크 기반 탐지의 실효성을 크게 낮추므로, 호스트 기반 탐지가 상대적으로 더 유효한 접근법이 된다.
대응은 탐지-격리-복구의 세 축으로 진행해야 한다. 우선 OWA를 사용하는 모든 엔드포인트의 브라우저 로컬 저장소에서 PageDataPayload.OwaUserDefaultSettings 키의 악성 값 존재 여부를 점검하고 삭제해야 한다. Exchange 관리 도구로 전체 메일함 폴더 중 Default 권한이 Owner로 설정된 폴더를 조회하고 기본값으로 복구해야 하며, OWA 오프라인 동기화를 조직 정책으로 비활성화하면 IndexedDB 오염 경로가 차단된다. 자격증명·토큰 노출이 확인된 계정에 대해서는 비밀번호 강제 초기화와 Exchange OAuth 토큰 전체 무효화를 함께 수행해야 하며, C2 도메인 차단 및 관련 CDN 경유 이상 트래픽 패턴의 네트워크 탐지 룰 등록이 권고된다.
SHA256
Language Preservation Brief.html
6897b649f29e54d8910459963bbf94ed5c7a4fe66a56bc5962540b226b8e48c4
C2
asecdns[.]com
acocdn[.]com
dnsrecursive[.]eu
tdndns[.]com
#OWAReaper
#CVE-2026-42897