S7comm - protokół sterowników Siemens SIMATIC wykorzystany przez Stuxnet
S7comm (port 102, ISO-TSAP) - protokół Siemens SIMATIC S7, brak uwierzytelniania, atak Stuxnet, S7comm-plus, rekomendacje segmentacji dla sieci z PLC Siemensa.
Gdy w 2010 roku badacze bezpieczeństwa analizowali kod Stuxneta - pierwszej cyberbroni wymierzonej w infrastrukturę przemysłową - odkryli, że robak komunikował się ze sterownikami PLC Siemens SIMATIC S7-300 i S7-400 za pomocą ich natywnego protokołu: S7comm. Ten własnościowy protokół, zaprojektowany dekady wcześniej wyłącznie z myślą o funkcjonalności, nie posiadał żadnych mechanizmów uwierzytelniania ani szyfrowania. Stuxnet wykorzystał tę słabość do przesłania złośliwego kodu do sterowników sterujących wirówkami gazowymi w irańskim Natanz - zmieniając na zawsze postrzeganie bezpieczeństwa protokołów przemysłowych.
Jak działa S7comm
S7comm (S7 Communication) to własnościowy protokół firmy Siemens służący do komunikacji ze sterownikami rodziny SIMATIC S7. Używany jest przez oprogramowanie inżynierskie (TIA Portal, STEP 7), systemy SCADA (WinCC) oraz panele HMI do programowania, konfigurowania, diagnostyki i monitorowania sterowników PLC.
Protokół operuje na warstwie aplikacji, korzystając z transportu ISO-on-TCP (RFC 1006) na porcie TCP 102. Stos protokołów wygląda następująco:
| Warstwa | Protokół |
|---|---|
| Aplikacja | S7comm / S7comm-plus |
| Prezentacja | COTP (ISO 8073, Connection-Oriented Transport Protocol) |
| Sesja | TPKT (RFC 1006, ISO Transport Service on TCP) |
| Transport | TCP |
| Sieć | IP |
Struktura ramki S7comm
Każdy pakiet S7comm jest enkapsulowany w TPKT (RFC 1006) i COTP (ISO 8073):
Protocol ID to zawsze 0x32 - to sygnatura pozwalająca na identyfikację S7comm w ruchu sieciowym. Pole Msg Type określa rodzaj komunikatu (0x01 = Job Request, 0x02 = Ack, 0x03 = Ack-Data, 0x07 = Userdata).
Typy komunikatów S7comm
S7comm obsługuje trzy główne typy komunikatów:
- Job Request - żądanie od klienta (np. TIA Portal) do serwera (PLC): odczyt/zapis zmiennych, upload/download bloków programu, start/stop CPU
- Ack / Ack-Data - potwierdzenie z danymi lub bez
- Userdata - komunikaty diagnostyczne, programistyczne, cykliczne transfery danych
Operacje S7comm i ich ryzyko:
| Operacja | Function Code | Ryzyko | Opis |
|---|---|---|---|
| Read Variable | 0x04 (Read Var) | Niskie | Odczyt wartości z DB, Merkers, I/O |
| Write Variable | 0x05 (Write Var) | Wysokie | Zapis wartości - zmiana parametrów procesu |
| Upload Block | 0x1D-0x1F | Krytyczne | Pobranie programu z PLC (rekonesans kodu) |
| Download Block | 0x1A-0x1C | Krytyczne | Wgranie nowego programu do PLC - wykorzystane przez Stuxnet |
| Start/Stop CPU | 0x28/0x29 | Krytyczne | Zmiana trybu pracy sterownika RUN/STOP |
| PLC Control | 0x28 | Krytyczne | Aktywacja wgranego programu, kompresja pamięci |
| SZL Read | (Userdata) | Średnie | Odczyt informacji diagnostycznych - ujawnia model, firmware, konfigurację |
Parametry techniczne
| Parametr | Wartość |
|---|---|
| Port | 102/TCP (ISO-TSAP) |
| Transport | ISO-on-TCP (RFC 1006) + COTP (ISO 8073) |
| Uwierzytelnianie | Brak (S7comm), hasło CPU i Access Level (S7-1200/1500), challenge-response (S7comm-plus) |
| Szyfrowanie | Brak (S7comm), TLS opcjonalnie w S7-1500 z FW >= V2.0 |
| Integralność | Brak (S7comm), HMAC w S7comm-plus |
| Standard | Własnościowy (Siemens) |
| Dotyczy urządzeń | SIMATIC S7-300, S7-400, S7-1200, S7-1500, ET 200SP |
Ewolucja - od S7comm do S7comm-plus
S7comm (oryginalny)
Oryginalny protokół S7comm, stosowany w sterownikach S7-300 i S7-400, nie posiada żadnych mechanizmów bezpieczeństwa. Każdy host w sieci zdolny nawiązać połączenie TCP na porcie 102 może:
- Odczytać dowolne zmienne procesowe
- Zapisać wartości do bloków danych
- Przesłać nowy program do PLC
- Przełączyć CPU między trybami RUN i STOP
Jedynym “zabezpieczeniem” jest opcjonalne hasło CPU (know protection password) - przesyłane tekstem jawnym i łatwe do przechwycenia.
S7comm-plus (V3)
Siemens wprowadził S7comm-plus (określany też jako S7 Communication V3) w sterownikach S7-1200 (od firmware V4.0) i S7-1500. Nowy protokół dodaje:
- Mechanizm integralności - komunikaty są podpisywane przy użyciu HMAC, co uniemożliwia modyfikację pakietów w locie
- Ochrona programu - bloki programu mogą być szyfrowane i podpisane cyfrowo (Know-How Protection, Copy Protection)
- Access Levels - cztery poziomy dostępu (Full Access, Read Access, HMI Access, No Access) z hasłami
- TLS - sterowniki S7-1500 z firmware V2.0+ obsługują szyfrowanie TLS dla komunikacji z TIA Portal
Ale nawet S7comm-plus ma ograniczenia: mechanizm integralności został złamany przez badaczy Claroty (Biham, Bitan, Elata, 2019), którzy wykazali możliwość fałszowania komunikatów i przesyłania nieautoryzowanego kodu do PLC S7-1500. Siemens wydał poprawki, ale starsze wersje firmware pozostają podatne.
Ocena bezpieczeństwa
Stuxnet - protokół S7comm jako wektor ataku
Stuxnet (2009-2010) to najpowszechniej znany atak wykorzystujący S7comm. Robak:
- Infekował stacje inżynierskie z oprogramowaniem STEP 7
- Przechwytywał bibliotekę
s7otbxdx.dllodpowiedzialną za komunikację S7comm z PLC - Wykorzystywał przechwycone funkcje do przesłania złośliwego kodu (OB1, OB35, bloki FC) do sterowników S7-315 i S7-417
- Złośliwy kod manipulował częstotliwością pracy falowników Vacon i Fararo Paya sterujących wirówkami gazowymi
- Jednocześnie fałszował dane zwracane do systemu SCADA, pokazując operatorom normalne parametry pracy
Stuxnet udowodnił, że brak uwierzytelniania w S7comm to nie abstrakcyjne zagrożenie, lecz realna ścieżka ataku pozwalająca na zniszczenie fizycznej infrastruktury.
Inne podatności i incydenty
- CVE-2019-13945 - sterowniki S7-1200 z firmware < V4.4 umożliwiały obejście ochrony programu i odczyt kodu PLC mimo ustawionego hasła (Airbus CyberSecurity, 2019)
- CVE-2022-38465 - krytyczna podatność (CVSS 9.3) w S7-1200 i S7-1500 umożliwiająca wydobycie klucza prywatnego używanego do ochrony konfiguracji i komunikacji. Badacze Claroty Team82 wykazali, że znając klucz, atakujący może podszyć się pod TIA Portal i przesłać dowolny kod do PLC
- PLC bluestopping - badacze Ralf Spenneberg, Maik Brueggemann i Hendrik Schwartke zaprezentowali na Black Hat USA 2016 robaka PLC-to-PLC rozprzestrzeniającego się między sterownikami S7-1200 przez S7comm bez interakcji ze stacją inżynierską
- Narzędzia publiczne - Snap7 (open-source library), ISF (Industrial Security Framework) i moduły Metasploita umożliwiają pełną interakcję z S7comm: odczyt/zapis zmiennych, download/upload bloków, przełączanie CPU RUN/STOP
MITRE ATT&CK for ICS
| Technika | ID | Kontekst S7comm |
|---|---|---|
| Program Download | T0843 | Przesłanie złośliwego programu do PLC (Stuxnet) |
| Change Operating Mode | T0858 | Przełączenie CPU z RUN na STOP |
| Manipulation of Control | T0831 | Zapis wartości do bloków danych (DB) |
| Spoof Reporting Message | T0856 | Fałszowanie danych zwracanych do SCADA |
| System Firmware | T0857 | Modyfikacja firmware sterownika |
Stuxnet jest skatalogowany jako S0603 w MITRE ATT&CK for ICS, z bezpośrednim powiązaniem do technik T0843, T0856 i T0831.
Rekomendacje segmentacji i ochrony
TIP
Sterowniki Siemens S7-300 i S7-400 z oryginalnym S7comm nie mogą być zabezpieczone na poziomie protokołu. Jedyną skuteczną ochroną jest izolacja sieciowa i ścisła kontrola dostępu do portu 102. Organizacje z krytycznymi procesami na S7-300/400 powinny traktować migrację do S7-1500 jako priorytet bezpieczeństwa. Szczegółowe zasady segmentacji sieci OT - w tym model stref i korytarzy IEC 62443 - opisujemy w artykule Segmentacja sieci OT - strefy i korytarze.
Kluczowe rekomendacje
-
Izolacja portu 102 - dostęp do portu 102/TCP na sterownikach PLC powinien być ograniczony wyłącznie do autoryzowanych stacji inżynierskich i serwerów SCADA. Na firewallu OT zdefiniuj allowlistę par adresów IP. Każdy inny ruch na port 102 blokuj i loguj.
-
Aktualizuj firmware - sterowniki S7-1200 powinny pracować na firmware >= V4.4, a S7-1500 na najnowszej dostępnej wersji. Każda aktualizacja firmware poprawia mechanizmy bezpieczeństwa S7comm-plus.
-
Włącz Access Level Protection - na sterownikach S7-1200/1500 skonfiguruj poziomy dostępu z silnymi hasłami. Ustaw “HMI Access” jako domyślny, “Full Access” przydzielaj tylko stacjom inżynierskim i tylko na czas prac serwisowych.
-
Włącz TLS - na S7-1500 z firmware >= V2.0 skonfiguruj szyfrowaną komunikację z TIA Portal. Wymaga to certyfikatów X.509 - Siemens udostępnia Global Certificate Manager w TIA Portal V17+.
-
Monitoring S7comm - wdróż pasywny monitoring sieci OT z dekoderem S7comm (Nozomi Networks, Claroty, Dragos). System powinien alertować na: program download do PLC, zmianę trybu CPU, odczyt SZL z nieznanych źródeł, komunikację S7comm z urządzeń niebędących stacjami inżynierskimi.
-
Ochrona stacji inżynierskich - stacja z TIA Portal / STEP 7 to najcenniejszy cel atakującego. Hardening: dedykowany komputer offline (nie podłączony do sieci korporacyjnej), szyfrowany dysk, MFA, whitelisting aplikacji, regularne tworzenie kopii zapasowych projektów PLC.
-
Fizyczna ochrona przełącznika trybu - sterowniki S7 posiadają fizyczny przełącznik trybu (RUN/STOP/MRES). Upewnij się, że szafy sterowników są zamknięte na klucz i dostęp fizyczny jest ograniczony.
Podsumowanie
S7comm to protokół, który przeszedł do historii cyberbezpieczeństwa OT za sprawą Stuxneta. Oryginalny S7comm (S7-300/400) nie oferuje żadnych mechanizmów ochrony - każdy host w sieci może odczytywać dane, zmieniać program i zatrzymywać sterownik. S7comm-plus (S7-1200/1500) wprowadza istotne usprawnienia: HMAC, Access Levels, opcjonalne TLS - ale nawet te mechanizmy były wielokrotnie obchodzone przez badaczy bezpieczeństwa. W środowiskach z sterownikami Siemens segmentacja sieci, monitoring komunikacji S7comm i ochrona stacji inżynierskich to absolutne minimum bezpieczeństwa.
Narzędzia open source
| Narzędzie | Język | Opis | Link |
|---|---|---|---|
| Snap7 | C | Natywna biblioteka komunikacji S7, obsługa S7-300/400/1200/1500 | SourceForge |
| python-snap7 | Python | Wrapper Pythonowy dla Snap7 - skryptowanie odczytów/zapisów do PLC | GitHub |
| s7scan | Python | Audyt bezpieczeństwa sterowników S7 - identyfikacja wersji i konfiguracji | GitHub |
| plcscan | Python | Wykrywanie sterowników PLC w sieci (discovery) | GitHub |
| Wireshark | C | Wbudowany dissektor S7comm - analiza ruchu na porcie 102 | Wireshark |
TIP
python-snap7 pozwala na skryptowanie interakcji z PLC Siemens: client.read_area(areas.DB, 1, 0, 100) odczytuje 100 bajtow z bloku DB1 - przydatne do weryfikacji, czy segmentacja sieci rzeczywiscie blokuje nieautoryzowany dostep.
Źródła:
- Stuxnet - S0603 - MITRE ATT&CK for ICS
- A Deep Dive into Siemens S7 Communication - Cheng Lei, Li Donghong, Ma Liang, 2017
- Rogue7: Rogue Engineering-Station Attacks on S7 Simatic PLCs - Claroty Team82, Biham et al., 2019
- CVE-2022-38465 - Siemens SIMATIC S7 Key Extraction - Claroty Team82, 2022
- PLC-Blaster: A Worm Living Solely in the PLC - Spenneberg, Brueggemann, Schwartke, Black Hat USA 2016
- IEC 62443 - Industrial communication networks - IT security - IEC
- Siemens Industrial Security - Siemens AG
- NIST SP 800-82 Rev. 3 - Guide to OT Security - NIST, 2023