CVE-2015-2545 — złośliwy EPS w dokumentach Microsoft Office - Security Bez Tabu

CVE-2015-2545 — złośliwy EPS w dokumentach Microsoft Office

TL;DR

CVE‑2015‑2545 to krytyczna podatność RCE w parserze EPS pakietu Microsoft Office, umożliwiająca wykonanie kodu po otwarciu dokumentu z osadzonym plikiem EPS. Była szeroko wykorzystywana w kampaniach APT (m.in. PLATINUM, APT16). Dziś kluczowe jest: pełne łatanie (MS15‑099), blokada EPS w Office (domyślnie wyłączone od 2017 r.), filtrowanie w bramkach pocztowych oraz detekcje „Office → nietypowe dziecko” i (na starszych hostach) ładowanie EPSIMP32.FLT.


Krótka definicja techniczna

CVE‑2015‑2545 to błąd w obsłudze grafiki Encapsulated PostScript (EPS) w Office, który po otwarciu dokumentu z wbudowanym EPS pozwala napastnikowi doprowadzić do korupcji pamięci i zdalnie wykonać kod w kontekście użytkownika. Exploit wykorzystuje kod PostScript, a historycznie potrafił omijać ASLR/DEP.


Gdzie występuje / przykłady platform

  • Windows / Office: Office 2007 SP3, 2010 SP2, 2013 SP1, 2013 RT SP1 (późniejsze Office miały zablokowaną obsługę EPS).
  • M365 (Exchange/Defender): wektor pocztowy (załączniki DOC/DOCX/RTF z EPS); telemetria EmailEvents, EmailAttachmentInfo, DeviceProcessEvents.
  • Pozostałe platformy (AD, AWS, Azure, GCP, K8s, ESXi, M365): wpływ pośredni (np. phishing do skrzynek M365; hosty Windows). CloudTrail/K8s/ESXi zazwyczaj nie dotyczy samej eksploatacji, ale można korelować pobrania plików z S3 (jeśli dokument był hostowany w chmurze).

Szczegółowy opis techniki (jak działa, cele, dlaczego skuteczna)

Atakujący wysyła do ofiary dokument Office (DOC/DOCX/RTF) z osadzonym EPS. Po otwarciu dokumentu silnik importu grafiki (EPSIMP32.FLT) parsuje treść EPS, co przy specjalnie spreparowanych danych prowadzi do RCE. W praktyce łańcuch wyglądał następująco:

  1. Initial Access: spearphishing z załącznikiem zawierającym EPS (T1566.001).
  2. Execution: użytkownik otwiera plik (T1204.002), Office ładuje filtr EPS i wyzwala błąd → shellcode.
  3. Post‑exploitation: uruchomienie procesu lolbin (np. rundll32.exe, regsvr32.exe, mshta.exe) lub droppera.

Eksploatacja była popularna, bo łączyła socjotechnikę z błędem klienta (Office), a ochrona oparta wyłącznie na AV bywała nieskuteczna. Microsoft wydał poprawki w MS15‑099 (09.2015; 11.2015 re-release), a w 04.2017 domyślnie wyłączył EPS w Office (trwale od 05.2018 w M365/Office 2019+).


Artefakty i logi (co zbierać)

ŹródłoPole / EIDCo szukaćUwagi
Windows Security4688 (Process Creation)WINWORD.EXE / EXCEL.EXE / POWERPNT.EXE / OUTLOOK.EXE → dziecko: cmd.exe, powershell.exe, wscript.exe, cscript.exe, mshta.exe, regsvr32.exe, rundll32.exe, schtasks.exe, certutil.exeSilny wskaźnik post‑exploitation
Sysmon1 (Process Create)Jak wyżej + CommandLine z nietypowymi parametramiKorelować z 7 i 11
Sysmon7 (ImageLoad)ImageLoaded kończy się na \EPSIMP32.FLT ładowane przez OfficeMa sens wyłącznie na starych, niezałatanych hostach/wersjach Office (EPS włączony)
Sysmon11 (FileCreate) / 15 (FileStreamCreated)Zapisy Office do %TEMP% i strumieni z URL/UNC; wkrótce spawn lolbinDobrze korelować w oknie 0–5 min
M365 DefenderDeviceProcessEventsInitiatingProcessFileName ∈ {WINWORD, EXCEL, POWERPNT, OUTLOOK} → child z listy lolbinówT1204.002 / T1203
M365 DefenderEmailEvents, EmailAttachmentInfoZałączniki .doc/.docx/.rtf z nietypowych nadawców, tematy kampanii APTWspiera triage Initial Access
Exchange OnlineAudit/SearchCompliance Search po Attachments:*.epsPo stronie poczty
CloudTrail (S3 Data Events)GetObjectPobrania dokumentów z rozszerzeniami .doc/.docx/.rtf/.eps z nieznanych lokalizacji/IPOpcjonalne, jeśli hosting w S3
K8s audit / ESXi[brak danych / zwykle nie dotyczy]Eksploatacja dotyczy klienta Office

Źródła podatności i wersji: NVD/MS15‑099; KEV potwierdza eksploatację w realu.


Detekcja (praktyczne reguły)

Sigma (dwie gotowe reguły)

A) Office → nietypowe procesy potomne (T1204.002 / T1203 / T1566.001)

title: Office Spawns Unusual Child Process (EPS/CVE-2015-2545 tradecraft)
id: 1b3ef8a6-5d5e-4f79-8c42-3f9f5f0c9b15
status: stable
description: Detects Office applications spawning suspicious system utilities often used post-exploitation.
references:
  - https://attack.mitre.org/techniques/T1204/002/
  - https://attack.mitre.org/techniques/T1203/
  - https://attack.mitre.org/techniques/T1566/001/
tags:
  - attack.T1204.002
  - attack.T1203
  - attack.T1566.001
logsource:
  category: process_creation
  product: windows
detection:
  parent_office:
    ParentImage|endswith:
      - '\WINWORD.EXE'
      - '\EXCEL.EXE'
      - '\POWERPNT.EXE'
      - '\OUTLOOK.EXE'
  suspicious_child:
    Image|endswith:
      - '\cmd.exe'
      - '\powershell.exe'
      - '\wscript.exe'
      - '\cscript.exe'
      - '\mshta.exe'
      - '\regsvr32.exe'
      - '\rundll32.exe'
      - '\schtasks.exe'
      - '\certutil.exe'
  condition: parent_office and suspicious_child
falsepositives:
  - Legalne dodatki Office, automatyzacja skryptowa w działach DTP
level: high
fields:
  - ParentImage
  - Image
  - CommandLine
  - ParentCommandLine
  - User

B) (Środowiska legacy) Ładowanie filtra EPS przez Office

title: Office Loads EPS Filter (EPSIMP32.FLT) - Legacy Host
id: 0e7a0c6e-c9f0-4c8a-b0a3-7c3a1d0a9c01
status: experimental
description: Detects image load of EPSIMP32.FLT by Office processes (should be disabled on modern Office).
tags: [ attack.T1203, attack.T1204.002 ]
logsource:
  category: image_load
  product: windows
detection:
  selection:
    ImageLoaded|endswith: '\EPSIMP32.FLT'
    Image|endswith:
      - '\WINWORD.EXE'
      - '\EXCEL.EXE'
      - '\POWERPNT.EXE'
  condition: selection
falsepositives:
  - Stare, niezałatane instalacje Office z włączonym EPS
level: medium

Kontekst ATT&CK i status technik: T1203, T1204.002 oraz T1566.001 w ATT&CK v18.0.


Splunk (SPL)

Office → nietypowe dziecko

index=endpoint sourcetype IN ("Sysmon:ProcessCreate","WinEventLog:Security")
| eval Parent=coalesce(ParentImage,ParentProcessName)
| eval Image=coalesce(Image,NewProcessName)
| where like(lower(Parent), "%\\winword.exe")
   OR like(lower(Parent), "%\\excel.exe")
   OR like(lower(Parent), "%\\powerpnt.exe")
   OR like(lower(Parent), "%\\outlook.exe")
| where like(lower(Image), "%\\cmd.exe")
   OR like(lower(Image), "%\\powershell.exe")
   OR like(lower(Image), "%\\wscript.exe")
   OR like(lower(Image), "%\\cscript.exe")
   OR like(lower(Image), "%\\mshta.exe")
   OR like(lower(Image), "%\\regsvr32.exe")
   OR like(lower(Image), "%\\rundll32.exe")
   OR like(lower(Image), "%\\schtasks.exe")
   OR like(lower(Image), "%\\certutil.exe")
| stats values(CommandLine) as cmd by _time host user Parent Image
| sort - _time

Ładowanie EPSIMP32.FLT (Sysmon EID 7)

index=endpoint sourcetype="Sysmon:ImageLoad"
ImageLoaded="*\\EPSIMP32.FLT" (ProcessImage="*\\WINWORD.EXE" OR ProcessImage="*\\EXCEL.EXE" OR ProcessImage="*\\POWERPNT.EXE")
| table _time host ProcessImage ImageLoaded Signed Status

KQL (Microsoft 365 Defender – Advanced Hunting)

// Office -> suspicious child
DeviceProcessEvents
| where InitiatingProcessFileName in~ ("WINWORD.EXE","EXCEL.EXE","POWERPNT.EXE","OUTLOOK.EXE")
| where FileName in~ ("cmd.exe","powershell.exe","wscript.exe","cscript.exe","mshta.exe","regsvr32.exe","rundll32.exe","schtasks.exe","certutil.exe")
| project Timestamp, DeviceName, InitiatingProcessFileName, FileName, FolderPath, ProcessCommandLine, InitiatingProcessCommandLine, AccountName
| order by Timestamp desc
// (Legacy) EPS filter load by Office
DeviceImageLoadEvents
| where InitiatingProcessFileName in~ ("WINWORD.EXE","EXCEL.EXE","POWERPNT.EXE")
| where FileName endswith "EPSIMP32.FLT"
| project Timestamp, DeviceName, InitiatingProcessFileName, FileName, FolderPath, SHA256

CloudTrail query (CloudWatch Logs Insights — gdy dokument hostowany w S3)

fields @timestamp, eventName, requestParameters.bucketName as bucket, requestParameters.key as key, sourceIPAddress, userAgent
| filter eventSource = "s3.amazonaws.com"
| filter eventName in ["GetObject","GetObjectVersion"]
| filter key like /(?i)\.(doc|docx|rtf|ppt|pptx|pps|eps)$/ 
| sort @timestamp desc

Pamiętaj: aby widzieć Data Events S3, muszą być włączone dla bukietu.


Elastic / EQL

process where
  process.parent.name in ("WINWORD.EXE","EXCEL.EXE","POWERPNT.EXE","OUTLOOK.EXE") and
  process.name in ("cmd.exe","powershell.exe","wscript.exe","cscript.exe","mshta.exe","regsvr32.exe","rundll32.exe","schtasks.exe","certutil.exe")

(opcjonalnie — sekwencja z ładowaniem filtra EPS na hostach legacy)

sequence by host.id with maxspan=5m
  [process where process.name in ("WINWORD.EXE","EXCEL.EXE","POWERPNT.EXE")]
  [image_load where file.name == "EPSIMP32.FLT"]
  [process where process.name in ("cmd.exe","powershell.exe","mshta.exe","rundll32.exe","regsvr32.exe")]

Heurystyki / korelacje

  • Korelacja czasowa 0–5 min: zapis plików Office w %TEMP% → uruchomienie lolbin.
  • Office + ImageLoad EPSIMP32.FLT (na starszych hostach) → wysoka waga.
  • EmailEvents ↔ DeviceProcessEvents: załącznik → otwarcie → spawn lolbin.
  • Nietypowe strefy czasowe/IP dla GetObject z S3 lub pobrania dokumentu.
  • Blok EPS w orgu: każdy ImageLoad EPSIMP32.FLT = anomalia konfiguracyjna.

False positives / tuning

  • Legalne dodatki Office (DTP, automatyzacje) mogą spawnować procesy — zastosuj listy wyjątków dla znanych ścieżek/podpisów.
  • W środowiskach, gdzie EPS jest per-policy włączony (np. starsze stacje offline), potwierdzaj kontekst (źródło pliku, nadawca, reputacja).
  • Zmniejsz FP przez kontekst: brak interakcji użytkownika, nietypowe CommandLine, rzadkie child process, procesy sieciowe zaraz po otwarciu dokumentu.

Playbook reagowania (SOC)

  1. Triage alertu: potwierdź łańcuch Office → child → sieć/pliki oraz ewentualny EPSIMP32.FLT.
  2. Izolacja hosta (MDE): Live Response / Isolate device.
  3. Hunting w M365:
    • KQL (sekcja 7) → wylistuj inne hosty/użytkowników z tym samym nadawcą/załącznikiem.
    • EmailEvents / EmailAttachmentInfo: koreluj temat, nadawcę, hash załącznika.
  4. Containment:
    • Quarantine pliku i StopAndQuarantineFile (MDE).
    • W Exchange Online (Compliance): wyszukaj i usuń wiadomości z EPS: New-ComplianceSearch -Name "EPS-bulk" -ExchangeLocation All -ContentMatchQuery 'attachments:*.eps' Start-ComplianceSearch -Identity "EPS-bulk" New-ComplianceSearchAction -SearchName "EPS-bulk" -Purge -PurgeType SoftDelete
  5. Eradication:
    • Upewnij się, że hosty mają zainstalowane poprawki MS15‑099 lub nowsze; sprawdź, czy EPS jest wyłączony (w nowoczesnych Office jest domyślnie).
  6. Recovery: sprawdź trwałość (Run/Services/Tasks); rotacja haseł kont interaktywnych, jeśli były użyte.
  7. Lessons learned: wymuś blokadę załączników EPS na bramkach, włącz szkolenie użytkowników i pre‑filter DMARC/SPF/DKIM.

Przykłady z kampanii / case studies

  • PLATINUM (TwoForOne): pierwsze wykryte użycie CVE‑2015‑2545 (sierpień 2015); później porzucone po patchach.
  • APT16 (Tajwan, 2015): wariant exploita EPS, łańcuch spearphishing + ELMER.
  • EvilPost (Japonia, 2015), SPIVY oraz kampania Danti (2016): konsekwentne używanie EPS w DOCX; omówienia telemetryczne i szczegóły shellcode.
  • FireEye/Mandiant “The EPS Awakens”: opis wykorzystania PostScript do wywołania korupcji pamięci oraz 0‑day w momencie ujawnienia.

Lab (bezpieczne testy) — przykładowe komendy

Tylko w izolowanym środowisku testowym. Celem jest walidacja detekcji, nie eksploatacja luki.

  • Atomic Red Team — T1566.001 (Spearphishing Attachment): ćwicz pipeline pocztowy bez złośliwości (pobranie przykładowego dokumentu/artefaktu), aby sprawdzić korelacje EmailEvents → DeviceProcessEvents.
  • Atomic Red Team — T1204.002 (User Execution: Malicious File): uruchom testy, które symulują uruchomienie nietypowych child process przez aplikacje użytkownika (bez exploitów).
    • Instalacja narzędzi (lab): patrz Invoke‑AtomicRedTeam i dokumentacja uruchamiania lokalnego. IEX (IWR 'https://raw.githubusercontent.com/redcanaryco/invoke-atomicredteam/master/install-atomicredteam.ps1'); Install-AtomicRedTeam -getAtomics # Przykład: uruchom scenariusze T1204.002 bez złośliwych payloadów Invoke-AtomicTest T1204.002 -ShowDetailsBrief Po teście wykonaj cleanup zgodnie z instrukcjami atomika.

Mapowania (Mitigations, powiązane techniki)

Mitigations (ATT&CK):

  • M1051 — Update Software: bezwzględne łatanie Office (MS15‑099 i nowsze).
  • M1054 — Software Configuration: globalna blokada EPS (wspierana przez Microsoft; domyślnie wyłączone od 2017 r., zniesione obejście rejestrem w 2018 r.).
  • M1037 — Filter Network Traffic: blokady na bramkach pocztowych/http, sandboxing załączników.

Powiązane techniki ATT&CK:

  • T1566.001 (wektor wejścia — spearphishing attachment),
  • T1204.002 (wykonanie przez użytkownika),
  • T1203 (exploitation klienta).

Źródła / dalsza literatura

  • NVD — CVE‑2015‑2545 (opis, CVSS v3.1 7.8, KEV) (NVD)
  • Microsoft MS15‑099 — biuletyn bezpieczeństwa (patch, wektor przez EPS) (Microsoft Learn)
  • Microsoft: wsparcie dla EPS wyłączone w Office (od 2017‑04‑11; trwałe wyłączenie obejścia rejestrem od 2018‑05) (Microsoft Support)
  • Kaspersky Securelist (2016): „CVE‑2015‑2545: overview of current threats” — kampanie APT, omijanie ASLR/DEP, EPSIMP32.FLT (securelist.com)
  • Mandiant/FireEye: „The EPS Awakens” — analiza zero‑day (CVE‑2015‑2545) (Google Cloud)
  • CISA — Known Exploited Vulnerabilities Catalog (wpis CVE‑2015‑2545, dodany 2022‑03‑03) (CISA)
  • MITRE ATT&CK: T1203, T1204.002, T1566.001; wersja v18.0 (2025‑10‑28) (MITRE ATT&CK)

Checklisty dla SOC / CISO

SOC (operacyjne):

  • Włącz reguły: Office → child process (cmd/powershell/wscript/mshta/…); EPSIMP32.FLT (legacy).
  • Koreluj EmailEvents ↔ DeviceProcessEvents (okno 0–5 min).
  • Blokuj .eps na bramkach pocztowych i w DLP.
  • Hunt na stacjach z przestarzałym Office; potwierdź brak możliwości wstawiania EPS.
  • W razie incydentu: izolacja hosta, purge wiadomości, unieważnienie tokenów, IOC sweep.

CISO (strategiczne):

  • Wymuszone aktualizacje Office (M1051) oraz polityka „no‑EPS”.
  • Regularne testy kontrolne (Atomic Red Team) dla T1566.001/T1204.002.
  • KPI: MTTR od alertu Office→child, odsetek stacji z zablokowanym EPS, E2E e-mail sandbox rate.
  • Wdrożona polityka filtrowania treści i reputacji nadawcy (DMARC/SPF/DKIM).

Podsumowanie ryzyka: mimo wieku, CVE‑2015‑2545 pozostaje istotny kontekstowo (retro/legacy, archiwa poczty). Najlepszą obroną są: aktualizacje, blok EPS, detekcje łańcucha Office→lolbin i silne kontrole pocztowe.