{"id":8002,"date":"2019-10-18T10:48:10","date_gmt":"2019-10-18T08:48:10","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=8002"},"modified":"2025-05-07T11:58:27","modified_gmt":"2025-05-07T09:58:27","slug":"o-bezpieczenstwie-urzadzen-wbudowanych-czesc-druga-nowa-nadzieja","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/o-bezpieczenstwie-urzadzen-wbudowanych-czesc-druga-nowa-nadzieja\/","title":{"rendered":"O bezpiecze\u0144stwie urz\u0105dze\u0144 wbudowanych \u2013 cz\u0119\u015b\u0107 druga. Nowa nadzieja"},"content":{"rendered":"\n<p class=\"has-text-align-right\"><em>Ka\u017cde przemy\u015blane i zaprojektowane rozwi\u0105zanie<\/em><br><em>da si\u0119 zast\u0105pi\u0107 sko\u0144czon\u0105 liczb\u0105 prowizorek.<\/em><br>Pan Weasley<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>S\u0142owem wst\u0119pu<\/strong><\/h2>\n\n\n\n<p>Gdy si\u0119gn\u0119 pami\u0119ci\u0105 do pocz\u0105tk\u00f3w swojej przygody z systemami wbudowanymi, to mog\u0119 \u015bmia\u0142o stwierdzi\u0107, \u017ce kwestie bezpiecze\u0144stwa traktowane by\u0142y po macoszemu. W wi\u0119kszo\u015bci przypadk\u00f3w projektanci\/architekci nie analizowali problemu kompleksowo, \u017cyj\u0105c w prze\u015bwiadczeniu, \u017ce wystarczy zastosowanie elementarnej nawet kryptografii i problem b\u0119dzie rozwi\u0105zany.<\/p>\n\n\n\n<p>Zwykle skutkowa\u0142o to implementowaniem r\u00f3\u017cnego rodzaju mniej lub bardziej udanych rozwi\u0105za\u0144, na przys\u0142owiow\u0105 ostatni\u0105 chwil\u0119, przed wdro\u017ceniem urz\u0105dzenia do produkcji. Cz\u0119sto by\u0142y to w\u0105tpliwej jako\u015bci prowizorki ur\u0105gaj\u0105ce (nawet wedle dawnych standard\u00f3w) podstawowym zasadom implementacji zabezpiecze\u0144.<\/p>\n\n\n\n<p>W ramach poni\u017cszego artyku\u0142u postaram si\u0119 zabra\u0107 Was, drodzy czytelnicy, na wycieczk\u0119 po jasnej stronie ksi\u0119\u017cyca i pokaza\u0107 pobie\u017cnie (moim zdaniem) poprawne i kompleksowe podej\u015bcie do problemu zapewnienia bezpiecze\u0144stwa w szeroko poj\u0119tym \u015bwiecie embedded.<\/p>\n\n\n\n<p>Metody\u00a0jakimi pos\u0142uguj\u0105 si\u0119 osoby \u0142ami\u0105ce zabezpieczenia urz\u0105dze\u0144 wbudowanych celem wyci\u0105gni\u0119cia przechowywanych w nich danych opisa\u0142em w <a href=\"https:\/\/sii.pl\/blog\/o-bezpieczenstwie-urzadzen-wbudowanych-czesc-pierwsza-po-ciemnej-stronie-mocy\/?category=development-na-twardo&amp;tag=bezpieczenstwo%2Ccentrum-kompetencyjne-embedded%2Ccryptography%2Cembedded-competency-center%2Cerror-injection%2Ckryptografia%2Clow-level-security%2Csecurity%2Cside-channel-analysis&amp;preview_id=8147&amp;preview_nonce=65bc9849e0&amp;preview=true&amp;_thumbnail_id=8284\" target=\"_blank\" rel=\"noopener\" class=\"ek-link\">pierwszej cz\u0119\u015bci artyku\u0142u.<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Jasna strona mocy<\/strong><\/h2>\n\n\n\n<p>Chc\u0105c dostatecznie zabezpieczy\u0107 projektowane urz\u0105dzenie nale\u017cy, przed wybraniem platformy sprz\u0119towej i napisaniem cho\u0107by jednej linii kodu, zada\u0107 sobie szereg bardzo wa\u017cnych pyta\u0144:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Jakiego typu poufne dane b\u0119d\u0105 przechowywane w naszym urz\u0105dzeniu?<\/strong><\/li>\n<\/ul>\n\n\n\n<p>W tym w\u0142a\u015bnie momencie specyfikujemy i dok\u0142adnie opisujemy wszystkie &#8222;skarby&#8221; jakie nasze urz\u0105dzenie b\u0119dzie przechowywa\u0107, a mog\u0105 to by\u0107 m.in:<\/p>\n\n\n\n<p>\u2013 loginy oraz has\u0142a<\/p>\n\n\n\n<p>\u2013 klucze szyfruj\u0105ce<\/p>\n\n\n\n<p>\u2013 dane biometryczne u\u017cytkownik\u00f3w<\/p>\n\n\n\n<p>\u2013 dane konfiguracyjne urz\u0105dzenia (je\u017celi za jej pomoc\u0105 mo\u017cemy odblokowa\u0107 okre\u015blone funkcjonalno\u015bci)<\/p>\n\n\n\n<p>Powsta\u0142\u0105 w ten spos\u00f3b list\u0119 cennych zasob\u00f3w nale\u017cy nast\u0119pnie utrzymywa\u0107 i aktualizowa\u0107 na wz\u00f3r projektowego rejestru ryzyk.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>W jaki spos\u00f3b potencjalny atakuj\u0105cy b\u0119dzie chcia\u0142 wspomniane poufne dane z urz\u0105dzenia wykra\u015b\u0107?<\/strong><\/li>\n<\/ul>\n\n\n\n<p>W tym momencie przyda nam si\u0119 szeroka wiedza na temat metod (atak\u00f3w) stosowanych w celu \u0142amania zabezpiecze\u0144 w tej konkretnej grupie urz\u0105dze\u0144 &#8211; pisa\u0142em o nich w ramach pierwszej cz\u0119\u015bci artyku\u0142u. Nale\u017cy przy tym \u015bledzi\u0107 najnowsze trendy, narz\u0119dzia oraz wydarzenia\/problemy\/odkryte luki w zabezpieczeniach na portalach typu niebezpiecznik.pl<\/p>\n\n\n\n<p><strong>Dodatkowo warto zastanowi\u0107 si\u0119 nad wp\u0142ywem wycieku\/utraty wspomnianych danych na bezpiecze\u0144stwo konkretnego egzemplarza urz\u0105dzenia oraz ca\u0142ej rodziny urz\u0105dze\u0144.<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Jak zamierzamy zminimalizowa\u0107 ryzyko ataku na chronione zasoby?<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Ostatnim elementem triady bezpiecze\u0144stwa jest opracowanie mechanizm\u00f3w ochrony naszych skarb\u00f3w. W og\u00f3lno\u015bci staramy si\u0119 chroni\u0107 dane, kt\u00f3re zidentyfikowali\u015bmy w punkcie pierwszym przed zagro\u017ceniami zidentyfikowanymi w punkcie drugim.&nbsp; Warto te\u017c rozwa\u017cy\u0107 czy rzeczywi\u015bcie potrzebujemy przechowywa\u0107 wspomniane dane (skarby) w naszym urz\u0105dzeniu.<\/p>\n\n\n\n<p><strong>I czy na pewno zidentyfikowali\u015bmy wszelkie mo\u017cliwe zagro\u017cenia?&nbsp;&nbsp;<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Zacznijmy od wyboru platformy<\/strong><\/h2>\n\n\n\n<p>Maj\u0105c ju\u017c zidentyfikowane wielkie trio (assets\/threats\/countermeasures) mo\u017cemy przyst\u0105pi\u0107 do projektowania konkret\u00f3w rozwi\u0105zania.<\/p>\n\n\n\n<p>Na pierwszy ogie\u0144 musimy dokona\u0107 wyboru platformy (mikrokontrolera\/SoCa). Opr\u00f3cz standardowych rozwa\u017ca\u0144 na temat:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ilo\u015bci potrzebnej pami\u0119ci Flash\/RAM\/EEPROM<\/li>\n\n\n\n<li>pr\u0119dko\u015bci zegara<\/li>\n\n\n\n<li>potrzebnych peryferii<\/li>\n\n\n\n<li>ilo\u015bci wyprowadze\u0144 i obudowy<\/li>\n\n\n\n<li>zakresu temperatur roboczych<\/li>\n\n\n\n<li>dost\u0119pno\u015bci oraz ceny<\/li>\n<\/ul>\n\n\n\n<p>nale\u017cy zastanowi\u0107 si\u0119 jak platforma mo\u017ce nas wesprze\u0107 od strony zabezpiecze\u0144 poprzez:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>sprz\u0119towe bloki realizuj\u0105ce funkcje kryptograficzne (AES, SHA, RSA, ECC)<\/li>\n\n\n\n<li>obecno\u015b\u0107 prawdziwego (nie pseudolosowego) generatora liczb losowych<\/li>\n\n\n\n<li>zabezpieczon\u0105 przed atakiem\/niepowo\u0142anym odczytem pami\u0119\u0107 nieulotn\u0105<\/li>\n<\/ul>\n\n\n\n<p>W idealnym \u015bwiecie urz\u0105dzenie powinno mie\u0107 wbudowany modu\u0142 HSM (Hardware Security Module) implementuj\u0105cy wszelkie prymitywy kryptograficzne oraz funkcjonalno\u015b\u0107 do bezpiecznej generacji kluczy szyfruj\u0105cych i ich przechowywania.<\/p>\n\n\n\n<p>Dodatkowo warto rozwa\u017cy\u0107 platform\u0119, kt\u00f3ra posiada mo\u017cliwie szerokie spektrum wbudowanych sensor\u00f3w dla potrzeb:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>monitorowania napi\u0119cia zasilania<\/li>\n\n\n\n<li>badania jako\u015bci sygna\u0142u zegarowego, taktuj\u0105cego CPU<\/li>\n\n\n\n<li>wykrywania atak\u00f3w fizycznych za pomoc\u0105 np. wbudowanej funkcji active shield<\/li>\n\n\n\n<li>szeregu wbudowanych w struktur\u0119 krzemow\u0105 sensor\u00f3w pozwalaj\u0105cych na wykrycie promieniowania \u015bwietlnego czy laserowego<\/li>\n<\/ul>\n\n\n\n<p>Wi\u0119kszo\u015b\u0107 czo\u0142owych producent\u00f3w mikrokontroler\u00f3w ma w swoim portfolio rodzin\u0119 uk\u0142ad\u00f3w, dedykowanych do zastosowa\u0144 bezpiecznych w bran\u017cy samochodowej, IoT czy elektronice u\u017cytkowej. W tym miejscu wymieni\u0119 cho\u0107by ST33 (https:\/\/www.st.com\/en\/secure-mcus\/st33-arm-sc300.html) czy RH850\/P1X (https:\/\/www.renesas.com\/eu\/en\/products\/microcontrollers-microprocessors\/rh850.html)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Biblioteka kryptograficzna &#8211; przydatny skrzyd\u0142owy<\/strong><\/h2>\n\n\n\n<p>Po wybudowaniu solidnego fundamentu naszego rozwi\u0105zania musimy zastanowi\u0107 si\u0119 czy wybrana przez nas platforma zapewnia wszelkie potrzebne wsparcie kryptograficzne. Je\u017celi nie, to rozwi\u0105zaniem jest (poza dodaniem zewn\u0119trznego koprocesora kryptograficznego) dobranie dedykowanej, software&#8217;owej biblioteki kryptograficznej.<\/p>\n\n\n\n<p>W zale\u017cno\u015bci od mo\u017cliwo\u015bci wybranej przez nas platformy mo\u017cemy posi\u0142kowa\u0107 si\u0119 szeregiem r\u00f3\u017cnych produkt\u00f3w, m.in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>WolfSSL (https:\/\/www.wolfssl.com\/products\/wolfssl\/)<\/li>\n\n\n\n<li>WolfCrypt (https:\/\/www.wolfssl.com\/products\/wolfcrypt-2\/)<\/li>\n\n\n\n<li>mbed TLS (https:\/\/tls.mbed.org\/)<\/li>\n\n\n\n<li>OpenSSL (https:\/\/www.openssl.org\/)<\/li>\n\n\n\n<li>I wieloma, wieloma innymi<\/li>\n<\/ul>\n\n\n\n<p>Dobrym \u017ar\u00f3d\u0142em informacji do wst\u0119pnego wyboru biblioteki\/bibliotek jest wikipedia, gdzie znajdziemy bardzo pobie\u017cne por\u00f3wnanie wielu dost\u0119pnych bibliotek (https:\/\/en.wikipedia.org\/wiki\/Comparison_of_TLS_implementations)<\/p>\n\n\n\n<p>W\u015br\u00f3d wymienionych powy\u017cej produkt\u00f3w znajdziemy zar\u00f3wno te komercyjne jak i wolne (zwykle na licencji GPL). Dodatkowo wi\u0119kszo\u015b\u0107 z nich mo\u017ce by\u0107 u\u017cyta w pe\u0142nej jak i okrojonej formie, dopasowanej do dost\u0119pnych zasob\u00f3w platformy.<\/p>\n\n\n\n<p>Dobrym przyk\u0142adem jest tutaj biblioteka WolfSSL i jej odchudzona, prostsza i l\u017cejsza forma &#8211; WolfCrypt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Zarz\u0105dzanie kluczami szyfruj\u0105cymi<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Przechowywanie<\/strong><\/h3>\n\n\n\n<p>Wi\u0119kszo\u015b\u0107 algorytm\u00f3w kryptograficznych nie mo\u017ce by\u0107 zastosowana bez podania klucza szyfruj\u0105cego. Klucz szyfruj\u0105cy, zw\u0142aszcza w kryptografii symetrycznej powinien by\u0107 szczeg\u00f3lnie chroniony. Jego utrata oznacza bowiem kompromitacj\u0119 systemu.<\/p>\n\n\n\n<p>Pytanie wi\u0119c gdzie i jak nale\u017cy przechowa\u0107 (zapisa\u0107) klucz szyfruj\u0105cy w naszym urz\u0105dzeniu, aby zwyk\u0142y zrzut pami\u0119ci (memory dump) nie pozwoli\u0142 atakuj\u0105cemu na jego odczytanie? Niestety nie ma uniwersalnego remedium na ten problem, mo\u017cemy pr\u00f3bowa\u0107:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>przechowywa\u0107 klucz w bezpiecznym module HSM (jest to najlepsze rozwi\u0105zanie)<\/li>\n\n\n\n<li>opracowa\u0107 algorytm generowania klucza w locie z d\u0142ugiego ci\u0105gu danych, przechowywanych w pami\u0119ci urz\u0105dzenia (w przypadku braku w systemie HSMa)<\/li>\n\n\n\n<li>zapisa\u0107 klucz w pami\u0119ci w formie &#8222;zaciemnionej&#8221; (obfuscate) &#8211; np. przy&nbsp; u\u017cyciu XOR z jak\u0105\u015b unikaln\u0105 warto\u015bci\u0105, przechowywan\u0105 w systemie&nbsp;(jest to najs\u0142absze rozwi\u0105zanie, ale ci\u0105gle lepsze od przechowywania klucza jawnie w pami\u0119ci)<\/li>\n\n\n\n<li>zapisywa\u0107 klucz szyfruj\u0105cy partiami pod kilkoma adresami w pami\u0119ci (dalej w zaciemnionej postaci)<\/li>\n<\/ul>\n\n\n\n<p>Wszystkie w\/w metody (poza u\u017cyciem HSM) s\u0105 kompromisem mi\u0119dzy osi\u0105gni\u0119tymi wynikami, a mo\u017cliwo\u015bciami, jakie zapewnia nam konkretna platforma. Nale\u017cy bezwzgl\u0119dnie wystrzega\u0107 si\u0119 przechowywania klucza szyfruj\u0105cego w formie jawnej, zar\u00f3wno w nieulotnej jak i ulotnej (RAM) pami\u0119ci urz\u0105dzenia.<\/p>\n\n\n\n<p>Nawet zastosowanie prostego maskowania (XOR) klucza za\u0142adowanego do RAM znacz\u0105co utrudnia atakuj\u0105cemu uzyskanie klucza w jawnej postaci, cho\u0107by za pomoc\u0105 metod opisanych w poprzedniej cz\u0119\u015bci artyku\u0142u.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Dywersyfikacja<\/strong><\/h2>\n\n\n\n<p>Kolejn\u0105 zaniedbywan\u0105 kwesti\u0105 jest dywersyfikacja kluczy szyfruj\u0105cych. Nie raz spotyka\u0142em wersje deweloperskie urz\u0105dze\u0144 wyposa\u017cone od razu w docelowy zestaw kluczy szyfruj\u0105cych, cz\u0119sto z mo\u017cliwo\u015bci\u0105 ich wy\u015bwietlenia poprzez interfejs debugowy.<\/p>\n\n\n\n<p>Takie rozwi\u0105zanie jest wyra\u017anym proszeniem si\u0119 o k\u0142opoty. Utrata nawet pojedynczego egzemplarza urz\u0105dzenia na skutek jego zgubienia&nbsp; b\u0105d\u017a kradzie\u017cy (np. w trakcie przesy\u0142ania mi\u0119dzy oddzia\u0142ami firmy) kompromituje od razu wszystkie pozosta\u0142e.<\/p>\n\n\n\n<p>Rozwi\u0105zaniem powy\u017cszego problemu jest przygotowanie co najmniej dw\u00f3ch zestaw\u00f3w kluczy szyfruj\u0105cych:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>jednego, u\u017cywanego na etapie dewelopmentu i test\u00f3w,<\/li>\n\n\n\n<li>drugiego, trafiaj\u0105cego do egzemplarzy produkcyjnych<\/li>\n<\/ul>\n\n\n\n<p>W idealnym \u015bwiecie unikalne zestawy kluczy produkcyjnych powinny zosta\u0107 wygenerowane w spos\u00f3b w pe\u0142ni automatyczny i bez udzia\u0142u cz\u0142owieka. Nast\u0119pnie unikalne paczki z kluczami trafiaj\u0105 do urz\u0105dze\u0144.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full wp-image-8335\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/Klucze.jpg\"><img decoding=\"async\" width=\"537\" height=\"337\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/Klucze.jpg\" alt=\"Dywersyfikacja kluczy szyfruj\u0105cych na etapie produkcji urz\u0105dzenia\" class=\"wp-image-8335\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/Klucze.jpg 537w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/Klucze-300x188.jpg 300w\" sizes=\"(max-width: 537px) 100vw, 537px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 1 Dywersyfikacja kluczy szyfruj\u0105cych na etapie produkcji urz\u0105dzenia<\/figcaption><\/figure>\n\n\n\n<p>Podej\u015bcie takie, mimo pewnych trudno\u015bci (konieczno\u015b\u0107 posiadania bazy kluczy produkcyjnych zamiast pojedynczego klucza produkcyjnego) zapewnia nam dodatkowo, \u017ce utrata kluczy z pojedynczego urz\u0105dzenia nie pozwoli na kompromitacj\u0119 pozosta\u0142ych.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Programowanie defensywne<\/strong><\/h2>\n\n\n\n<p>Przechodz\u0105c do implementacji oprogramowanie nale\u017cy mie\u0107 \u015bwiadomo\u015b\u0107, \u017ce poszczeg\u00f3lne rozwi\u0105zania programistyczne mocno wp\u0142ywaj\u0105 na ilo\u015b\u0107 informacji emitowanej w ramach &#8222;kana\u0142\u00f3w bocznych&#8221; (side channel analysis).<\/p>\n\n\n\n<p>Dodatkowo nale\u017cy zabezpieczy\u0107 si\u0119 przed:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>manipulacj\u0105 rejestrami procesora<\/li>\n\n\n\n<li>zmian\u0105 zawarto\u015bci kom\u00f3rek w pami\u0119ci RAM<\/li>\n\n\n\n<li>pr\u00f3b\u0105 wp\u0142ywania na przebieg wykonywanego programu (flow control)<\/li>\n\n\n\n<li>zmian\u0105 kolejno\u015bci wywo\u0142a\u0144 funkcji (call control)<\/li>\n<\/ul>\n\n\n\n<p>Aby lepiej uzmys\u0142owi\u0107 sobie konieczno\u015b\u0107 stosowania programowania defensywnego, sp\u00f3jrzmy na poni\u017cszy przyk\u0142ad i zadajmy sobie pytanie czy i jak cz\u0119sto widzimy w naszym kodzie podobne deklaracje?<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter wp-image-8079 size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/ProblemyPoziomo.jpg\"><img decoding=\"async\" width=\"869\" height=\"199\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/ProblemyPoziomo.jpg\" alt=\"Warto\u015bci zwracane z funkcji (kody) szczeg\u00f3lnie podane na atak\" class=\"wp-image-8079\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/ProblemyPoziomo.jpg 869w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/ProblemyPoziomo-300x69.jpg 300w\" sizes=\"(max-width: 869px) 100vw, 869px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 2 Warto\u015bci zwracane z funkcji (kody) szczeg\u00f3lnie podane na atak\/analiz\u0119<\/figcaption><\/figure>\n\n\n\n<p>Je\u017celi nasza odpowied\u017a jest twierdz\u0105ca to znak, \u017ce znajomo\u015b\u0107 technik zwanych z j\u0119zyka Shakespere&#8217;a &#8222;secure coding style&#8221; powinna znale\u017a\u0107 si\u0119 na naszej li\u015bcie. W ramach wspomnianej techniki implementujemy m.in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>u\u017cycie z\u0142o\u017conych warto\u015b\u0107i, r\u00f3\u017cni\u0105cych si\u0119 na wi\u0119cej ni\u017c jednym bicie (z odrzuceniem warto\u015bci skrajnych typu zero\/0xFFFFFFFF)<\/li>\n\n\n\n<li>kontrol\u0119 przep\u0142ywu kodu za pomoc\u0105 dedykowanych licznik\u00f3w (DFA counters)<\/li>\n\n\n\n<li>podw\u00f3jne sprawdzanie kluczowych zmiennych (z prze\u0142adowaniem rejestru) przed w\u0142\u0105czeniem krytycznych funkcjonalno\u015bci<\/li>\n\n\n\n<li>mechanizm okna, celem kontroli poprawno\u015bci wska\u017anik\u00f3w przy transmisji danych<\/li>\n\n\n\n<li>specyficznego u\u017cycia konstrukcji if-else, ze sprawdzeniem wszystkich negatywnych wariant\u00f3w i dopiero na ko\u0144cu przej\u015bciem do pozytywnego<\/li>\n<\/ul>\n\n\n\n<p>Wszystkie w\/w techniki prowadz\u0105 do powstania bardziej bezpiecznego kodu \u017ar\u00f3d\u0142owego, kt\u00f3ry jednak dla osoby nie zaznajomionej z problematyk\u0105 bezpiecze\u0144stwa b\u0119dzie wydawa\u0142 si\u0119 dziwny, nieoptymalny i nielogiczny.<\/p>\n\n\n\n<p>Poni\u017cej widzimy przyk\u0142ad podw\u00f3jnego sprawdzenia poprawno\u015bci weryfikacji has\u0142a. Tak napisany kod chroni przed manipulacj\u0105 warto\u015bci\u0105 zmiennej <em>passwordVerification&nbsp;<\/em>za pomoc\u0105 np. promienia laserowego skierowanego na rejestr, do kt\u00f3rego zmienna zosta\u0142a za\u0142adowana. Po pierwszym sprawdzeniu nast\u0119puje kolejne, przy czym wynik sprawdzenia inny od poprzedniego traktowany jest jako wykryty atak. W efekcie wywo\u0142ania makra ATTACK nast\u0119puje wywo\u0142anie dedykowanego attack handler&#8217;a.<\/p>\n\n\n\n<p>Nale\u017cy przy tym mie\u0107 na uwadze, \u017ce kompilator mo\u017ce usun\u0105\u0107 drugie sprawdzenie bowiem w jego mniemaniu jest ono bezsensowne. St\u0105d konieczno\u015b\u0107 regularnego przegl\u0105du kodu \u017ar\u00f3d\u0142owego, r\u00f3wnie\u017c po stronie asemblera.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter wp-image-8083 size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/doubleCheck.jpg\"><img decoding=\"async\" width=\"532\" height=\"339\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/doubleCheck.jpg\" alt=\"Przyk\u0142ad podw\u00f3jnego sprawdzenia kluczowego warunku\" class=\"wp-image-8083\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/doubleCheck.jpg 532w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/doubleCheck-300x191.jpg 300w\" sizes=\"(max-width: 532px) 100vw, 532px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 3 Przyk\u0142ad podw\u00f3jnego sprawdzenia kluczowego warunku. Przy czym drugie sprawdzenie musi da\u0107 identyczny wynik jak pierwsze<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Bezpiecze\u0144stwo idealne<\/strong><\/h2>\n\n\n\n<p>Na zako\u0144czenie moich (znowu) przyd\u0142ugich rozwa\u017ca\u0144 pragn\u0119 zaznaczy\u0107, \u017ce nikomu jeszcze nie uda\u0142o si\u0119 zabezpieczy\u0107 urz\u0105dzenia w spos\u00f3b idealny, nie daj\u0105cy si\u0119 z\u0142ama\u0107 bez wzgl\u0119du na poniesione nak\u0142ady. Odrzuc\u0119 jednak stwierdzenie, \u017ce wszystko co napisa\u0142em wy\u017cej p\u00f3jdzie na marne.<\/p>\n\n\n\n<p>Projektowaniu i implementacji zabezpiecze\u0144 nie powinna przy\u015bwieca\u0107 ch\u0119\u0107 uczynienia urz\u0105dzenia perfekcyjnie bezpiecznym, &#8222;nie\u0142amalnym&#8221;. Nale\u017cy skupi\u0107 si\u0119 na takim dobraniu rozwi\u0105za\u0144, aby ich z\u0142amanie by\u0142o dla atakuj\u0105cego nieop\u0142acalne. Przyk\u0142adowo &#8211; je\u017celi z\u0142amanie naszych zabezpiecze\u0144 przysporzy atakuj\u0105cemu 10 $ zysku to nale\u017cy dobra\u0107 takie zabezpieczenia, aby na ich z\u0142amanie po\u015bwi\u0119ci\u0142 1000$.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Bezpiecze\u0144stwo urz\u0105dzenia wbudowanego jest z\u0142o\u017ceniem wielu czynnik\u00f3w na kt\u00f3re sk\u0142adaj\u0105 si\u0119:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>projekt oprogramowania, uwzgl\u0119dniaj\u0105cy kwestie bezpiecze\u0144stwa\n<ul class=\"wp-block-list\">\n<li>identyfikacj\u0119 chronionych danych<\/li>\n\n\n\n<li>\u015bwiadomo\u015b\u0107 zagro\u017ce\u0144 i metod u\u017cywanych do \u0142amania zabezpiecze\u0144<\/li>\n\n\n\n<li>pomys\u0142 na przeciwdzia\u0142anie zagro\u017ceniom<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>wsparcie sprz\u0119towe (kryptografia, wbudowane sensory)<\/li>\n\n\n\n<li>dob\u00f3r biblioteki kryptograficznej<\/li>\n\n\n\n<li>dywersyfikacja i bezpieczne przechowywanie kluczy szyfruj\u0105cych<\/li>\n\n\n\n<li>implementacja kodu \u017ar\u00f3d\u0142owego zgodnie z filozofi\u0105 programowania defensywnego<\/li>\n\n\n\n<li>regularny przegl\u0105d kodu \u017ar\u00f3d\u0142owego pod k\u0105tem bezpiecze\u0144stwa<\/li>\n<\/ul>\n\n\n\n<p>Powy\u017csze zalecenia nale\u017cy stosowa\u0107 w ca\u0142o\u015bci i bez wyj\u0105tk\u00f3w je\u017celi chcemy otrzyma\u0107 naprawd\u0119 bezpieczne rozwi\u0105zanie. Wszelkie chodzenie na skr\u00f3ty i stosowanie p\u00f3\u0142\u015brodk\u00f3w ko\u0144czy si\u0119 zwykle osi\u0105ganiem \u0107wier\u0107rezultat\u00f3w. W efekcie powsta\u0142y system, mimo zastosowania szerokiej gamy zabezpiecze\u0144, mo\u017ce zosta\u0107 z\u0142amany poprzez wykorzystanie pojedynczej (a czasami jedynej) jego s\u0142abo\u015bci.<\/p>\n\n\n\n<p>.223rem<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;8002&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;2&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 2)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;O bezpiecze\u0144stwie urz\u0105dze\u0144 wbudowanych \u2013 cz\u0119\u015b\u0107 druga. Nowa nadzieja&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 2)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Ka\u017cde przemy\u015blane i zaprojektowane rozwi\u0105zanieda si\u0119 zast\u0105pi\u0107 sko\u0144czon\u0105 liczb\u0105 prowizorek.Pan Weasley S\u0142owem wst\u0119pu Gdy si\u0119gn\u0119 pami\u0119ci\u0105 do pocz\u0105tk\u00f3w swojej przygody &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/o-bezpieczenstwie-urzadzen-wbudowanych-czesc-druga-nowa-nadzieja\/\">Continued<\/a><\/p>\n","protected":false},"author":161,"featured_media":8396,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":6,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[851,563,846,1512],"class_list":["post-8002","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-cybersecurity","tag-embedded","tag-kryptografia","tag-poradnik"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/09\/printed-circuit-board-print-plate-via-macro-159220.jpeg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/8002"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/161"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=8002"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/8002\/revisions"}],"predecessor-version":[{"id":23523,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/8002\/revisions\/23523"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/8396"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=8002"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=8002"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=8002"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}