Proteggere il flash AVR dalla lettura tramite ISP?


15

Sto cercando di proteggere l'intero flash dalla lettura tramite ISP. Ha bootloader, in grado di auto-programmare la sezione dell'applicazione.

Impostazione del byte di blocco su:

LB1/LB2 non consentirà all'utente di utilizzare il bootloader per caricare il nuovo firmware.

BLB12/BLB11e BLB01&BLB02non impedirà la lettura del flash tramite ISP, se non sbaglio.

Quindi non c'è modo di consentire all'utente di aggiornare il firmware tramite il bootloader personalizzato e proteggere contemporaneamente il flash dalla lettura?

Risposte:


18

Non hai specificato un chip, quanto segue è principalmente orientato ai dispositivi atmega a 8 bit, ma sono informazioni generali. Leggi la sezione "Programmazione della memoria" per la scheda tecnica del tuo chip specifico per informazioni più specifiche!

Detto questo, e come hai detto, tutti i dispositivi AVR contengono due bit di blocco denominati LB1 e LB2. La programmazione di questi (a 0, basso) aggiungerà protezione ai contenuti scritti nelle memorie Flash ed EEPROM secondo la tabella seguente. Il livello di protezione è diviso in tre modalità, in cui la modalità 1 non offre protezione e la modalità 3 offre la massima protezione. È possibile passare a una modalità di protezione superiore semplicemente riprogrammando i bit di blocco.

L'AVR consente di cambiare i bit "alti" in "bassi", ma non viceversa. Non è possibile modificare un bit di blocco "basso" in "alto", pertanto non è possibile ridurre il livello di protezione. Per cancellare i bit di blocco, è necessaria una cancellazione completa del chip, che cancella la memoria Flash.

Tabella dei bit di blocco AVR

Questi 2 bit di blocco da soli (LB1 e LB2) quando bassi impediranno al 99,9% delle persone di rubare il firmware! Probabilmente più del 99,9%. Sarebbe quasi sempre più semplice decodificare il tuo codice.

Quindi non c'è modo di consentire all'utente di aggiornare il firmware tramite il bootloader personalizzato e proteggere contemporaneamente il flash dalla lettura?

Per quanto ne so (potrei sbagliarmi, ma penso che avrei avuto problemi con questo prima), su dispositivi che hanno i fusibili di protezione del bootloader (BLB12 e BLB11), puoi bloccare la sezione del bootloader personalizzata , disabilitare SPI ed essere protetto dal 97-98% delle persone.

Tuttavia, quando nessuno dei bit di blocco è programmato, non sono abilitate le funzioni di blocco della memoria !!! La disabilitazione dell'ISP è sufficiente per bloccare il 70% delle persone.

Per alcune informazioni aggiuntive, i bit di blocco e i fusibili non si trovano nel normale spazio flash o EEPROM, né sono accessibili dal software, ad eccezione dei bit di blocco relativi al caricatore di avvio nei dispositivi con la funzione di autoprogrammazione. La tabella 2 in questa nota dell'app ti aiuterà a identificare cosa puoi fare per il tuo particolare dispositivo!

Le linee AVR di Atmel non sono dispositivi ad alta sicurezza (a meno che non sia esplicitamente indicato!) E come tali non hanno assolutamente alcuna garanzia di sicurezza del codice, né dovrebbero! Come tutti i dispositivi non sicuri (e purtroppo anche alcuni sicuri), sono soggetti ad attacchi comuni!


modificare

Metterò a bordo l'intestazione dell'interfaccia di programmazione HV. Ma qualcuno può usare il programmatore HV per LEGGERE il flash? So che il programmatore HV può cancellare i chip anche se ISP / Jtag sono disabilitati.

Non penso che dovresti includere il programmatore HV nella progettazione della tua scheda a meno che non sia assolutamente necessario e sai per certo che non causerà problemi con nulla. I programmatori HV (segnali a 12 volt) sono disponibili solo come misura di sicurezza per programmare i chip bloccati (errore bloccato, principalmente). In teoria, questo è solo lo scopo di programmare il dispositivo non legge nulla. E non ho mai sentito parlare di un exploit che consentirebbe la lettura.

Per aggiornare il bootloader (occasionalmente) inserirò l'intestazione dell'interfaccia di programmazione HV. Ma qualcuno può usare il programmatore HV per LEGGERE il flash? So che il programmatore HV può cancellare i chip anche se ISP / Jtag sono disabilitati.

Penso che potrebbe esserci un modo per aggiornare il flash bloccato tramite bootloader, (qualcosa a che fare con un flag di scrittura interno e / o ISR forse ???) Ma dovrò cercare le mie note e forse dovrò testarlo. Non sarò in grado di farlo per ~ 20 ore; quindi consiglio vivamente di porre una nuova domanda focalizzata solo su questo e per il processore che hai citato. È un'ottima domanda !


+1 per l'ultimo commento, se tutto il resto fallisce, qualsiasi uomo può semplicemente dissaldare il chip e attaccarlo a un debugger / programmatore AVR per ripristinare i bit di blocco e la tua sicurezza è andata.
helloworld922,

@Garrett Fogerlie: non sono sicuro di cosa ti abbia portato a pensare che sto cercando di rubare il codice, per favore fammi sapere e correggerò la mia domanda in modo che gli altri non la pensino allo stesso modo. Sto cercando di fornire una protezione minima del mio codice, il mio bootloader. Ad ogni modo, abbina più domande su questo. Il chip è ATMega328, pensato che la famiglia avrà un uso comune di bit di blocco. Hai spiegato LB1e LB2, che ho anche descritto nella mia domanda come opzione limitante per utilizzare il bootloader a scopo di aggiornamento. Quindi non è un'opzione. Per quanto riguarda BLB12e BLB11- questo è quello che non capisco. (continua)
Pablo

L'impostazione di questi bit NON impedisce a nessuno di leggere il flash (applicazione + bootloader) dall'esterno. Dal foglio dati sembra che quei bit bloccheranno solo i comandi LPM / SPM, ma il programmatore seriale non lo sta usando. Per quanto riguarda la disabilitazione della programmazione seriale e jtag, questa è un'altra grande domanda per me. Per aggiornare il bootloader (occasionalmente) inserirò l'intestazione dell'interfaccia di programmazione HV. Ma qualcuno può usare il programmatore HV per leggere il flash? So che il programmatore HV può cancellare i chip anche se ISP / Jtag sono disabilitati.
Pablo

@pablo, scusa, non intendevo offenderti. Quando ho visto la tua domanda per la prima volta, l'idea del furto non mi è venuta in mente; e ho scritto una risposta incentrata in qualche modo sul recupero del codice bloccato. Tuttavia ero al lavoro e prima di inviare quella risposta ho avuto una pausa di circa 2 ore. Poi quando sono tornato, ho notato che non c'era ancora nessuna risposta e sono rimasto un po 'sorpreso, quindi dopo aver riletto la tua domanda ho pensato che il "furto" potesse essere stato il motivo. Non è affatto colpa tua, ora ho rimosso la dichiarazione di non responsabilità. Il modello di processore era necessario a causa delle differenze elencate in quella tabella e perché ci sono AVR a
8/16/32

1
arrGarrett Fogerlie: Non intendevo inserire il programmatore HV, solo l'intestazione :) Ma ho capito che non è necessario perché i bit di blocco hanno funzionato e nel caso in cui posso usare l'intestazione ISP per cancellare il chip e riscrivere tutto il flash sul dispositivo. Quindi per riassumere la risposta alla mia domanda originale: l'impostazione di LB1 e LB2 impedirà a chiunque di leggere l'intera area flash E allo stesso tempo non mi impedirà di scrivere la memoria del programma tramite il bootloader.
Pablo,

3

È possibile utilizzare i bit di blocco su alcuni dispositivi ATMega e aggiornare comunque il codice con il bootloader.

Ho programmato LB1 e LB2 su un ATMega 328. Quindi ho richiamato il bootloader, aggiornato il programma principale - tutto ha funzionato perfettamente.

L'ISP non può né leggere né scrivere flash / eeprom / fusibili ma il bootloader può comunque scrivere la sezione dell'applicazione.

Una cancellazione del chip con l'ISP cancella i bit di blocco (LB1 e LB2), ma cancella anche l'intero flash / eeprom, quindi potresti proteggere il tuo codice (tuttavia devi assicurarti che il tuo bootloader non possa essere hackerato)


3
In che modo migliora la risposta attualmente accettata?
Ignacio Vazquez-Abrams,

Si noti che finché si dispone di un residente bootloader standard in stile Arduino, il blocco della lettura sarà quasi inutile poiché il bootloader stesso ha una capacità di lettura a meno che non si usi la modalità avanzata solo 328P che disabilita il LPM del bootloader nella memoria dell'applicazione. Altrimenti dovresti modificare il bootloader per rimuoverlo, a costo di non poter più verificare la programmazione. (Potresti potenzialmente creare un diverso meccanismo di verifica, ma sarebbe non standard richiedere anche di modificare / sostituire avrdude)
Chris Stratton
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.