Ochrona własności intelektualnej w systemach wbudowanych

| Technika

Istnieje wiele powodów, dla których projektanci systemów wbudowanych chcą chronić swoją własność intelektualną. Najbardziej oczywiste są oczywiście względy finansowe i prawne, ale nie można zapomnieć też o ambicjach i chęci współzawodniczenia.Poza ochroną własnych praw do własności intelektualnej (IP – Intelectual Property) projektanci są też zobowiązani do ochrony bibliotek oraz praw autorskich do treści, które pozyskali od zewnętrznych firm.

Ochrona własności intelektualnej w systemach wbudowanych

Zwłaszcza ten ostatni problem jest bardzo istotny, ponieważ brak możliwości zapewnienia bezpieczeństwa IP zewnętrznych dostawców grozi sankcjami prawnymi i finansowymi.

Jak chronić?

W elektronice istnieją różne sposoby ochrony praw autorskich. Dotyczą one zarówno oprogramowania, jak i sprzętu. Głównym zadaniem stosowanych metod jest ochrona przed kradzieżą własności intelektualnej oraz przed inżynierią wsteczną (reverse engineering), która polega na odtworzeniu technologii produkcji danego urządzenia na podstawie jego dokładnych badań.

Metody używane w celu zwiększenia bezpieczeństwa oprogramowania w procesorach wbudowanych są podobne do tych, które wdraża się w oprogramowaniu o szerszym zastosowaniu. Wśród stosowanych metod należy wymienić przede wszystkim ochronę przed dezasemblacją kodu (anti-disassembly), debuggowaniem oraz zabezpieczenia przez wprowadzaniem zmian w skompilowanym kodzie (tamper resistance).

Dezasemblacja

Rys. 1. Umieszczenie procesora i pamięci na płytce blisko siebie utrudnia zlokalizowanie i przechwycenie najważniejszych sygnałów.

Techniki związane z ochroną przed dezasemblacją kodu polegają na jak największym ograniczaniu informacji podawanych na temat działania programu. Odpowiednie wykorzystanie rozwiązań tego typu powoduje znaczne utrudnienia w zrozumieniu użytych algorytmów osobom, które chcą zdobytą wiedzę wykorzystać w nielegalny sposób. Przykładem techniki anty-dezasemblacji jest samomodyfikujący się kod. W rozwiązaniu tym program jest w stanie sam zmieniać swoją postać w trakcie wykonywania. Osoba niepowołana, mająca statyczny podgląd programu, będzie mieć problem ze zrozumieniem aktualnie wykonywanego fragmentu kodu. Idea ta, choć interesująca pod względem bezpieczeństwa, ciągle jest trudnym wyzwaniem w procesie tworzenia oprogramowania.

Drugi z wymienianych sposobów, czyli zapobieganie debuggowaniu oprogramowania, uniemożliwia analizę zaimplementowanych algorytmów pod kątem wykorzystania w inżynierii wstecznej. Sprawne zabezpieczenie tego typu powinno być niejawne, dzięki czemu utrudniłoby znacznie atak osobie nieświadomej jego istnienia. Rozwiązania stosowane w celu zapobiegania przed debuggowaniem wykrywają sytuacje, w których użytkownik chce odkryć zasady działania programu i odpowiednio na to reagują. Aby wykryć takie działania użytkownika należy monitorować zmiany zawartości rejestrów i wyszukiwać pułapek wstawionych w kod programu oraz mechanizmów służących do emulacji przerwań. Mierzony jest również czas, jaki upływa pomiędzy niektórymi elementami wykonywanego kodu programu. W momencie, gdy proces debuggowania zostanie wykryty, program może odpowiedzieć w sposób, który powstrzyma niepożądane działania. Jednym z rozwiązań jest zaprzestanie wykonywania oryginalnego programu i zamiast tego rozpoczęcie realizacji powszechniej dostępnych algorytmów.

Ochrona przed modyfikacją

Trzecia z wymienianych na wstępie technik to ochrona przed modyfikacją kodu. Polega ona na implementacji w programie mechanizmów, które zareagują w momencie, gdy osoba niepowołana będzie chciała zmodyfikować program. Mechanizm ten służy do zabezpieczania programu przed tworzeniem jego nielegalnych kopii. W tym celu program powinien odczytywać i weryfikować unikalny identyfikator urządzenia, co stanowi wstępny warunek dla uruchomienia danego oprogramowania. Jeżeli odczytany identyfikator nie jest taki sam, jak ten zapisany w pamięci, program wstrzymuje swoją pracę. W takiej sytuacji istnieje duże prawdopodobieństwo, że program został nielegalnie skopiowany i jest uruchamiany na innym urządzeniu. Osoba starająca się by skopiowany program działał na innym urządzeniu może próbować wprowadzić takie zmiany w algorytmach, aby omijały one weryfikację numeru identyfikacyjnego. Techniki utrudniające modyfikacje programu powodują, że użytkownikowi trudniej jest zrozumieć zasadę działania algorytmów. Aby tak się stało stosuje się np. dodatkowe fragmenty kodu, które zaciemniają jego pierwotne znaczenie. Aby wprowadzić to zabezpieczenie stosuje się odpowiednie kompilatory, które dodają do programu odpowiednie bloki kodu. Ma to na celu stworzenie programu równoważnego pod względem funkcjonalnym, który byłby jednak trudniejszy do przetworzenia w wyniku inżynierii wstecznej. Innym sposobem zabezpieczenia jest obliczanie sum kontrolnych programu w różnych momentach jego działania. W przypadku nastąpienia obcej ingerencji w kod, wartości sum nie będą się zgadzały z oczekiwanymi. Wówczas można podjąć odpowiednie kroki utrudniające nielegalne wykorzystanie oprogramowania.

Sprzętowa ochrona IP

Zadaniem metod ochrony własności intelektualnej wdrażanych w procesorach jest zwiększenie kosztów i wysiłków ponoszonych przez osoby zajmujące się inżynierią wsteczną. Metody te mogą być implementowane na poziomie systemu, płyty lub układu scalonego.

Przykładem ochrony na poziomie systemu jest wspólny watchdog. Jeżeli którykolwiek z procesorów zostaje wstrzymany lub przestaje odpowiadać na cykliczne komunikaty międzyprocesorowe pozostałe procesory podejmują konkretne działania zabezpieczające. Wśród nich należy wymienić między innymi wymazywanie zawartości pamięci Flash, odcięcie zasilania lub, w sytuacjach ekstremalnych, fizyczne samozniszczenie procesorów i pamięci jakie można dokonać przez przeprogramowanie zasilacza na wyższe napięcie.

Ochrona na poziomie płyty głównej urządzenia obejmuje metody, które oparte są na ukrywaniu fizycznego dostępu do procesorów, pamięci oraz magistral danych. W takim przypadku zabezpieczenia należy planować na etapie projektowania płytki drukowanej. Jeżeli dane są przesyłane pomiędzy pamięcią i procesorami za pośrednictwem niezabezpieczonych linii sygnałowych, może je przechwycić osoba nieupoważniona. W takim wypadku rozmieszczenie poszczególnych elementów oraz wybór obudowy musi utrudniać dostęp do najważniejszych danych oraz linii sygnałowych. Rozmieszczenie elementów na płycie może być zrealizowane poprzez stosowanie tzw. ślepych przelotek oraz płaszczyzn masy i zasilania, które ekranują ścieżki sygnałowe warstw wewnętrznych. Wybór obudów typu FBGA i umieszczanie kluczowych torów sygnałowych z dala od zewnętrznych rzędów wyprowadzeń może skomplikować próby przechwycenia transmitowanych danych.

Ponadto umieszczanie procesora i pamięci na płycie tak blisko siebie, jak to tylko możliwe, utrudnia zlokalizowanie i przechwycenie najważniejszych informacji. Metody takie sprawiają, ze dostęp do linii sygnałowych jest trudny nawet w wypadku przewiercenia się przez płytkę. Minusem obudów BGA i takiego rozmieszczenia na płycie, w którym stosuje się wiele warstw, jest zwiększenie kosztu produkcji.

Rys. 2. Implementacja programowej ochrony IP.

Inną metodą mechanicznej ochrony jest ukrycie lokalizacji układu scalonego i zakrycie wyprowadzeń obudowy. W tym celu można stosować techniki hermetyzacji realizowane poprzez zalanie elementów żywicą epoksydową. W obrębie tak zabezpieczonego obszaru można ukryć wiele oddzielnych układów wraz z ich oznaczeniami oraz wzajemnymi połączeniami. Jest to jedno ze stosowanych rozwiązań zabezpieczania linii sygnałowych w przypadku obudów z odkrytymi wyprowadzeniami (np. DIP). Może to być także sposób na uniemożliwienie dostępu do wyprowadzeń kulkowych w obudowach BGA. Hermetyzacją można objąć albo tylko kluczowe obszary albo całą płytkę. Innym mechanicznym sposobem maskowania elementów na płycie jest po prostu usuwanie z obudów nazw poszczególnych układów. Etykiety można łatwo zniszczyć na etapie produkcji lub przy pomocy środków chemicznych lub mechanicznych. Brak nazwy utrudnia identyfikację, ponieważ układy scalone dostępne są w standardowych obudowach, co sprawia, że trudno wyłącznie na tej podstawie rozpoznać dany układ.

Bezpieczny układ

Ochrona na poziomie układu scalonego opiera się przede wszystkim na ograniczeniu dostępu do pamięci. Wiele procesorów zawiera wewnętrzną pamięć (SRAM, ROM lub Flash), której nie można odczytać spoza układu. Pamięć taka może być wykorzystywana do przechowywania kodu oraz danych, które muszą być chronione przed nieupoważnionym dostępem. Dostęp do wewnętrznej pamięci musi być ograniczany zarówno od strony samego układu, jak i sprzętu zewnętrznego komunikującego się za pośrednictwem interfejsu JTAG. Ograniczanie dostępu może zostać zaimplementowane poprzez odpowiednie ustawienie bitów konfiguracyjnych wyłączających komunikację liniami sygnałowymi JTAG. Można także po prostu pozostawić odpowiednie wyprowadzenia układu niepodłączone. Należy przy tym pamiętać, że brak dostępu do portów umożliwiających testowanie układu komplikuje wykrywanie i analizę błędów.

Czy to pomaga?

Opisywane metody zabezpieczania szczególnie istotnych danych i programów można jednak obejść na różne sposoby. Odpowiednie środki chemiczne mogą zostać użyte do usunięcia powłok hermetyzujących zastosowanych do ukrycia poszczególnych elementów. Do pokonania mechanicznych zabezpieczeń można też użyć powszechnie dostępnych narzędzi. Gdy i te metody zawiodą zawsze można użyć promieni rentgenowskich, dzięki którym da się zlokalizować poszczególne elementy oraz określić połączenia między nimi, a płytki drukowane szlifować warstwa po warstwie, aby poznać mozaikę połączeń. Zabezpieczenia układów przez ich ukrywanie pod warstwami żywicy jest więc jedynie tymczasowym rozwiązaniem i nie powstrzyma bardziej zdeterminowanych włamywaczy.

Nowe podejście w ochronie IP

Podczas, gdy coraz większa liczba twórców systemów wbudowanych odczuwa potrzebę ochrony swojej własności intelektualnej, tylko niewielu z nich jest wystarczająco przygotowana do wdrożenia zabezpieczeń. Bezpieczeństwo jest często brane pod uwagę dopiero po ukończeniu projektu. Aby spełnić oczekiwania projektantów poszukuje się więc lepszych metod ochrony IP.

Przykładowo, ochrona własności intelektualnej w nowej generacji procesorów jest dostępna poprzez wprowadzenie specjalnego trybu pracy, w którym może być wykonywany tylko kod o potwierdzonym pochodzeniu. W celu wdrożenia tego trybu, specjalne algorytmy oparte na standardach używanych w kryptografii mogą zostać użyte do zaimplementowania identyfikacji podpisu cyfrowego. W takim przypadku jedynie po zakończonej pozytywnie weryfikacji autentyczności kodu procesor przydziela danej aplikacji prawo do pracy w trybie uprzywilejowanym, w którym otrzymuje ona dostęp do pamięci z pominięciem wszelkich ograniczeń. Aby aplikacja pomyślnie przeszła weryfikację podpisu cyfrowego musi zostać podpisana przy użyciu tajnego klucza prywatnego znanego tylko obu stronom, a następnie musi zostać zweryfikowana przy użyciu odpowiedniego klucza publicznego, który może być przechowywany w procesorze.

Ograniczenia dostępu zapobiegają negatywnemu wpływowi nieuprawnionych aplikacji na zaufane programy wykonywane w zabezpieczanym trybie. Zabiegi te obejmują wyłączenie dostępu przez porty JTAG, wprowadzenie autoryzacji dostępu do pamięci i rejestrów, a także zapobieganie nieuprawnionym próbom przejęcia kontroli w trakcie wykonywania programu.

Zabezpieczony Blackfin

O tym, że opisane powyżej techniki można zrealizować w rzeczywistości, świadczy przykład procesora Blackfin firmy Analog Device, w którym zastosowano technologię Lockbox. Procedurę zabezpieczania procesora Blackfin z zaimplementowanym cennym algorytmem należy rozpocząć od zakodowania danej aplikacji przy użyciu powszechnie znanego szyfru, takiego jak np. AES (Advanced Encryption Standard). Następnie aplikację w formie zakodowanej należy zapisać w pamięci Flash. W jednorazowo programowalnej pamięci procesora zapisać trzeba również klucz odszyfrowujący. W celu uruchomienia aplikacji należy załadować ją z pamięci Flash oraz odszyfrować. Aplikacja w formie zakodowanej powinna być podpisana przy użyciu klucza prywatnego, znanego tylko twórcom aplikacji. W wyniku pozytywnej weryfikacji podpisu cyfrowego zakodowana aplikacja uzyskuje dostęp do zawartości pamięci OTP, w której jest zawarty klucz deszyfrujący służący do odkodowania zabezpieczonych obszarów pamięci.

Monika Jaworowska