1. 취약점 설명
Windows에 여전히 남아있는 레거시 IE 엔진(MSHTML)의 URL 검증 미흡으로, 악성 LNK 파일 하나로 브라우저 샌드박스를 탈출해 임의 코드를 실행할 수 있는 취약점. 러시아 국가 연계 해킹 그룹 APT28이 2026년 2월 Microsoft Patch Tuesday 패치 전부터 실제 공격에 활용했으며, CISA KEV에 등재됐다.
2. 취약점 개요
| 항목 | 내용 |
| CVE 번호 | CVE-2026-21513 |
| CVSS | 8.8 (High) |
| 발표일 | 2026년 2월 10일 (February Patch Tuesday) |
| CWE | CWE-693 (Protection Mechanism Failure) |
| 영향 제품 | 모든 Windows 버전 (MSHTML 내장) |
| 취약 조건 | 사용자가 악성 HTML 파일 또는 LNK 파일을 열었을 때 |
| 공격자 | APT28 (러시아 국가 연계 위협 그룹) |
MSHTML이란? Windows에 내장된 레거시 웹 렌더링 엔진. Internet Explorer의 핵심 엔진(Trident)으로, IE가 공식 종료된 이후에도 하위 호환성, Office 문서 렌더링, ActiveX 지원 목적으로 Windows 안에 여전히 남아있다. 이 때문에 IE를 사용하지 않아도 MSHTML이 포함된 어떤 컴포넌트든 취약점 트리거가 가능하다.
APT28이란? Fancy Bear라고도 불리는 러시아 군 정보기관(GRU) 연계 위협 그룹. 2016년 미국 대선 해킹, 우크라이나 침해 작전 등 국가 수준 사이버 작전을 수행하는 것으로 알려져 있다. 이번 취약점은 CERT-UA(우크라이나 침해대응팀)도 관련 캠페인을 포착했다.
3. 익스플로잇 방식
취약점의 근본 원인
취약점은 ieframe.dll 내 하이퍼링크 네비게이션을 처리하는 _AttemptShellExecuteForHlinkNavigate 함수에 존재한다. 대상 URL에 대한 검증이 불충분해 공격자가 제어하는 입력값이 ShellExecuteExW를 호출하는 코드 경로에 도달할 수 있다.
취약한 코드 흐름:
하이퍼링크 클릭
↓
ieframe.dll의 _AttemptShellExecuteForHlinkNavigate 실행
↓
URL 검증 없이 그대로 ShellExecuteExW 호출
↓
브라우저 샌드박스 밖에서 로컬/원격 파일 실행
패치 후:
ShellExecuteExW 호출 전
file://, http://, https:// 프로토콜 검증 추가
→ 브라우저 컨텍스트 안에서만 실행되도록 강제
APT28 실제 공격 흐름
<cite index="14-1">Akamai 연구팀이 공개한 분석에 따르면, 악성 샘플(document.doc.LnK.download)은 2026년 1월 30일 VirusTotal에 처음 제출됐으며 APT28 인프라와 연결된 것으로 확인됐다.</cite>
1. APT28이 악성 LNK 파일 제작
→ LNK 표준 구조 바로 뒤에 HTML 파일을 임베드
2. 이메일 첨부 또는 링크로 피해자에게 전달 (스피어피싱)
→ MITRE T1566.001 (Spearphishing Attachment)
3. 피해자가 LNK 파일 클릭
→ MITRE T1204.001 (User Execution: Malicious File)
4. LNK가 APT28 인프라(wellnesscaremed[.]com)와 통신 시작
5. 중첩 iframe과 DOM 조작으로 신뢰 경계 우회
→ Mark of the Web (MotW) 우회
→ Internet Explorer Enhanced Security Configuration (IE ESC) 우회
6. ShellExecuteExW 호출 → 브라우저 샌드박스 탈출
→ 다단계 페이로드 실행 (PrismEx 악성코드)
Mark of the Web (MotW)이란? 인터넷에서 다운로드된 파일에 Windows가 자동으로 붙이는 태그. 이 태그가 있으면 실행 시 경고창이 뜨고 제한된 보안 컨텍스트에서 실행된다. APT28은 중첩 iframe과 DOM 조작으로 이 태그의 효과를 무력화했다.
중요한 포인트: 악성 LNK 파일을 이용한 공격이 관찰됐지만, MSHTML을 임베드하는 어떤 컴포넌트든 취약점 트리거가 가능하다. LNK 피싱 외에도 Office 문서, 이메일 HTML 렌더링 등 다양한 전달 방식이 가능하다.
4. 어디서 흔적이 남는가 (로그 소스 매핑)
| 로그 소스 | 탐지 가능한 흔적 |
| 이메일 게이트웨이 로그 | .lnk 파일 첨부 이메일, 악성 도메인 링크 포함 메일 |
| 프록시/웹 필터 로그 | wellnesscaremed[.]com 등 APT28 C2 도메인 통신 |
| EDR / Sysmon | ShellExecuteExW 호출 후 비정상 프로세스 생성 |
| 윈도우 이벤트 로그 | LNK 파일 실행, 비정상 자식 프로세스 생성 |
| 네트워크 로그 | 비정상 아웃바운드 연결, C2 통신 패턴 |
| SIEM (Splunk) | LNK 파일 실행 + 외부 연결 + 의심 프로세스 연계 탐지 |
⚠️ 탐지의 핵심 어려움 공격자가 MotW를 우회하기 때문에 파일 다운로드 기반 탐지가 어렵다. MSHTML을 임베드하는 모든 컴포넌트가 벡터가 될 수 있어 단일 탐지 포인트가 없다. 네트워크 레벨에서 C2 도메인 통신을 탐지하거나 프로세스 생성 행위 패턴을 모니터링하는 것이 현실적인 접근이다.
5. SPL 탐지 쿼리
기본형: LNK 파일 실행 후 외부 연결 탐지
index=wineventlog OR index=sysmon
| where EventCode IN (4688, 1)
| eval is_lnk_spawn=if(match(parent_process, "(explorer\.exe|outlook\.exe|winword\.exe)") AND match(process_name, "(cmd\.exe|powershell|wscript|mshta|rundll32)"), 1, 0)
| where is_lnk_spawn=1
| stats count as spawn_count by src_host, parent_process, process_name, _time span=5m
| join type=left src_host
[search index=firewall_logs OR index=proxy_logs
| where direction="outbound"
| eval suspicious_domain=if(match(dest_domain, "(wellnesscaremed|\.ru$|\.xyz$)"), 1, 0)
| where suspicious_domain=1
| stats count as c2_count by src_host]
| where isnotnull(c2_count)
| table src_host, parent_process, process_name, spawn_count, c2_count
쿼리 설명:
- 이메일 클라이언트(outlook.exe), 탐색기(explorer.exe), Word(winword.exe)에서 cmd, powershell 같은 의심 프로세스가 생성되는 패턴을 탐지한다
- LNK 파일 실행 후 주로 이 경로로 페이로드가 실행되기 때문
- join으로 의심 프로세스 생성 + C2 도메인 통신을 연계해 공격 전후 흐름을 한번에 포착
개선형: MSHTML 기반 비정상 ShellExecute 패턴 탐지
index=sysmon
| where EventCode=1
| eval suspicious=if(
match(parent_process, "(iexplore|mshtml|ieframe|mshta|wscript)") AND
match(process_name, "(cmd\.exe|powershell|certutil|bitsadmin|curl|wget)"), 1, 0)
| where suspicious=1
| stats count as exec_count by src_host, parent_process, process_name, command_line
| where exec_count >= 1
| sort -exec_count
| table src_host, parent_process, process_name, command_line, exec_count
쿼리 설명:
- MSHTML 관련 프로세스(iexplore, mshtml, ieframe, mshta 등)가 부모 프로세스인 상태에서 cmd, powershell 같은 의심 프로세스가 자식으로 실행되면 ShellExecuteExW 악용 패턴으로 볼 수 있다
- command_line 필드를 포함해 실제 실행된 명령어까지 확인 가능
- Sysmon 이벤트 코드 1(프로세스 생성)이 있어야 탐지 가능
Sysmon이 없는 환경에서는? EventCode 4688(윈도우 기본 프로세스 생성 로그)로 대체 가능하지만, command_line 필드는 감사 정책에서 별도로 활성화해야 기록된다.
⚠️ 인덱스명 안내: wineventlog, sysmon, firewall_logs, proxy_logs는 예시다. 실제 환경의 인덱스명으로 변경 후 사용할 것.
IOC 기반 C2 도메인 탐지
index=proxy_logs OR index=dns_logs OR index=firewall_logs
| search dest_domain="wellnesscaremed.com" OR dest_ip="악성IP"
| stats count as hit_count by src_ip, src_host, dest_domain, dest_ip
| sort -hit_count
| table src_ip, src_host, dest_domain, dest_ip, hit_count
APT28 관련 IOC:
도메인: wellnesscaremed[.]com (APT28 C2)
파일명: document.doc.LnK.download
파일 해시: aefd15e3c395edd16ede7685c6e97ca0350a702ee7c8585274b457166e86b1fa
⚠️ IOC는 APT28이 인프라를 교체하면 무효화된다. C2 도메인 기반 탐지는 보조 수단으로 활용하고, 행위 기반 탐지(쿼리 1, 2)를 병행하는 것이 더 안정적이다.
6. 오탐지 줄이는 팁
- 정상 자동화 도구: 일부 IT 관리 도구가 outlook이나 explorer에서 powershell을 실행할 수 있다. 관리 서버 IP나 알려진 자동화 프로세스는 화이트리스트로 제외
- 개발 환경: mshta, wscript는 정상 개발 환경에서도 쓰인다. 개발 PC IP를 별도로 처리하거나 command_line 내용으로 추가 필터링
- C2 도메인: 탐지한 도메인이 DGA(Domain Generation Algorithm) 기반이면 패턴 매칭보다 엔트로피 분석이 더 효과적
7. 임시 대응 / 패치 정보
패치 적용: 2026년 2월 Microsoft Patch Tuesday 누적 업데이트 즉시 적용. Windows Update 또는 Microsoft Security Update Guide 참고.
즉시 적용 가능한 완화 조치:
- 이메일 게이트웨이에서 .lnk 첨부 차단
- 업무상 LNK 파일을 이메일로 주고받을 이유가 거의 없음
- 이메일 필터에서 .lnk 확장자 첨부 차단 권고
- MSHTML 관련 레거시 기능 비활성화
- Internet Explorer 모드 비활성화 (Microsoft Edge 설정)
- ActiveX 컨트롤 차단
- 사용자 교육
- 출처 불명 LNK 파일, HTML 파일 클릭 금지
- 이메일 링크로 전달된 파일 실행 시 주의
⚠️ 패치 적용이 완전한 해결책이지만, MSHTML을 임베드하는 다른 컴포넌트를 통한 변형 공격은 여전히 가능할 수 있다. 패치 후에도 행위 기반 모니터링을 유지하는 것이 중요하다.
8. 마무리 / 한계점
이 SPL 쿼리의 한계:
- Sysmon이 설치되지 않은 환경에서는 프로세스 생성 기반 탐지 정확도가 낮아짐
- APT28이 LNK 대신 다른 MSHTML 임베드 방식을 사용하면 parent_process 기반 필터가 우회될 수 있음
- C2 도메인 기반 탐지는 공격자가 인프라를 교체하는 순간 무효화됨
이 취약점이 특히 흥미로운 이유는 "이미 공식 종료된 Internet Explorer의 잔재가 2026년에도 국가 수준 APT 공격의 무기가 됐다" 는 점이다. 레거시 컴포넌트는 눈에 안 보인다고 사라진 게 아니다. Windows 안에 조용히 남아있다가 이런 식으로 터진다. 이번 취약점은 레거시 코드 감사의 중요성을 다시 한번 상기시켜준다.
더 나은 탐지 방법이나 실제 운영 환경에서의 개선점이 있다면 댓글로 공유해주세요.
참고 자료: