
Co znajdziesz w tym artykule?
- 1 TL;DR
- 2 Krótka definicja techniczna
- 3 Gdzie występuje / przykłady platform
- 4 Szczegółowy opis techniki (jak działa, cele, dlaczego skuteczna)
- 5 6) Artefakty i logi (tabela)
- 6 Detekcja (praktyczne reguły)
- 7 Heurystyki / korelacje
- 8 False positives / tuning
- 9 Playbook reagowania (IR)
- 10 Przykłady z kampanii / case studies
- 11 Lab (bezpieczne testy)
- 12 Mapowania (Mitigations, powiązane techniki)
- 13 Źródła / dalsza literatura
- 14 Checklisty dla SOC / CISO
TL;DR
- Co: Pre‑auth RCE w FortiOS/FortiProxy SSL‑VPN (FortiGate) — CVE‑2023‑27997 („XORtigate”).
- Jak: nadpisanie bufora (heap) poprzez parametr
encw endpointzie/remote/hostcheck_validate, co umożliwia wykonanie kodu bez logowania. - Ryzyko: krytyczne, aktywnie wykorzystywane, w KEV (CISA).
- Naprawa: aktualizacja co najmniej do FortiOS 6.0.17 / 6.2.15 / 6.4.13 / 7.0.12 / 7.2.5 oraz odpowiednie wersje FortiProxy; w razie potrzeby tymczasowo wyłączyć SSL‑VPN.
- ATT&CK: T1190 (Initial Access). Wskazane korelacje z T1133 (External Remote Services) oraz T1210 (Exploitation of Remote Services) dla ruchu/powykorzystaniowych zachowań.
Krótka definicja techniczna
CVE‑2023‑27997 to błąd heap‑based buffer overflow (CWE‑122/CWE‑787) w komponencie SSL‑VPN FortiOS/FortiProxy umożliwiający zdalne wykonanie kodu na urządzeniu bez uwierzytelnienia poprzez „specjalnie spreparowane” żądania HTTP/HTTPS do publicznego interfejsu VPN.
Gdzie występuje / przykłady platform
- Network Devices (FortiGate/FortiProxy) — urządzenia brzegowe z włączonym SSL‑VPN. (Matryca ATT&CK obejmuje „Network Devices”).
- Chmura/edge: gdy FortiGate stoi za ALB/WAF (AWS/Azure/GCP), ślady ataków w logach ALB/WAF/Load Balancer. [Mimo że sama podatność dotyczy urządzenia, telemetria może być w logach chmurowych.]
- Windows/AD/Azure/M365/K8s/ESXi: pośrednio — jako dalsze cele po początkowym włamaniu (lateral movement), nie jako wektor podatności.
Szczegółowy opis techniki (jak działa, cele, dlaczego skuteczna)
Atakujący składa pre‑auth żądania HTTP(S) do portalu SSL‑VPN FortiGate. Kluczową rolę odgrywa endpoint /remote/hostcheck_validate i parametr enc, którego długość i dekodowanie są błędnie weryfikowane. Błąd pozwala na nadpisanie pamięci sterty i w konsekwencji wykonanie kodu. Badanie LEXFO opisuje też zależności od /remote/info (do pobrania „salt”) oraz charakter „XOR‑overflow” wykorzystywany do manipulacji pamięcią. W praktyce umożliwia to początkowy dostęp (Initial Access) i często ominięcie MFA, ponieważ atak następuje przed uwierzytelnieniem.
Fortinet potwierdził krytyczność problemu (FG‑IR‑23‑097), publikując łatki i zalecając niezwłoczną aktualizację; CISA dodała CVE do KEV (Known Exploited Vulnerabilities).
6) Artefakty i logi (tabela)
| Źródło/warstwa | Kluczowe pola / wzorce | Przykładowe wartości / IOC | Uwagi |
|---|---|---|---|
| FortiGate system/sslvpn logs | type=event, subtype=vpn/daemon, msg, service=sslvpn, logid, eventtime | Błędy invalid enc data length, restarty/„sslvpnd daemon crash/watchdog timeout” | Crashe/timeouty sslvpnd są sygnałem ostrzegawczym. |
| FortiGate HTTP/HTTPS access | url, http_method, status, user="" (pre‑auth), srcip | Żądania do /remote/hostcheck_validate z parametrem enc=; skoki 4xx/5xx | Najlepiej zbierać jako syslog/CEF do SIEM. |
| FortiGate Event (log IDs) | logid, action, user | Zalew SSL‑VPN login fail (np. ...user-ssl-login-fail...) lub niestandardowe wzorce | Przydatne do korelacji szumu skanowania z exploitami. |
| Crashlog | diag debug crashlog read | Wpisy o sslvpnd, sygnały, restarty | Materiał dowodowy na awarie procesu. |
| ALB/WAF/Reverse Proxy | request_uri, user_agent, status, bytes | /remote/hostcheck_validate, enc=; piki z pojedynczych IP | Gdy urządzenie stoi za LB/WAF. |
| Windows EID | — | [nie dotyczy] | Bezpośrednio brak artefaktów Windows. |
| AWS CloudTrail | — | [nie dotyczy] | CloudTrail nie rejestruje treści HTTP; szukaj w ALB/WAF (CloudWatch Logs). |
| K8s audit | — | [nie dotyczy] | |
| M365 audit | — | [nie dotyczy] |
Detekcja (praktyczne reguły)
Sigma (FortiGate / proxy logs)
title: FortiGate SSL-VPN hostcheck_validate enc Anomaly (CVE-2023-27997)
id: 4d6f70b0-6b8a-4a3a-9be1-enc-hostcheck
status: experimental
description: Wykrywa żądania do /remote/hostcheck_validate z parametrem enc= (pre-auth) – możliwe wykorzystanie CVE-2023-27997.
references:
- https://nvd.nist.gov/vuln/detail/cve-2023-27997
- https://blog.lexfo.fr/xortigate-cve-2023-27997.html
- https://www.cisa.gov/news-events/alerts/2023/06/13/cisa-adds-one-known-exploited-vulnerability-catalog
tags:
- attack.t1190
- cve.2023-27997
logsource:
category: firewall
product: fortinet
detection:
sel_path:
url|contains: "/remote/hostcheck_validate"
sel_param:
url|contains: "enc="
# alternatywne pola spotykane w CEF/LEEF
sel_alt1:
cs-uri-stem|contains: "/remote/hostcheck_validate"
sel_alt2:
cs-uri-query|contains: "enc="
condition: (sel_path and sel_param) or (sel_alt1 and sel_alt2)
fields:
- src_ip
- dst_ip
- url
- http_method
- http_status
falsepositives:
- Starsze klienty FortiClient wykonujące host-check (rzadkie)
level: high
Splunk (SPL)
Wyszukaj podejrzane żądania i skoki błędów:
index=network (sourcetype=fortigate* OR sourcetype=proxy*)
("|/remote/hostcheck_validate" OR cs_uri_stem="/remote/hostcheck_validate")
("enc=" OR cs_uri_query="*enc=*")
| bin _time span=5m
| stats count count(eval(http_status>=400 AND http_status<600)) AS errs
values(http_method) AS methods
values(http_status) AS statuses
by _time, src_ip, dest_ip, uri, user
| where count>=5 OR errs>=3
Crashes sslvpnd (system events):
index=network sourcetype=fortigate:syslog ("sslvpnd" OR "SSL VPN Watchdog" OR "daemon crash")
| stats count latest(msg) AS any_message by _time, host
KQL (Microsoft Sentinel — CommonSecurityLog lub CEF z FortiGate)
let t = 5m;
CommonSecurityLog
| where DeviceVendor =~ "Fortinet"
| where RequestURL has "/remote/hostcheck_validate" and RequestURL has "enc="
| summarize cnt = count(), statuses = make_set(FlexString1) by bin(TimeGenerated, t), SourceIP, DestinationIP, RequestURL
| where cnt >= 5
AWS — CloudWatch Logs Insights (ALB/WAF access logs; nie CloudTrail)
fields @timestamp, @message, httpRequest.clientIp as src
| filter requestURI like /\/remote\/hostcheck_validate/ and @message like /enc=/
| stats count() as hits, countif(elb_status_code like /5\d\d|4\d\d/) as errs by bin(5m), src, requestURI
| filter hits >= 5 or errs >= 3
Elastic (Kibana KQL + EQL)
KQL (HTTP/Proxy index):
url.path : "/remote/hostcheck_validate" and url.query : "*enc=*"
EQL (jeśli parsowane do pól http/url):
sequence by source.ip with maxspan=5m
[ network where url.path == "/remote/hostcheck_validate" and url.query : "*enc=*" ]
[ any where process.name == "sslvpnd" and event.action in ("crash","restart") ]
Heurystyki / korelacje
- Wzorzec żądań: burst żądań do
/remote/hostcheck_validatezenc=z pojedynczego IP + wysoki udział 4xx/5xx → koreluj z restartem/crashemsslvpndw ±5 min. - Pre‑auth charakter: brak
userw logu, brak sesji, nietypowy User‑Agent (skanery/custom). - Post‑exploitation: nagłe utworzenie/zmiana konta admina (np.
fortigate-tech-support) lub odczyt konfiguracji — sygnał znany z incydentów wokół CVE‑2023‑27997. - Trwałość na urządzeniu: modyfikacje w przestrzeni plików SSL‑VPN (np. katalog językowy) i techniki „symlink” opisywane przez Fortinet jako metoda ukrywania artefaktów po wcześniejszych exploitach — warto hunting.
False positives / tuning
- Prawdziwe host‑checki starych klientów FortiClient mogą dotykać
hostcheck_validate, jednak wolumen jest niewielki i statusy HTTP są zazwyczaj 200/302. - Skanery bezpieczeństwa/VAS mogą generować pojedyncze hity.
- Tuning: whitelisty źródeł administracyjnych, progi wolumetryczne (np. ≥5 w 5 min), statusy ≥400, brak
user, nietypowe geolokalizacje/GEO‑ASN.
Playbook reagowania (IR)
- Identyfikacja ekspozycji
- Zbierz listę FortiGate/FortiProxy z włączonym SSL‑VPN i sprawdź wersje (
get system status). - Jeżeli urządzenie podatne i dostępne z Internetu — podnieś priorytet.
- Zbierz listę FortiGate/FortiProxy z włączonym SSL‑VPN i sprawdź wersje (
- Doraźne ograniczenie ryzyka (jeśli patch niedostępny)
- Wyłącz SSL‑VPN do czasu aktualizacji (Fortinet wskazuje to jako obejście).
- Patch & Verify
- Zaktualizuj co najmniej do FortiOS 6.0.17 / 6.2.15 / 6.4.13 / 7.0.12 / 7.2.5; FortiProxy do odpowiednich wersji (≥7.2.4 lub ≥7.0.10).
- Hunting (±30 dni)
- Przeszukaj SIEM pod kątem
/remote/hostcheck_validate+enc=; wysoki wolumen/4xx/5xx. - Sprawdź crashlog/system events (
sslvpndcrash/watchdog). - Zweryfikuj kontrolę administracyjną: nieautoryzowane konta admin (np.
fortigate-tech-support), anomalie w konfiguracji.
- Przeszukaj SIEM pod kątem
- Forensyka na urządzeniu
- Sprawdź katalogi językowe SSL‑VPN pod kątem podejrzanych plików/symlinków (wątek post‑exploitation opisany przez Fortinet).
- Remediacja haseł/kluczy
- Po kompromitacji: rotacja poświadczeń, kluczy VPN, certyfikatów; sprawdź integracje LDAP/Radius.
- Hardening
- Ogranicz ekspozycję panelu/portu VPN do zaufanych adresów; włącz WAF/geo‑IP rate‑limit/DoS‑policy.
- Zgłoszenie i lessons learned
- Odnotuj w rejestrze incydentów; zaktualizuj reguły, dashboardy, runbooki.
Przykłady z kampanii / case studies
- CISA KEV: CVE‑2023‑27997 dodane 13 czerwca 2023 do katalogu KEV — wymóg szybkiej remediacji.
- Fortinet PSIRT (06.2023): ograniczone przypadki wykorzystania „in the wild”; zalecenie natychmiastowego upgrade, brak powiązania z Volt Typhoon w dacie publikacji.
- Raporty branżowe (2024–2025): CVE pojawia się w zestawieniach „routinely exploited”; organy rządowe ostrzegały przed utrzymaną obecnością na FortiOS po patchach (konieczny threat hunting).
Lab (bezpieczne testy)
Tylko w kontrolowanym labie (izolowane FortiGate/FortiProxy). Celem jest detekcja, nie eksploatacja.
- Przygotowanie:
- Urządzenie testowe FortiGate z włączonym SSL‑VPN, wersja podatna (offline, bez Internetu).
- SIEM (np. Splunk/Elastic/Sentinel) z odbiorem syslog/CEF.
- Generowanie normalnego ruchu:
- Z klienta FortiClient zestaw połączenie → powstaną logi
tunnel-up/tunnel-down(do porównania).
- Z klienta FortiClient zestaw połączenie → powstaną logi
- Generowanie podejrzanych wzorców (bez exploitów):
- Wyślij wielokrotne żądania GET do
/remote/hostcheck_validate?enc=AAz różnych IP źródłowych (np. z testowych kontenerów) — celem jest wygenerowanie charakterystycznego wzorca URI i 4xx w logach (nie dostarczać Keystream/PoC). - Zweryfikuj, czy reguły z pkt 7 aktywują alerty, a dashboardy pokazują piki 4xx/5xx.
- Wyślij wielokrotne żądania GET do
- Symulacja awarii procesu:
- (Opcjonalnie) ręcznie zrestartuj usługę SSL‑VPN, aby przetestować korelację z logami „daemon restart/crash” bez wymuszania błędu w pamięci.
- Walidacja:
- Przejrzyj korelacje: burst
/remote/hostcheck_validate+ restartsslvpnd+ brakuser+ 4xx.
- Przejrzyj korelacje: burst
Mapowania (Mitigations, powiązane techniki)
Technika główna: T1190 – Exploit Public‑Facing Application (Initial Access).
Techniki powiązane:
- T1133 – External Remote Services (VPN jako brama zdalna; logika detekcji dostępowej).
- T1210 – Exploitation of Remote Services (ew. późniejsze ruchy boczne).
Mitigations (ATT&CK):
- M1030 — Network Segmentation (DMZ dla usług publicznych).
- M1035 — Limit Access to Resource Over Network (allow‑list do portalu VPN).
- M1042 — Disable or Remove Feature or Program (wyłącz SSL‑VPN, jeśli nieużywany).
- M1050 — Exploit Protection (ochrony przed exploitami, w tym IPS/WAF).
- M1016 — Vulnerability Scanning (ciągła walidacja wersji).
Źródła / dalsza literatura
- NVD: opis, wersje dotknięte, CVSS 9.8. (NVD)
- CISA KEV: dodanie CVE‑2023‑27997 do katalogu (2023‑06‑13). (CISA)
- Fortinet PSIRT (blog, 12.06.2023): kontekst, zalecenia, brak bezpośredniego powiązania z Volt Typhoon w dacie publikacji. (Fortinet)
- FortiGuard CVRF FG‑IR‑23‑097: opis, workaround „disable SSL‑VPN”. (FortiGuard)
- LEXFO (XORtigate): szczegóły techniczne błędu (
/remote/hostcheck_validate,enc). (blog.lexfo.fr) - Rapid7: wersje naprawcze (6.0.17/6.2.15/6.4.13/7.0.12/7.2.5), IOCs (np.
fortigate-tech-support). (Rapid7) - Fortinet (04.10.2025): technika symlink post‑exploitation na FortiOS. (Fortinet)
- Fortinet community: watchdog/crash
sslvpnd— jak rozpoznać w logach. (Fortinet Community)
Checklisty dla SOC / CISO
SOC (operacyjna):
- Alert na
/remote/hostcheck_validate+enc=(pre‑auth) z progami wolumetrycznymi. - Korelacja z
sslvpndcrash/restart i pikami 4xx/5xx. - Hunting kont admina (np.
fortigate-tech-support) i zmian konfiguracji. - Dashboard narażonych wersji (parsing
get system status). - Logi z ALB/WAF, jeśli FortiGate za load balancerem.
CISO (strategiczna):
- Patch policy: SLA dla urządzeń brzegowych (≤7 dni dla CVE krytycznych, w KEV).
- Segmentacja/DMZ dla serwisów publicznych (M1030).
- Dostęp warunkowy do paneli VPN (M1035/M1042) + geofencing.
- Testy kontrolne: cykliczne skany podatności (M1016) i symulacje IR.