ου γαρ εστιν κρυπτον ο ου φανερον γενησεται ουδε αποκρυφον ο ου γνωσθησεται και εις φανερον ελθη
Wersja PL ENG Version

Podpisywanie i uwierzytelnianie aplikacji

Ważnym aspektem bezpieczeństwa w IT jest zabezpieczanie aplikacji przed nieautoryzowanymi modyfikacjami i zmianami podczas uaktualniania programów i ładowania ich nowszych wersji. W tym celu stosowane są różne mechanizmy podpisywania i uwierzytelniania oprogramowania.

Obecnie, większość systemów wbudowanych umożliwia ściąganie uaktualnionych wersji oprogramowania i danych. Nowsze wersje mogą być ładowane do urządzeń, przy użyciu specjalnych programów nazywanych programami rozruchowymi (ang. boot loader). Znajdują się one w pamięci wewnętrznej urządzenia i umożliwiają pobieranie danych z zewnątrz, a następnie zaprogramowanie urządzenia, w którym się znajduje.

Bezpieczna architektura

Zazwyczaj oprogramowanie w urządzeniu składa się z programu rozruchowego (który znajduje się w pamięci tylko-do-odczytu) oraz z systemu operacyjnego lub innej głównej aplikacji (która znajduje się w nadpisywalnej pamięci, często w pamięci flash. Taki podział umożliwia modyfikowanie programów wykonywalnych i danych oraz uaktualnianie aplikacji na urządzeniu. Jedynie nieautoryzowane modyfikacje najwrażliwszych części kodu muszą zostać zablokowane.

Dzięki takiemu podejściu użytkownicy są w stanie modyfikować większość obszaru pamięci i funkcjonalności oprogramowania, jednak program rozruchowy i podpis cyfrowy kodu trzymany jest w oddzielnej, bezpiecznej części pamięci, która może być odczytywana, ale nie może zostać zmodyfikowana. Zwykle wykorzystywane są w tym celu pamięci typu ROM (ang. Read-Only Memory), WORM (ang. Write-Once Read-Many) lub EEPROM (wewnętrzna pamięć flash mikroprocesora). Są one inicjowane przez producenta, podczas konstruowania urządzeń. Jednocześnie, większość funkcjonalności urządzenia i jego aplikacji może być modyfikowana i debugowana bezproblemowo, przy użyciu normalnych narzędzie programistycznych.

Podpisywanie oprogramowania chroni go przed dalszymi niewykrywalnymi. Ponadto, bezpieczny podpis cyfrowy pozwala uwierzytelnić producenta danej wersji aplikacji (lub przynajmniej organizację zatwierdzającą), gwarantując w ten sposób, że żaden szkodliwy program dostarczony przez trzecią stronę nie będzie uruchomiony.

Podpisywanie oprogramowania

Oprogramowanie znajdujące się na urządzeniu powinno być uruchamiane tylko wtedy, jeśli zostało ono z sukcesem zweryfikowane podczas rozruchu urządzenia. W celu potwierdzenia autentyczności aplikacji najczęściej stosuje się podpisy cyfrowe.

Podpisywanie oprogramowania

Pierwszym krokiem, który należy wykonać aby podpisać oprogramowanie jest zastosowanie funkcji haszujących (na przykład, jednego z algorytmów SHA) do wyliczenia krótkiego i unikalnego podpisu. Podpis jest stosunkowo krótkim (w porównaniu do wielkości aplikacji) ciągiem bajtów, o z góry zdefiniowanej długości.

Podpis powinien zostać następnie zaszyfrowany, przy użyciu szyfru asymetrycznego i klucza prywatnego, który jest znany jedynie producentowi urządzenia. RSA jest jednym z najbardziej popularnych szyfrów wykorzystywanych obecnie do szyfrowania podpisów cyfrowych. Zaszyfrowany podpis jest przechowywany w pamięci tylko-do-odczytu chronionego urządzenia. Raz zapisany, nie może zostać już potem nigdy zmieniony.

Odpowiadający mu klucz publiczny powinien zostać zapisany w tym samym obszarze pamięci tylko-do-odczytu, obok zaszyfrowanego podpisu. Klucze publiczne często znajdują się w podpisanych certyfikatach cyfrowych. Podczas startowania urządzenia, program powinien sprawdzić czy przechowywana wartość podpisu jest prawidłowa. W tym celu należy najpierw odszyfrować podpis przy użyciu dostępnego klucza publicznego. Następnie trzeba samemu obliczyć drugą wartość podpisu oprogramowania, wykorzystując te same funkcje haszujące, jakie były użyte oryginalnie. Na końcu należy porównać obie wartości. Jeżeli nie są takie same, to oznacza, że aplikacje znajdujące się na urządzeniu zostały zmodyfikowane już po tym, kiedy je podpisano. Wykonywanie programu powinno zostać przerwane, a urządzenie powinno się wyłączyć.

Weryfikowanie oprogramowania

Niezwykle ważne jest to, żeby sprawdzanie integralności kodu następowało zaraz na początku wykonywania się oprogramowania, kiedy procesor wciąż jeszcze operuje w obszarze pamięci tylko-do-odczytu, a sterowanie nie przeszło jeszcze do większej, nadpisywalnej części pamięci.

Ogólnie rzecz biorąc, w celu zapewnienia bezpiecznego rozruchu urządzenia, każdy mikroprocesor powinien rozpoczynać wykonywanie kodu w wewnętrznej, niemodyfikowalnej pamięci. Wszystkie procedury weryfikowania integralności oprogramowania powinny również znajdować się w tym obszarze. Takie miejsce nazywane jest często zaufanym, a punkt startowy wykonywania aplikacji jest nazywany zaufanym korzeniem (ang. the root of trust).

Istnieją również bardziej skomplikowane sposoby podpisywania kodu. Podpis może być zaszyfrowany przez wiele organizacji, na przykład przez producenta i zewnętrzną organizację certyfikującą. Ponadto, bardziej złożone mechanizmy wykorzystują dodatkowe klucze pośrednie, wykorzystywane dla uzyskania różnych poziomów zabezpieczenia.

Bezpieczne wgrywanie oprogramowania

Każda nowa wersja oprogramowania ładowana do urządzenia powinna zostać sprawdzona pod kontem integralności, w celu wykrycia wszelkich prób nieautoryzowanych modyfikacji.

Ogólną regułą jest podpisywanie tworzonego oprogramowania już na etapie produkcji, przy użyciu asymetrycznego klucza prywatnego. Zarówno oprogramowanie jak i jego podpis przechowywane są w bezpiecznej bazie danych. Algorytmy szyfrowania asymetrycznego wspomniane wyżej są najczęściej wykorzystywane również i w tej procedurze.

Podczas programowania urządzenia, programator pobiera z bazy danych oprogramowanie i odpowiadający mu podpis. Po uwierzytelnieniu programu rozruchowego urządzenia, zabezpieczone aplikacje są przesyłane do tego urządzenia.

Program rozruchowy odszyfrowuje otrzymany podpis cyfrowy, a dodatkowo samodzielnie wylicza sumę kontrolną oprogramowania. Jeżeli wartości obu podpisów (otrzymanego i wyliczonego) są takie same, wtedy nowa wersja aplikacji może zostać zaakceptowana i zainstalowana.

Bezpieczne wgrywanie oprogramowania

Podpisywanie oprogramowania obecnie

Zabezpieczanie oprogramowania za pomocą podpisów cyfrowych jest wykorzystywane w wielu aplikacjach i urządzeniach, mających zastosowanie w wielu obszarach, takich jak telekomunikacja, aeronautyka i motoryzacja. Jest to szczególnie przydatne w przypadku dużych i złożonych systemów rozproszonych, w których poszczególne elementy działają w dużym stopniu niezależnie od siebie.

Z racji tego, że wiele systemów wbudowanych dysponuje względnie niewielkimi możliwościami obliczeniowymi, należy przykładać specjalną uwagę do właściwego implementowania i wykorzystywania skomplikowanych algorytmów funkcji haszujących i szyfrujących. Zaleca się takie konfigurowanie szyfrów asymetrycznych, aby deszyfrowanie przy użyciu klucza publicznego było tak tanie, jak to tylko możliwe. Przykładowo, podczas implementowania szyfru RSA, komponent publiczny klucza powinien być możliwie małą liczbą (powiedzmy, 3), aby ułatwić szybkie przeprowadzenie działań matematycznych.