Protegendo o flash AVR da leitura através do ISP?

15

Estou tentando proteger o flash inteiro da leitura no ISP. Possui bootloader, capaz de auto-programar a seção de aplicativos.

Configurando o byte de bloqueio para:

LB1/LB2 não permitirá que o usuário use o gerenciador de inicialização para fazer upload de novo firmware.

BLB12/BLB11e BLB01&BLB02não impedirá a leitura do flash através do ISP, se não me engano.

Portanto, não há como permitir que o usuário atualize o firmware pelo gerenciador de inicialização personalizado e proteja o flash da leitura ao mesmo tempo?

Pablo
fonte

Respostas:

18

Você não especificou um chip, o seguinte é voltado principalmente para os dispositivos atmega de 8 bits, mas são informações gerais. Leia a seção 'Programação de memória' para obter a folha de dados de seu chip específico para obter informações mais específicas!

Dito isto, e como você disse, todos os dispositivos AVR contêm dois bits de bloqueio denominados LB1 e LB2. A programação destes (a 0, baixo) adicionará proteção ao conteúdo gravado nas memórias Flash e EEPROM, de acordo com a tabela abaixo. O nível de proteção é dividido em três modos, onde o modo 1 não oferece proteção e o modo 3 oferece proteção máxima. É possível mudar para um modo de proteção mais alto simplesmente reprogramando os bits de bloqueio.

O AVR permite alterar os bits "altos" para "baixos", mas não o contrário. Não é possível alterar um bit de trava "baixo" para "alto", portanto, não é possível diminuir o nível de proteção. Para limpar os bits de bloqueio, é necessário apagar um chip completo, o que apaga a memória Flash.

Tabela de bits de bloqueio AVR

Esses 2 bits de bloqueio sozinhos (LB1 e LB2) quando baixos impedirão que 99,9% das pessoas roubem seu firmware! Provavelmente mais de 99,9%. Quase sempre seria mais fácil fazer engenharia reversa do seu código.

Portanto, não há como permitir que o usuário atualize o firmware pelo gerenciador de inicialização personalizado e proteja o flash da leitura ao mesmo tempo?

De acordo com o meu conhecimento (eu poderia estar enganado, mas acho que já teria tido um problema com isso antes) em dispositivos com fusíveis de proteção do carregador de inicialização (BLB12 e BLB11), você pode bloquear sua seção do carregador de inicialização personalizado , desativar a SPI e ser protegido de 97-98% das pessoas.

No entanto, quando nenhum dos bits de bloqueio está programado, não há recursos de bloqueio de memória ativados !!! A desativação do ISP é suficiente para bloquear 70% das pessoas.

Para obter mais informações, os bits e os fusíveis de bloqueio não estão localizados no flash normal ou no espaço EEPROM, nem são acessíveis a partir do software, exceto os bits de bloqueio relacionados ao carregador de inicialização em dispositivos com o recurso de auto-programação. A tabela 2 nesta nota do aplicativo o ajudará a identificar o que você pode fazer pelo seu dispositivo em particular!

A linha AVR da Atmel não é um dispositivo de alta segurança (a menos que seja explicitamente indicado!) E, como tal, eles absolutamente não vêm com nenhuma garantia de segurança de código, nem deveriam! Como todos os dispositivos não seguros (e infelizmente alguns seguros), eles são propensos a ataques comuns!


Editar

Vou colocar o cabeçalho da interface de programação HV a bordo. Mas alguém pode usar o programador HV para ler o flash? Eu sei que o programador HV pode apagar o chip, mesmo o ISP / Jtag está desativado.

Não acho que você deva incluir o programador de alta tensão no design de sua placa, a menos que seja absolutamente necessário e saiba com certeza que isso não causará problemas com nada. Os programadores de alta tensão (sinais de 12 volts) estão disponíveis apenas como medida de segurança para programar chips bloqueados (principalmente bloqueados por erro). Em teoria, isso serve apenas para programar o dispositivo para não ler nada. E nunca ouvi falar de uma façanha que permitisse a leitura.

Para atualizar o carregador de inicialização (ocasionalmente), colocarei o cabeçalho da interface de programação HV a bordo. Mas alguém pode usar o programador HV para ler o flash? Eu sei que o programador HV pode apagar o chip, mesmo o ISP / Jtag está desativado.

Eu acho que pode haver uma maneira de atualizar o flash bloqueado através do carregador de inicialização (algo a ver com um sinalizador interno de gravação e / ou ISR, talvez ???). Não poderei fazer isso por ~ 20 horas; por isso, recomendo fazer uma nova pergunta focada apenas nisso e no processador que você mencionou. É uma pergunta muito boa !

Garrett Fogerlie
fonte
+1 no último comentário, se tudo mais falhar, qualquer sujeito pode simplesmente dessoldar o chip e colocá-lo em um depurador / programador AVR para redefinir os bits de bloqueio e sua segurança desapareceu.
helloworld922
@ Garrett Fogerlie: não tenho certeza do que o leva a pensar que estou tentando roubar o código, por favor, deixe-me saber e vou corrigir minha pergunta para que outros não pensem da mesma maneira. Estou tentando dar proteção mínima ao meu próprio código, meu próprio gerenciador de inicialização. Enfim, mais algumas perguntas sobre isso. O chip é ATMega328, pensou que a família terá uso comum de bit de bloqueio. Você explicou LB1e LB2, que também descrevi na minha pergunta como opção limitadora para usar o gerenciador de inicialização para fins de atualização. Portanto, não é uma opção. Quanto BLB12e BLB11- é isso que eu não entendo. (a ser continuado)
Pablo
Definir esses bits NÃO impedirá que alguém leia o flash (aplicativo + carregador de inicialização) de fora. A partir da folha de dados, parece que esses bits apenas bloquearão os comandos LPM / SPM, mas o programador serial não o está usando. Quanto à desativação da programação serial e da jtag, essa é outra grande questão para mim. Para atualizar o carregador de inicialização (ocasionalmente), colocarei o cabeçalho da interface de programação HV a bordo. Mas alguém pode usar o programador HV para ler o flash? Eu sei que o programador HV pode apagar o chip, mesmo o ISP / Jtag está desativado.
Pablo
@ Pablo, desculpe, eu não quis ofender. Quando vi sua pergunta pela primeira vez, a ideia do roubo não me ocorreu; e escrevi uma resposta focada na recuperação de código bloqueado. No entanto, eu estava no trabalho e, antes de enviar essa resposta, tive uma pausa de ~ 2 horas. Então, quando voltei, notei que ainda não havia resposta e fiquei um pouco surpreso; depois de reler sua pergunta, pensei que "roubo" poderia ter sido o motivo. Não é sua culpa, agora removi o aviso. O modelo de processador foi necessária por causa das diferenças listadas na tabela e porque há 8/16/32 bits AVR de ...
Garrett Fogerlie
1
retGarrett Fogerlie: Eu não quis colocar o programador de alta tensão a bordo, apenas o cabeçalho :) Mas eu descobri que não é necessário porque os bits de bloqueio funcionavam e no caso de eu poder usar o cabeçalho do ISP para apagar o chip e reescrever o flash inteiro no dispositivo. Então, para resumir a resposta à minha pergunta original - a configuração de LB1 e LB2 impedirá que alguém leia toda a área do flash E, ao mesmo tempo, não impedirá que eu escreva a memória do programa através do gerenciador de inicialização.
Pablo
3

Você pode usar os bits de bloqueio em alguns dispositivos ATMega e ainda atualizar seu código com o gerenciador de inicialização.

Programei LB1 e LB2 em um ATMega 328. Em seguida, invoquei o gerenciador de inicialização, atualizei o programa principal - tudo funcionou perfeitamente.

O ISP não pode ler nem gravar nenhum flash / eeprom / fusíveis, mas o gerenciador de inicialização ainda pode gravar a seção do aplicativo.

Um apagamento de chip com o ISP limpa os bits de bloqueio (LB1 e LB2), mas também apaga todo o flash / eeprom, assim você pode proteger seu código (no entanto, você deve garantir que seu gerenciador de inicialização não possa ser invadido)

Gandalf
fonte
3
Como isso melhora a resposta atualmente aceita?
Ignacio Vazquez-Abrams
Observe que, desde que você tenha um residente do carregador de inicialização padrão do estilo Arduino, o bloqueio da leitura seria quase inútil, pois o próprio carregador de inicialização possui um recurso de leitura, a menos que você use o modo somente 328P avançado que desativa o LPM do carregador de inicialização na memória do aplicativo. Caso contrário, você precisará modificar o gerenciador de inicialização para removê-lo, ao custo de não poder mais verificar a programação. (Você poderia criar um mecanismo de verificação diferente, mas seria não-padrão que você precise também modificar / substituir avrdude)
Chris Stratton