Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Blokada programu przed odczytem w STM32F0

Zlotorowicz 16 Kwi 2018 07:39 843 25
  • #1 16 Kwi 2018 07:39
    Zlotorowicz
    Poziom 4  

    Witam,
    Jestem na etapie próby przenoszenia się z AVRów na ARmy.
    Doszedłem do problemu zabezpieczania swoich wypocin przed niepożądanym odczytem.
    Wiem, że można zrobić to sprzetowo przy programowniu, ale znalazłem też możliwość blokady programowej.
    Próbuje tak, ale nie działa:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Próbowalem oczywiście wyłaczyć zasilanie, ale też nie pomoglo.
    Co robię źle?

    0 25
  • Pomocny post
    #2 16 Kwi 2018 08:15
    Sparrowhawk
    Poziom 21  

    Cytat:
    ===============================================================================
    Option Bytes Programming functions
    ===============================================================================

    This group includes the following functions:
    - void FLASH_OB_Unlock(void)
    - void FLASH_OB_Lock(void)
    - void FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState)
    - void FLASH_OB_RDPConfig(uint8_t OB_RDP)
    - void FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY)
    - void FLASH_OB_BORConfig(uint8_t OB_BOR)
    - FLASH_Status FLASH_ProgramOTP(uint32_t Address, uint32_t Data)
    - FLASH_Status FLASH_OB_Launch(void)
    - uint32_t FLASH_OB_GetUser(void)
    - uint8_t FLASH_OB_GetWRP(void)
    - uint8_t FLASH_OB_GetRDP(void)
    - uint8_t FLASH_OB_GetBOR(void)

    Any operation of erase or program should follow these steps:
    1. Call the FLASH_OB_Unlock() function to enable the FLASH option control register access

    2. Call one or several functions to program the desired Option Bytes:
    - void FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState) => to Enable/Disable
    the desired sector write protection
    - void FLASH_OB_RDPConfig(uint8_t OB_RDP) => to set the desired read Protection Level
    - void FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY) => to configure
    the user Option Bytes.
    - void FLASH_OB_BORConfig(uint8_t OB_BOR) => to set the BOR Level

    3. Once all needed Option Bytes to be programmed are correctly written, call the
    FLASH_OB_Launch() function to launch the Option Bytes programming process.

    @note When changing the IWDG mode from HW to SW or from SW to HW, a system
    reset is needed to make the change effective.

    4. Call the FLASH_OB_Lock() function to disable the FLASH option control register
    access (recommended to protect the Option Bytes against possible unwanted operations)


    Z dokumentacji wynika, że pominąłeś punkt 3.

    A skoro się właśnie uczysz STM32, to proponuję albo bez bibliotek, albo z HAL się uczyć, bo SPL już od dawna jest bez wsparcia ze strony ST.

    0
  • #3 16 Kwi 2018 08:40
    Zlotorowicz
    Poziom 4  

    Dziekuję za odpowiedź.
    Spróbowałem tak jak piszesz:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    ale efekt jest taki, że straciłem zupełnie kontakt z procesorem.
    Musiałem skasować go przez zwarcie resetu.

    Czy da się zrobić tak, aby wszystko działało, ale aby pamięc nie była widziana?

    0
  • #4 16 Kwi 2018 09:17
    Sparrowhawk
    Poziom 21  

    Efekt jak najbardziej spodziewany ;) Jeśli ustawiasz RDP na level 1 lub 2, to debuger przestaje działać.

    Cytat:
    Level 1: read protection:
    In debug mode (with SWD) or when code is running from boot RAM or boot loader, the main Flash memory and the backup
    registers (RTC_BKPxR in the RTC) are totally inaccessible. In these modes, even a simple read access generates
    a bus error and a Hard Fault interrupt.


    Zlotorowicz napisał:
    Musiałem skasować go przez zwarcie resetu.
    Nie znam takie sposobu kasowania pamięci mikrokontrolera :D

    Zlotorowicz napisał:
    Czy da się zrobić tak, aby wszystko działało, ale aby pamięc nie była widziana?
    Co to znaczy, że wszystko ma działać?

    0
  • Pomocny post
    #5 16 Kwi 2018 09:48
    nowyARM
    Poziom 25  

    Zlotorowicz napisał:
    Czy da się zrobić tak, aby wszystko działało, ale aby pamięc nie była widziana?

    Jedno drugiemu przeczy.
    Ma działać debuger a odczyt pamięci ma być niemożliwy?
    Po co więc zabezpieczenie przed odczytem, skoro podłączając debuger można odczytać pamięć?
    W drugą stronę, skoro nie da sie pamięci odczytać, to jak ma to zrobić debuger?

    0
  • #6 16 Kwi 2018 10:07
    Zlotorowicz
    Poziom 4  

    Pytanie, jak zrobić aby nie dało sie skopiować programu, ale pozostała łatwa możliwość ponownego zaprogramowania (bez użycia Resetu).
    Oczywiście debugowanie może nie działać.

    Da się tak?

    0
  • #7 16 Kwi 2018 10:16
    nowyARM
    Poziom 25  

    Zlotorowicz napisał:
    Pytanie, jak zrobić aby nie dało sie skopiować programu, ale pozostała łatwa możliwość ponownego zaprogramowania (bez użycia Resetu).

    Nie znam sposobu aby to zrobić i pytanie do czego taka opcja?

    0
  • #8 16 Kwi 2018 12:22
    Zlotorowicz
    Poziom 4  

    Mam wyprowadzone tylko trzy piny: GND,SWD i SWCLK. Nie mam Resetu.
    Chciałbym zablokować możliwość skopiowania kodu.
    Jeśli zrobię tak :

    Kod: c
    Zaloguj się, aby zobaczyć kod


    to aby ponownie zaprogramować, muszę zrobić to na włączonym resecie.
    Czy da sie inaczej?
    A więc tak, aby programator działał bez zwierania Resetu, ale próba odczytu kończyła się odebraniem samych FF?

    0
  • #9 16 Kwi 2018 12:23
    AndrzejKor
    Poziom 9  

    Dzień dobry
    Może takie naiwne pytanie :
    Czy podejrzewasz, że Twój produkt będzie kradziony na potęgę i używany, bez wpłacania Tobie
    należnych tantiem, na całym świecie ?

    Ja z zabezpieczeniami programów mam jak najgorsze doświadczenia. Po dwóch latach, jak dobrze nie udokumentujesz,
    to sam się nadziejesz na swoje wymyślne zabezpieczenie. Z czasem stwierdziłem, że nie warto bo :
    a) albo do używania moich produktów potrzebna jest duża wiedza specjalistyczna
    b) albo należy wyprodukować sprzęt, który z moim programem się komunikuje
    A to bardzo ogranicza krąg potencjalnych nielegalnych użytkowników produktu.

    Ale jeżeli odpowiedź na postawione na wstępie pytanie jest pozytywna to :
    a) gratuluję
    b) szukaj, pytaj dalej, może ktoś podsunie Ci świetny pomysł.

    Z ukłonami
    Andrzej Korycki

    1
  • #10 16 Kwi 2018 12:30
    Marek_Skalski
    Moderator Projektowanie

    Zlotorowicz napisał:
    Chciałbym zablokować możliwość skopiowania kodu.

    Mam smutną wiadomość. W układach z serii STM32F0xx zabezpieczenie kodu przed odczytem dość łatwo jest obejść i można uznać, że nie działa. Producent układów, STMicroelectronics przyznaje się do tego (Mani Christophe) tutaj.
    STM32F0 jest udowodnione, ale ten sam mechanizm jest wykorzystywany w F1, F4, L0, L1, L4.

    0
  • #11 16 Kwi 2018 12:41
    Zlotorowicz
    Poziom 4  

    AndrzejKor napisał:
    Dzień dobry
    Może takie naiwne pytanie :
    Czy podejrzewasz, że Twój produkt będzie kradziony na potęgę i używany, bez wpłacania Tobie
    należnych tantiem, na całym świecie ?


    Czemu od razu ma być kradziony na potęgę i na cały świat.
    Jeśli robię coś dla kogoś i poświecam na to rok pracy, to chciałbym mieć gwarancję, że nikt nie skopiuje mojej pracy jednym klinknięciem.
    Chyba to oczywista oczywistość?

    W AVRach takie zabezpieczenie uzyskiwałem przez ustawienie jednego Fusa.
    Aż mi się nie chce wierzyć, że w ARMach tego sie nie da zrobić .

    0
  • Pomocny post
    #12 16 Kwi 2018 13:01
    nowyARM
    Poziom 25  

    Zlotorowicz napisał:
    Czemu od razu ma być kradziony na potęgę i na cały świat.
    Jeśli robię coś dla kogoś i poświecam na to rok pracy, to chciałbym mieć gwarancję, że nikt nie skopiuje mojej pracy jednym klinknięciem.

    Powiąż kod z nr seryjnym procesora.

    Dodano po 1 [minuty]:

    Zlotorowicz napisał:
    to aby ponownie zaprogramować, muszę zrobić to na włączonym resecie.
    Czy da sie inaczej?

    Na czas pisania kodu wyłącz zabezpieczenie.

    Dodano po 2 [minuty]:

    Zlotorowicz napisał:
    Mam wyprowadzone tylko trzy piny: GND,SWD i SWCLK. Nie mam Resetu.

    To błąd. Zawsze wyprowadzam linię reset. Wystarczy, że używasz usypiania procka i jak nie masz resetu to nie uda się zaprogramować procka (można to zmienić w fuse ale zdaje się tylko dla trybu debug).

    0
  • #13 16 Kwi 2018 13:07
    Zlotorowicz
    Poziom 4  

    nowyARM napisał:
    Powiąż kod z nr seryjnym procesora.


    jest to jakieś rozwiązanie.
    Ale jestem bardzo zdziwiony, że nie da sie tego zrobić tak jak było to w starych poczciwych AVRach.


    Teraz sprawdziłem.
    Niestety, ale jeżeli na początku programu napiszę taki kod:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    to procesor nie działa.

    Nie mam możliwości ponownego programowania, muszę wymusic przez Reset. :cry:

    0
  • #14 16 Kwi 2018 13:20
    nowyARM
    Poziom 25  

    Zlotorowicz napisał:
    nowyARM napisał:
    Powiąż kod z nr seryjnym procesora.

    jest to jakieś rozwiązanie.

    W ARM można iść dalej. Część kodu może być ładowana z zewnętrznej pamięci, na zaszyfrowanej 1-Wire do ram uC i tam wykonywana. Problemem może być zmuszenie kompilatora do takiego zachowania (skompilowanie kodu pod określonym adresem w ram).
    Prościej, można dodatkowo, poza ID uC powiązać kod z szyfrowaną eeprom 1-Wire. Takie rozwiązanie stosuje producent uniwersalnego programatora. W eeprom zapisuje sobie dodatkowo liczbę zaprogramowanych układów i np po zaprogramowaniu 10'000szt trzeba kupić kolejna licencję (kolejny eeprom). Podobne, prostsze rozwiązanie jest używane przez krajowego producenta PABX.

    Zlotorowicz napisał:

    Ale jestem bardzo zdziwiony, że nie da sie tego zrobić tak jak było to w starych poczciwych AVRach.

    Open source jest ostatnio modne :-)

    0
  • #15 16 Kwi 2018 13:40
    Zlotorowicz
    Poziom 4  

    Możecie mnie oświecić, czemu ten kod powoduje że procesor nie wykonuje programu:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #16 16 Kwi 2018 15:38
    Sparrowhawk
    Poziom 21  

    Nie jestem w 100% pewien, bo nie używałem nigdy tych funkcji, a ich dokumentacja jest uboga, ale prawdopodobnie FLASH_OB_Launch() wymusza reset procesora.

    Spróbuj ustawiać RDP na Level 1, tylko wtedy, gdy wcześniej będzie ustawiony na 0 (FLASH_OB_GetRDP()).

    1
  • Pomocny post
    #17 16 Kwi 2018 17:55
    excray
    Poziom 39  

    A czy nie lepiej ustawiać zabezpieczenia z poziomu aplikacji "ST-Link Utility"? Po definitywnym zakończeniu programowania uruchomić aplikację i zabezpieczyć procesor?

    1
  • #18 16 Kwi 2018 23:22
    Zlotorowicz
    Poziom 4  

    excray napisał:
    A czy nie lepiej ustawiać zabezpieczenia z poziomu aplikacji "ST-Link Utility"? Po definitywnym zakończeniu programowania uruchomić aplikację i zabezpieczyć procesor?


    to wiem.
    Myślałem że da sie wpisać kilka linijek kodu i będzie to działać zawsze i wszedzie ( w sensie ta blokada).

    0
  • #19 19 Kwi 2018 13:15
    arturt134
    Poziom 26  

    Żeby odczytać kod z zabezpieczonego STM32 trzeba mieć ogromną wiedzę, narzędzia i poświęcić na to sporo czasu. Jeżeli procesor zawiera dane warte miliony dolarów, to zawsze znajdzie się jakiś sposób na wyciągnięcie tych danych. Jeżeli jednak jest to aplikacja, której napisanie zajmuje 1-2 miesiące, to prościej (i taniej) jest napisać ją od początku. Moim zdaniem, jeżeli zabezpieczenia nie da się złamać bez specjalistycznego sprzętu w ciągu kilku godzin, to jest to wystarczające zabezpieczenie dla 99% przypadków.

    0
  • #20 19 Kwi 2018 13:19
    excray
    Poziom 39  

    Już @Marek_Skalski wspominał o tym, że odczytanie STMa zabezpieczonego RDP Level 1 jest dość proste.

    0
  • #21 19 Kwi 2018 13:36
    arturt134
    Poziom 26  

    Proste, dla specjalisty ze sprzętem. Zajrzałem do dokumentu:
    [url=]https://www.aisec.fraunhofer.de/content/dam/aisec/ResearchExcellence/woot17-paper-obermaier.pdf[/url]
    który jest przytaczany kilka postów wcześniej. Wygląda to raczej na spore zagadnienie...

    0
  • #22 19 Kwi 2018 13:40
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Akurat ostatnia z opisanych tam metod wymaga "specjalistycznego sprzętu" w postaci płytki za <100 zł, kilku kabli i przekaźnika. Program jest udostępniony - wystarczy wgrać, uruchomić i poczekać.

    0
  • #23 19 Kwi 2018 13:55
    nowyARM
    Poziom 25  

    Freddie Chopin napisał:
    Akurat ostatnia z opisanych tam metod wymaga "specjalistycznego sprzętu" w postaci płytki za <100 zł, kilku kabli i przekaźnika. Program jest udostępniony - wystarczy wgrać, uruchomić i poczekać.

    Udało się koledze odczytać zabezpieczony program?


    Wygląda na to, że aby w miarę skutecznie zabezpieczyć program na STM warto dodać CPLD i zaszyć tam część funkcjonalności.

    0
  • #24 19 Kwi 2018 14:03
    arturt134
    Poziom 26  

    No właśnie - ja też przyłączam się do pytania....

    0
  • #25 19 Kwi 2018 14:10
    Freddie Chopin
    Specjalista - Mikrokontrolery

    nowyARM napisał:
    Udało się koledze odczytać zabezpieczony program?

    Jeśli ktoś ma obsesję na punkcie zabezpieczeń to może sprawdzić czy ta metoda działa (; Osobiście nie mam podstaw, żeby nie wierzyć w to co jest opisane w artykule.

    0
  • #26 19 Kwi 2018 15:06
    Marek_Skalski
    Moderator Projektowanie

    @nowyARM
    Nie odczytywałem i nie mam takiej potrzeby. To co robię profesjonalnie, jest na zupełnie innej platformie. Powiedziałbym, że ma wytrzymałość tytanu z powłoką DLC. A to co robię dla zabawy i czasami jest na STM32, jest dla mnie. Nie muszę tego zabezpieczać. Temat podlinkowałem, ponieważ jest oficjalnie potwierdzony przez osoby reprezentujące STMicroelectronics.
    Nie trzeba żadnych CPLD, ani FPGA. To są jakieś garażowe rozwiązania. Jak chcesz to zrobić porządnie, to obok uC montujesz śmiesznie tani układ potwierdzający autentyczność i uwierzytelniający, który łączysz przez I2C albo SPI i urządzenie jest bezpieczne. Nawet jak ktoś wypruje kod, to nie ma kluczy i nie dostanie autoryzacji.
    Układy uwierzytelniające produkuje kilka firm: Maxim, Infineon, NXP, ST, Microchip (Atmel) to te największe. Jest też kilkanaście innych, które dostarczają dopasowane, bezpieczne rozwiązania, np. dla bankowości. Stale aktualizowane standardy obowiązujące na tym polu są dużo bardziej wymagające i pokrywają dużo większy zakres niż pomysłowość pojedynczego inżyniera.

    0