Skip to content
Encyklopedia protokołów | | 9 min czytania

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.

S7commSiemensport 102ICS
S7comm - protokół sterowników Siemens SIMATIC wykorzystany przez Stuxnet

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:

WarstwaProtokół
AplikacjaS7comm / S7comm-plus
PrezentacjaCOTP (ISO 8073, Connection-Oriented Transport Protocol)
SesjaTPKT (RFC 1006, ISO Transport Service on TCP)
TransportTCP
SiećIP

Struktura ramki S7comm

Każdy pakiet S7comm jest enkapsulowany w TPKT (RFC 1006) i COTP (ISO 8073):

S7comm over ISO-on-TCP
012345678910111213141516171819202122232425262728293031
Byte 0Byte 1Byte 2Byte 3
TPKT Version0x038 bits
TPKT Reserved0x008 bits
TPKT Length16 bits
COTP Length8 bits
COTP PDU Type8 bits
Protocol ID0x328 bits
Msg Type4 bits
Rsv4 bits
PDU Reference16 bits
Parameter Length16 bits
Data Length16 bits
Parameters + Data32 bits
Parameters + Data32 bits
header
address
control
data
© SEQRED International

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:

OperacjaFunction CodeRyzykoOpis
Read Variable0x04 (Read Var)NiskieOdczyt wartości z DB, Merkers, I/O
Write Variable0x05 (Write Var)WysokieZapis wartości - zmiana parametrów procesu
Upload Block0x1D-0x1FKrytycznePobranie programu z PLC (rekonesans kodu)
Download Block0x1A-0x1CKrytyczneWgranie nowego programu do PLC - wykorzystane przez Stuxnet
Start/Stop CPU0x28/0x29KrytyczneZmiana trybu pracy sterownika RUN/STOP
PLC Control0x28KrytyczneAktywacja wgranego programu, kompresja pamięci
SZL Read(Userdata)ŚrednieOdczyt informacji diagnostycznych - ujawnia model, firmware, konfigurację

Parametry techniczne

ParametrWartość
Port102/TCP (ISO-TSAP)
TransportISO-on-TCP (RFC 1006) + COTP (ISO 8073)
UwierzytelnianieBrak (S7comm), hasło CPU i Access Level (S7-1200/1500), challenge-response (S7comm-plus)
SzyfrowanieBrak (S7comm), TLS opcjonalnie w S7-1500 z FW >= V2.0
IntegralnośćBrak (S7comm), HMAC w S7comm-plus
StandardWł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:

  1. Infekował stacje inżynierskie z oprogramowaniem STEP 7
  2. Przechwytywał bibliotekę s7otbxdx.dll odpowiedzialną za komunikację S7comm z PLC
  3. Wykorzystywał przechwycone funkcje do przesłania złośliwego kodu (OB1, OB35, bloki FC) do sterowników S7-315 i S7-417
  4. Złośliwy kod manipulował częstotliwością pracy falowników Vacon i Fararo Paya sterujących wirówkami gazowymi
  5. 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

TechnikaIDKontekst S7comm
Program DownloadT0843Przesłanie złośliwego programu do PLC (Stuxnet)
Change Operating ModeT0858Przełączenie CPU z RUN na STOP
Manipulation of ControlT0831Zapis wartości do bloków danych (DB)
Spoof Reporting MessageT0856Fałszowanie danych zwracanych do SCADA
System FirmwareT0857Modyfikacja 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

  1. 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.

  2. 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.

  3. 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.

  4. 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+.

  5. 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.

  6. 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.

  7. 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ędzieJęzykOpisLink
Snap7CNatywna biblioteka komunikacji S7, obsługa S7-300/400/1200/1500SourceForge
python-snap7PythonWrapper Pythonowy dla Snap7 - skryptowanie odczytów/zapisów do PLCGitHub
s7scanPythonAudyt bezpieczeństwa sterowników S7 - identyfikacja wersji i konfiguracjiGitHub
plcscanPythonWykrywanie sterowników PLC w sieci (discovery)GitHub
WiresharkCWbudowany dissektor S7comm - analiza ruchu na porcie 102Wireshark

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:

Omówimy zakres, metodykę i harmonogram.