Integralność oprogramowania embedded – jak chronić firmware i know-how w systemach wbudowanych

Integralność oprogramowania embedded – jak chronić firmware i know-how w systemach wbudowanych

Dlaczego integralność oprogramowania embedded jest tak ważna?

Systemy embedded stały się podstawą nowoczesnych technologii — od automatyki przemysłowej po urządzenia medyczne, automotive i IoT.
Wraz z rosnącą łącznością (sieci publiczne, chmura, edge) rośnie też liczba zagrożeń: manipulacje firmware, nieautoryzowane aktualizacje, ataki na bootloader, a nawet kradzież algorytmów.

Każda, nawet niewielka zmiana kodu, może prowadzić do:

  • utraty bezpieczeństwa urządzenia,
  • zatrzymania produkcji,
  • przejęcia kontroli,
  • kradzieży własności intelektualnej,
  • naruszenia wymogów regulacyjnych (CRA, NIS2).

Dlatego integralność oprogramowania to fundament zaufania — decyduje o tym, czy system można uznać za bezpieczny i autentyczny.


Czym jest ochrona integralności

Ochrona integralności polega na zastosowaniu procedur kryptograficznych i sprzętowych, które zapewniają, że:

  • kod nie został zmodyfikowany,
  • urządzenie uruchamia tylko zaufane oprogramowanie,
  • wszystkie naruszenia są wykrywalne,
  • a w razie problemu system przechodzi w bezpieczny tryb.

W praktyce wykorzystuje się:

  • podpisy cyfrowe,
  • szyfrowanie,
  • uwierzytelnianie komponentów,
  • weryfikację łańcucha certyfikatów.

Integralność firmware stanowi jeden z filarów cyberodporności — obok poufności i autentyczności.


Ochrona przed kopiowaniem a ochrona know-how

Ochrona przed kopiowaniem (copy protection) i ochrona know-how (IP protection) są ze sobą ściśle powiązane.
Jeśli ktoś może zmodyfikować firmware, może też odczytać jego zawartość i poznać logikę działania.

Dlatego współczesne urządzenia wykorzystują:

  • szyfrowanie danych i kodu,
  • bezpieczne elementy sprzętowe (TPM, CmDongle),
  • podpisy cyfrowe,
  • mechanizmy sprawdzające integralność podczas uruchamiania (Secure Boot).

Takie podejście łączy ochronę własności intelektualnej z bezpieczeństwem funkcjonalnym.

TPM to specjalny mikroukład zintegrowany z urządzeniem, który zwiększa bezpieczeństwo poprzez bezpieczne przechowywanie kluczy kryptograficznych, certyfikatów i haseł

CmDongle - potocznie określany jako "klucz sprzętowy". Jest to karta mikroprocesorowa (np. w postaci niewielkiego pendriva), wyposażona w procesor kryptograficzny, który m.in. wykonuje operacje szyfrowania i deszyfrowania, podłączana do komputera, serwera bądź urządzenia IoT / embedded (np. poprzez port USB). Używane do szyfrowania klucze są w nim trwale zapisane. Różne rodzaje CmDongle można znaleźć np. tutaj: https://www.wibu.com/pl/produkty/bezpieczne-repozytoria-licencji/codemeter-dongle.html


Jakie ataki zagrażają integralności systemów embedded

  1. Podróbki urządzeń (fake devices) – kopie wyglądające jak oryginały, lecz z nieautoryzowanym firmware.
  2. Podmiana firmware na karcie pamięci – atakujący wgrywa własny kod.
  3. Manipulacja nośnikiem danych – edycja i ponowne włożenie pamięci flash lub SD.
  4. Ataki przez interfejsy komunikacyjne – UART, USB, Ethernet.
  5. Analiza działania urządzenia – w poszukiwaniu luk lub sposobów obejścia licencji.

Wszystkie te ataki mają wspólny cel: zmienić lub zastąpić kod działający w urządzeniu.


Jak zbudować łańcuch zaufania w systemie embedded

Typowy system wbudowany działa warstwowo:

  1. Warstwa sprzętowa / bootloader – najwyższy poziom zaufania.
  2. System operacyjny – uruchamiany po weryfikacji bootloadera.
  3. Aplikacja – startuje dopiero po potwierdzeniu integralności systemu.
  4. Dane konfiguracyjne – muszą być sprawdzone przed użyciem.

Rys. 1 Structure of an embedded device_300dpi_CNYK.jpg

Każda warstwa potwierdza autentyczność poprzedniej, tworząc łańcuch zaufania (chain of trust).


Jak wdrożyć ochronę integralności w praktyce

1. Podpisanie i szyfrowanie kodu (AxProtector)

Na tym etapie wykonywane są następujące czynności:

  • wygenerowanie skrótu (hash) z kodu binarnego oprogramowania,
  • podpisanie go kluczem prywatnym producenta,
  • zaszyfrowanie pliku binarnego,
  • dołączenie certyfikatu z kluczem publicznym.

RYs. 2 Integrity Check_300dpi_CMYK.jpg

2. Weryfikacja przy uruchamianiu (AxEngine)

W momencie uruchomienia oprogramowania na urządzeniu odbywa się:

  • sprawdzenie licencji i certyfikatu,
  • weryfikacja podpisu i łańcucha certyfikatów,
  • odszyfrowanie i uruchomienie kodu,
  • porównanie hash z podpisem,
  • test daty ważności i listy CRL.

Rys. 3 Integrity Check_runtime_300dpi_CMYK.jpg

Dzięki temu urządzenie uruchomi tylko autentyczny, niezmodyfikowany kod.


Backward Check – weryfikacja wsteczna

Backward Check to mechanizm, który potwierdza, że poprzedni etap uruchamiania (np. bootloader) został wykonany prawidłowo.
To szczególnie ważne, gdy aplikacja nie ma pełnego dostępu do danych z niższych warstw.

Do weryfikacji używa się:

  • TPM (Trusted Platform Module),
  • CmDongle lub innego bezpiecznego elementu sprzętowego.

State Engine_300dpi_CMYK.jpg

Trusted Device przechowuje pomiary (hash) bootloadera i decyduje, czy można kontynuować uruchamianie.
Jeśli bootloader został zmodyfikowany — system nie wystartuje.


Pre-Boot Loader – pierwszy krok zaufania

To najmniejszy, najbardziej krytyczny fragment kodu, który:

  • weryfikuje integralność właściwego bootloadera,
  • aktywuje silnik bezpieczeństwa sprzętowego,
  • inicjuje łańcuch zaufania.

Pre-Boot Loader tworzony jest jednorazowo, umieszczany w pamięci ROM lub eFUSE i nie podlega aktualizacji.
Zawiera klucze, których nie można odczytać z zewnątrz.
Jeśli ten element zostanie naruszony – cały system przestaje być zaufany.


Łańcuch certyfikatów – kryptograficzny fundament zaufania

Certyfikaty tworzą hierarchię:

  1. Root Certificate – przechowywany offline lub w TPM.
  2. Code Signing Root – generuje certyfikaty niższego poziomu.
  3. Boot Signing Certificate – podpisuje bootloader.
  4. Code Signing Certificate – podpisuje firmware i aplikacje.
  5. Config Signing Certificate – podpisuje dane konfiguracyjne.
  6. CRL (Certificate Revocation List) – pozwala unieważniać certyfikaty.

Certificate chain_300dpi_CMYK.jpg

Klucze prywatne nigdy nie opuszczają bezpiecznego sprzętu (TPM, HSM, CmDongle), a certyfikaty publiczne mogą być dołączone do firmware’u.


CodeMeter – kompleksowa platforma ochrony integralności

Opisane podejście wsperane jest przez technologię CodeMeter firmy Wibu-Systems. Jej zaletą jest to, że integruje:

  • szyfrowanie kodu aplikacji,
  • podpis cyfrowy i zarządzanie certyfikatami,
  • bezpieczne przechowywanie kluczy (dongle, TPM),
  • weryfikację hash i podpisów w czasie uruchamiania,
  • integrację z systemami embedded i PLC.

Obsługiwane platformy to m.in.:

  • Windows, Linux, macOS,
  • Windows Embedded, Real-Time Linux,
  • QNX, VxWorks, CODESYS,
  • sterowniki PLC i układy FPGA.

Dzięki temu jest to rozwiązanie, które pozwala całościowo zabezpieczyć firmware i know-how bez wpływu na wydajność systemu.


FAQ – najczęstsze pytania

Czy integralność oprogramowania można wdrożyć w każdym urządzeniu?
Tak. Mechanizmy weryfikacji (TPM, CodeMeter, podpisy cyfrowe) można zintegrować nawet z mikrokontrolerami o ograniczonych zasobach.

Czy CodeMeter działa z Secure Boot?
Tak. CodeMeter rozszerza proces Secure Boot o szyfrowanie, licencjonowanie i kontrolę uruchamiania aplikacji użytkownika.

Czy łańcuch certyfikatów można aktualizować?
Tak, ale tylko z zachowaniem pełnego łańcucha zaufania – z podpisem wyższej instancji i weryfikacją CRL.


Podsumowanie

Integralność oprogramowania embedded to klucz do zaufania w świecie Przemysłu 4.0.
Bez niej niemożliwe jest zapewnienie bezpieczeństwa działania urządzeń ani ochrona know-how producenta.

Podpisy cyfrowe, szyfrowanie, TPM, CodeMeter i łańcuch certyfikatów tworzą spójny ekosystem, który gwarantuje, że urządzenie uruchamia tylko autentyczny, nienaruszony kod – niezależnie od środowiska, w którym działa.

*Niniejszy artykuł powstał na podstawie White Paper "Software Integrity Protection", dostępny na stronie: https://www.wibu.com/pl/integrity-protection-for-embedded-systems.html *

Read more

Jak zapobiec inżynierii wstecznej w aplikacjach .NET, Java, Python, C++, Rust ...?

Jak zapobiec inżynierii wstecznej w aplikacjach .NET, Java, Python, C++, Rust ...?

Jak zapobiec inżynierii wstecznej w aplikacjach .NET, Java, Python, C++, Rust ...? Inżynieria wsteczna już dawno przestała być domeną wyspecjalizowanych laboratoriów bezpieczeństwa. Współczesne środowiska uruchomieniowe, bogate metadane oraz powszechnie dostępne narzędzia do analizy kodu sprawiają, że oprogramowanie może nadal być łamane w celu uzyskania szczegółów implementacyjnych: algorytmów, reguł biznesowych czy mechanizmów