Protezione del codice su LPC1700

La protezione del codice è uno strumento ampiamente utilizzato nei prodotti elettronici moderni, permette di tutelarsi non solo dalla copia del prodotto, ma anche da possibili modifiche del software non previste.

Il microcontrollore LCP1700 mette a disposizione un meccanismo detto Code Read Protection in grado di abilitare differenti livelli di protezione per il sistema, salvaguardando sia il codice software che hardware. I livelli di sicurezza impostabili sono tre: CRP1, CRP2, e CRP3. Ognuno di questi incrementa via via la sicurezza del sistema, fino al CRP3 che impedisce ogni tipo di accesso al dispositivo. Di seguito esamineremo questi livelli di sicurezza e vedremo come possono essere implementati per incrementare la protezione di un sistema. Per gli esempi che seguiranno si è fatto uso della scheda di valutazione MCB1700 della Keil e dei programmi uVision3 e Flash Magic tools sempre della Keil. La memoria flash dell’LPC1700 può essere letta in due diversi modi: utilizzando la JTAG flash programming interface, allo stesso modo degli strumenti di debug, oppure attraverso l’ISP (In-System Programming), utilizzato dal boot loader che utilizza la porta UART.

I LIVELLI DI SICUREZZA CRP

La sigla CRP è acronimo di Code Read Protection, attraverso questo meccanismo di protezione viene impedita la lettura del codice dalla flash. In questo modo è impossibile ricavare il codice caricato per eseguire il disassemblamento o per poterlo caricare su altre piattaforme hardware. Se questi sono i propositi, il livello CRP1 potrebbe essere sufficiente, infatti cosi come per i livelli CRP2 e CRP3 viene impedito l’accesso alla flash dalla porta JTAG. Rimane attivo l’accesso tramite ISP, in maniera da poter aggiornare il firmware tramite boot loader. Aumentando il livello di sicurezza si arriva a prevenire che il codice venga modificato da persone non autorizzate, come per esempio qualcuno che utilizzi l’ISP per aggiornare parzialmente la flash o piratare il codice. In questo caso si può utilizzare il livello di sicurezza CRP2. Gli accessi alla flash per modificare il codice esistente vengono proibiti inibendo l’accesso a determinati settori, a meno che non si passi prima per una cancellazione completa del contenuto della flash, ma in tal caso il codice è ormai perso. Nel livello CRP3 si imposta la protezione più elevata, impedendo di poter aggiornare il software presente nella flash. In questo caso si parla di una protezione anche hardware poiché si impedisce il riutilizzo del sistema. Il livello CRP3 impedisce l’utilizzo dell’ISP quando esiste gia un codice valido in flash, mantenendo un livello basso su P2.10. L’accesso alla flash è così completamente inibito garantendo il massimo livello di protezione. In effetti il livello CRP3 impedisce anche qualsiasi tipo di aggiornamento del software e quindi risulta particolarmente rischioso se l’applicazione non è debitamente testata e consolidata. Esiste comunque una scorciatoia per regredire al livello CRP2 e consentire almeno l’aggiornamento della flash. Il codice utente infatti può utilizzare la Re-Invoke ISP (uno dei comandi IAP) che invoca il boot loader in modalità ISP. In questo caso comunque la flash non può essere letta, ma solo essere cancellata per essere riscritta. Il codice ovviamente deve essere scritto per gestire questa “back door” per passare temporaneamente dal livello CRP3 al CRP2 ma la possibilità di farlo deve essere mantenuta segreta. La tabella 1 riassume le operazioni che si possono eseguire sulla flash in base al livello di sicurezza impostato.

Tabella 1: operazioni consentite sulla flash in base al livello di sicurezza.

Tabella 1: operazioni consentite sulla flash in base al livello di sicurezza.

ESEMPIO PRATICO

Per programmare la flash dell’LPC1700 si può utilizzare il tool Flash Magic (nel nostro caso versione 5.14), basta configurare correttamente il device, la COM port, la baud rate, il tipo di interfaccia e la frequenza di oscillazione. In figura 1 un esempio di configurazione.

Figura 1: flash magic.

Figura 1: flash magic.

Dal programma uVision3 della Keil utilizzando il Configuration Wizard abbiamo impostato il livello di sicurezza desiderato (vedi figura 2). La scelta è di impostare il livello CRP3, nel software tuttavia si può inserire la “back door” discussa in precedenza.

Figura 2: si imposta il livello CRP3 dal Configuration Wizard.

Figura 2: si imposta il livello CRP3 dal Configuration Wizard.

Quando Flash Magic caricherà un software con livello di sicurezza CRP3 ci avverte con la finestra di figura 3. Andiamo ora in dettaglio a vedere come sia possibile inserire la scorciatoia che permette di scalcare la protezione CRP3 e aggiornare il firmware.

Figura 3: flash magic ci avverte che stiamo caricando un codice con livello di sicurezza CRP3

Figura 3: flash magic ci avverte che stiamo caricando un codice con livello di sicurezza CRP3

Con il codice del listato 1, si può vedere che la pressione di un determinato pulsante agganciato ad un I/O del microcontrollore, determina l’uscita dal ciclo di main loop, per andare ad eseguire l’invocazione del comando IAP 57, ossia Re-invoke ISP. L’esempio è estremamente semplice e prevede la pressione di un generico pulsante per rendere possibile l’aggiornamento del codice, un’applicazione reale deve garantire un metodo molto più sicuro per eseguire questa operazione.

void main (void)
{
 while (1){
          //...
         //Ciclo di Main
        //...

       //Controllo pressione del pulsante stabilito come
       //backdoor per il livello CRP3
       if ((GPIO->FIOPIN & 0x00100000) == 0)
           break;

 }//fine main loop

 /* Re-invoke ISP */
 __disable_irq();
 command[0] = 57;
 iap_entry(command,result);
 // non inserire codice qui!
 while(1);
}
Listato 1: “back door” per aggirare il livello di sicurezza CRP3

 

 

2 Commenti

  1. Giordana Francesca Brescia Giordana Francesca Brescia 3 giugno 2019
  2. Giovanni Di Maria Giovanni Di Maria 4 giugno 2019

Scrivi un commento