CVE-2021-26829 — OpenPLC ScadaBR (stored XSS w system_settings.shtm)

securitybeztabu.pl 13 godzin temu

TL;DR

CVE‑2021‑26829 to stored XSS w ScadaBR pozwalający zapisać złośliwy JavaScript w ustawieniach systemu (system_settings.shtm). W praktyce bywa wykorzystywany do deface’u HMI, manipulacji widokiem oraz wyłączania logów/alertów – CISA dodała go do KEV z dowodami aktywnej eksploatacji. Monitoruj żądania do /ScadaBR/system_settings.shtm z podejrzanymi ładunkami (<script, onerror=, javascript:), alarmuj zmiany konfiguracji/alarms, egzekwuj WAF/IPS i ogranicz ekspozycję HMI.

Krótka definicja techniczna

Stored XSS w ScadaBR polega na zapisaniu złośliwego kodu JS (np. w polu opisu/ustawień), który uruchamia się w przeglądarce operatora przy otwarciu strony. Wektor według NVD: AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N, co oznacza atak z sieci, niski nakład, wymagane niskie uprawnienia i interakcja użytkownika; wpływ dotyczy gł. poufności i integralności.

Gdzie występuje / przykłady platform

  • Windows / Linux: ScadaBR (HMI/SCADA) uruchamiane zwykle na Apache Tomcat (aplikacja Java/JSP).
  • Środowiska OT/ICS: panele HMI, wizualizacja procesu, często błędnie wystawiane do Internetu lub z dostępem zdalnym. (Mapowanie ATT&CK ICS poniżej).
  • Ślady/logi: logi Tomcata (localhost_access_log*.txt, catalina.out) oraz logi WAF/IPS/proxy.

Szczegółowy opis techniki (jak działa, cele, skuteczność)

Atakujący z niskimi uprawnieniami loguje się do ScadaBR (często z domyślnymi danymi) i wprowadza payload JS w polach renderowanych później w interfejsie (np. opis na stronie ustawień systemu). Gdy operator otwiera stronę (system_settings.shtm), przeglądarka wykonuje złośliwy skrypt, co pozwala m.in. na deface, manipulację widokiem, kradzież sesji (jeśli brak HttpOnly), czy uruchamianie akcji w imieniu operatora (CSRF‑like). W prawdziwym incydencie 2025 r. (honeypot OT) operatorzy Forescout obserwowali: deface loginu („Hacked by …”), usuwanie źródeł PLC, zmianę setpointów i wyłączenie logów/alarmów – część działań zrealizowano właśnie przez możliwość uruchomienia skryptu w HMI.

Artefakty i logi (co i gdzie szukać)

ŹródłoCo szukać (przykłady wzorców)Lokalizacja / produktUwagi / mapowanie
Tomcat AccessLogŻądania do */ScadaBR/system_settings.shtm* z ładunkami "<script", "%3Cscript", onerror=, javascript:localhost_access_log.YYYY-MM-DD.txt (AccessLogValve)Warto monitorować status/bytes oraz Referer/User‑Agent.
Tomcat catalina.outBłędy JSP/stacktrace po wpisaniu HTML/JS (walidacja), restart kontekstuLinux: /var/log/tomcat*/catalina.out; Windows: ...\Tomcat\logs\Ścieżki zależne od OS/pakietu.
Log aplikacji ScadaBRZmiany ustawień/konfiguracji, operacje na HMI (np. System Settings updated)typowo w katalogu aplikacji (np. mango.log)Nazwy różne; w projektach ScadaBR/Mango spotyka się mango.log.
WAF/IPS/ProxyReguły XSS, signatures na <script>, svg/onload, javascript:AWS WAF, Azure WAF, ModSecurityDobre do szybkiej blokady (virtual patching).
Windows EID (host HMI)5156 (WFP – dopuszczenie HTTP/8080), 4624 (logon serwisu), 4688 (nietypowe procesy od Tomcata)Dzienniki zabezpieczeńPośrednie – nie wykryją XSS, ale korelują późniejsze skutki.
CloudTrailN/D (brak bezpośrednich zdarzeń) – zamiast tego: AWS WAF / ALB/CloudFront logiCloudWatch Logs / S3Użyj Insights/Athena do zapytań (patrz sekcja 7).
K8s AuditZmiany Ingress/ConfigMap/Secret dot. publicznej ekspozycji HMIkube-apiserver-audit.logPośrednio – redukcja ekspozycji na T1190.
M365N/DBrak związku funkcjonalnego.

Detekcja (praktyczne reguły)

Sigma (webserver)

title: ScadaBR system_settings.shtm Stored XSS Attempt id: 7b7a1a6b-0d7a-4c1b-9a78-7a8d9b7f4f21 status: experimental description: Wykrywa próby XSS na stronie /ScadaBR/system_settings.shtm logsource: category: webserver detection: target: cs-uri-stem|contains: "/ScadaBR/system_settings.shtm" payload_query: cs-uri-query|contains: - "<script" - "%3Cscript" - "onerror=" - "onload=" - "javascript:" payload_body: request_body|contains: - "<script" - "%3Csvg%20onload" condition: target and (payload_query or payload_body) fields: - src_ip - http_method - status - cs-useragent - cs-referrer falsepositives: - testy administratorów/HMI z dozwolonym HTML (rzadkie) level: high tags: - attack.T1491.001 - attack.T1190 - ics.T0838

Splunk (SPL)

index=web sourcetype IN ("tomcat:access","apache:access","nginx:access") uri_path="/ScadaBR/system_settings.shtm" | eval q=coalesce(uri_query,request_body) | where like(q,"%<script%") OR like(q,"%onerror=%") OR like(q,"%javascript:%") OR like(q,"%<svg%onload%") OR like(q,"%25%33%43script%") /* %3Cscript */ | stats count min(_time) max(_time) by src_ip, http_method, status, useragent, uri_query, request_body

KQL (Azure / CEF w Sentinel)

CommonSecurityLog | where RequestURL has "/ScadaBR/system_settings.shtm" | where RequestURL contains "<script" or RequestURL contains "%3Cscript" or RequestURL contains "onerror=" or RequestURL contains "javascript:" | summarize cnt=count() by SourceIP, RequestMethod, RequestURL, DeviceVendor, bin(TimeGenerated, 5m)

AWS — CloudWatch Logs Insights (AWS WAF)

fields @timestamp, httpRequest.clientIp as src_ip, httpRequest.uri, httpRequest.args, httpRequest.httpMethod as method, action, terminatingRuleId | filter httpRequest.uri like /\/ScadaBR\/system_settings\.shtm/ | filter httpRequest.args like /(<script|%3[cC]script|onerror=|javascript:)/ | stats count() by src_ip, method, httpRequest.uri, action, terminatingRuleId, bin(@timestamp, 5m)

Elastic (Kibana KQL)

(event.dataset:"tomcat.access" OR event.dataset:"apache.access" OR event.dataset:"nginx.access") AND url.path:"/ScadaBR/system_settings.shtm" AND (url.query:*"<script"* OR url.query:"*%3Cscript*" OR http.request.body.content:*"onerror="* OR url.full:*"javascript:"*)

Heurystyki / korelacje

  • Korelacja łańcucha: logowanie na HMI (często domyślne hasła) → zapis HTML/JS → nagłe wyłączenie alarmów/logów → deface/modyfikacje setpointów. (Mapuj: T1078 → T1491.001 → T0838/T0831).
  • User‑Agent / automaty: python-requests/nietypowe UA w krótkich odstępach vs sesje interaktywne operatorów. (por. obserwacje honeypota).
  • Źródła IP: hostingi/VPS (np. wzorce z raportu o TwoNet) + brak historycznego ruchu do HMI.
  • Anomalie konfiguracji: alerty na nagłe serie zmian ustawień HMI (alarmy, źródła PLC, opisy).

False positives / tuning

  • Administracyjne testy UI (rzadkie) – białe listy źródeł admina i godzin zmian; dopuszczalne są proste tagi HTML (np. <b>), ale nie script/onerror/javascript: – filtruj regexem.
  • Skrypty monitoringu generujące 4xx na ścieżce – odfiltrować status ≠ 200/302 dla attempt vs success.
  • Proxy zdrowia – wykluczyć User-Agent health‑checks.

Playbook reagowania (IR)

  1. Triage & containment
  • Odłącz publiczną ekspozycję HMI / ogranicz do VPN/allowlist (NGFW/WAF block reguły XSS).
  • Wymuś log‑out wszystkich sesji ScadaBR; reset haseł i wyłącz konta nieznane (T1078).
  1. Analiza
  • Przejrzyj AccessLogValve i catalina.out pod kątem żądań do /ScadaBR/system_settings.shtm z ładunkami XSS.
  • Zrzut bazy ScadaBR i skan na <script (przykład MySQL — lab only): SELECT table_schema, table_name, column_name FROM information_schema.columns WHERE data_type IN ('text','varchar') AND table_schema LIKE 'scadabr%'; -- Dla każdej tabeli/kolumny tekstowej: SELECT * FROM <tbl> WHERE <col> LIKE '%<script%';
  • Zweryfikuj zmiany alarmów/setpointów (T0838/T0831) i kont z ostatnich 24–72 h.
  1. Eradykacja & naprawa
  • Usuń payloady z pól UI, przywróć konfigurację alarmów i źródeł PLC z backupu.
  • Ustaw CSP, HttpOnly/Secure dla sesji, walidację/encoding pól (Server‑side).
  • Zaktualizuj ScadaBR/Tomcat/JDK, włącz WAF reguły XSS (virtual patch).
  1. Lessons learned
  • Zmiana architektury dostępu (Zero Trust, segmentacja OT/DMZ).

Przykłady z kampanii / case studies

  • Honeypot OT (2025): napastnik (grupa TwoNet) zalogował się (m.in. domyślne poświadczenia), następnie wykorzystał CVE‑2021‑26829 do deface’u strony logowania (alert JS), usunął źródła PLC, zmienił parametry i wyłączył logi/alerty. Brak prób eskalacji na hosta – nacisk na warstwę HMI.
  • KEV: CISA formalnie dodała podatność do katalogu 11/28/2025 z wymaganiem zastosowania mitigacji/wycofania produktu do 12/19/2025.

Lab (bezpieczne testy)

Wyłącznie w odizolowanym środowisku testowym. Celem jest sprawdzenie detekcji/logowania, nie eksploatacja środowisk produkcyjnych.

  1. Szybki generator logów Tomcata (bez prawdziwego ScadaBR):
docker run --name lab-tomcat -p 8080:8080 -d tomcat:9-jdk11 # Wygeneruj żądania przypominające XSS do ścieżki HMI: curl 'http://localhost:8080/ScadaBR/system_settings.shtm?desc=%3Cscript%3Ealert(1)%3C%2Fscript%3E' curl --data 'desc=<svg onload=alert(1)>' 'http://localhost:8080/ScadaBR/system_settings.shtm'
  1. Weryfikacja logów: sprawdź localhost_access_log*.txt/catalina.out i uruchom reguły z sekcji 7.
  2. WAF: o ile masz AWS WAF w labie, prześlij ruch przez ALB/CloudFront i uruchom Insights zapytanie (sekcja 7).

Mapowania (Mitigations, powiązane techniki)

Mitigations (ATT&CK Enterprise):

  • M1050 – Exploit Protection (IPS/WAF, wirtualne łatanie XSS; OS exploit guard).
  • M1048 – Application Isolation and Sandboxing (utwardzenie przeglądarek/odseparowanie stacji HMI).
  • M1030 – Network Segmentation (DMZ/Jump Host dla HMI/OT).
  • M1054 – Software Configuration (wyłączenie niepotrzebnych funkcji, poprawne encoding/validate).
  • M1042 – Disable or Remove Feature or Program (usunięcie nieużywanych modułów/komponentów web).

Powiązane techniki:

  • T1491.001 – Internal Defacement (efekt XSS w HMI).
  • T0838 – Modify Alarm Settings (wyciszanie alarmów po wejściu do HMI).
  • T0831 – Manipulation of Control (zmiany setpointów).
  • T1190 – Exploit Public‑Facing Application (gdy HMI jest dostępne publicznie).
  • T1078 – Valid Accounts (domyślne hasła).

Źródła / dalsza lektura

  • NVD – CVE‑2021‑26829 (opis, CVSS 3.1, KEV meta). (NVD)
  • CVE.org – rekord CVE (skrót opisu). (CVE)
  • CISA – KEV Catalog (wpis CVE‑2021‑26829). (CISA)
  • MITRE ATT&CK – T1491.001; T0838; T0831; T1190; aktualizacja v18. (MITRE ATT&CK)
  • Tomcat – AccessLogValve / logi (konfiguracja/ścieżki). (tomcat.apache.org)

Checklisty dla SOC / CISO

SOC

  • Alerty na /ScadaBR/system_settings.shtm + wzorce XSS (<script, %3Cscript, onerror=, javascript:).
  • Korelacja: zmiany ustawień HMI + wyciszenie alarmów (T0838) + deface (T1491.001).
  • Blokada w WAF/IPS, reguły virtual patch dla XSS. (M1050)
  • Telemetria z Tomcata (AccessLogValve) do SIEM; parsowanie pól zapytań/ciała.
  • Hunt: nietypowe UA, źródła VPS/hosting, krótkie sesje z wieloma POST/GET.

CISO / OT Lead

  • Eliminacja publicznej ekspozycji HMI (VPN/ZTNA, segmentacja OT). (M1030)
  • Domyślne hasła → wyłączone, MFA gdzie możliwe. (T1078)
  • Polityka aktualizacji ScadaBR/Tomcat/JDK; hardening CSP/HttpOnly/SameSite. (M1054)
  • Testy kontrolne: tabletop + lab z logami (sekcja 12).
  • Zgodność z CISA KEV – potwierdź wdrożenie mitigacji do 2025‑12‑19.
Idź do oryginalnego materiału