14.3.4. Uma nota sobre a proteção de leitura da flash¶
Por predefinição, o firmware de uma OpenMV cam enviada é legível por qualquer pessoa com acesso físico ao dispositivo. Um atacante que tenha a câmara em mãos pode ligar uma sonda SWD ao conector de depuração, comunicar com a interface de depuração do MCU e fazer dump da flash – o que inclui todos os módulos Python congelados e o conteúdo da partição ROMFS. O firmware padrão da OpenMV não ativa a proteção de leitura da flash por predefinição.
Esta página documenta isso explicitamente para que uma equipa a enviar um produto saiba onde recai a responsabilidade.
14.3.4.1. O que a câmara faz por predefinição¶
O bootloader e o runtime da câmara não ativam qualquer funcionalidade de proteção de leitura do MCU subjacente. A interface de depuração permanece aberta, a flash permanece legível e a compilação corre tal como num banco de desenvolvimento. Esse é o padrão correto para o público dos tutoriais – uma câmara que seja enviada com a proteção de leitura ativada é uma câmara que não pode ser reprogramada através do IDE, não pode ser restaurada após uma implementação falhada, e não pode ser recuperada por ninguém além da equipa de compilação.
O compromisso muda quando a câmara passa de «dispositivo de desenvolvimento» para «produto». Um produto cujo valor depende do código da aplicação permanecer privado tem de ativar a proteção por si próprio; o firmware da OpenMV não o faz.
14.3.4.2. O que a equipa de produto faz¶
Todos os fornecedores de MCU oferecem um mecanismo de proteção de leitura. Os detalhes diferem – fusíveis ao nível de bits, transições de ciclo de vida de uso único, imagens de flash assinadas – mas a forma comum é:
Um bit específico do fornecedor (ou conjunto de bits) é gravado no silício, normalmente através de uma ferramenta do fornecedor que comunica com a porta de depuração do MCU pela última vez.
Após a gravação, a porta de depuração recusa a leitura da flash. A câmara ainda arranca e executa a aplicação; simplesmente deixa de expor o seu conteúdo a uma sonda.
A gravação é irreversível. Não há forma de colocar a câmara novamente num estado depurável sem a destruir.
A configuração deste processo é específica de cada MCU, e os passos dependem do componente da câmara a ser protegida. O manual de referência do fornecedor é a fonte de verdade; o suporte do fornecedor é o canal para acertar numa linha de produção.
Esta é a parte fácil.
A parte difícil é fechar todos os outros caminhos que um atacante tem para executar código na câmara ou ler o que a aplicação está a fazer. A proteção de leitura apenas impede uma sonda de depuração de fazer dump da flash. A câmara ainda tem de fechar:
O REPL do MicroPython. Um REPL ligado por USB aceita Python arbitrário. A proteção de leitura não altera isso. Uma sessão REPL pode ler a RAM, chamar funções, exfiltrar tudo o que a aplicação em execução consegue ver – na prática, um REPL acessível contorna tudo o que a proteção de leitura oferece. Desativar o acesso ao REPL é uma alteração de compilação de firmware da responsabilidade da equipa de produto.
Carregamento de scripts pelo IDE. O caminho «executar este script na câmara» do IDE utiliza a mesma superfície de protocolo USB que o REPL. Fechar o REPL fecha isto também; deixar qualquer um dos dois aberto deixa um canal de execução arbitrária de código na câmara.
Sequestro do ponto de entrada a partir do sistema de ficheiros. Já fechado quando a aplicação é enviada através de Incorporar scripts no firmware – o runtime resolve os ficheiros
boot.pyemain.pycongelados antes de qualquer cópia do sistema de ficheiros, pelo que nada colocado na flash ou no SD os pode substituir. Esta proteção é gratuita assim que a aplicação está na compilação.Flash externa em câmaras mais recentes. Câmaras que armazenam a imagem da aplicação em flash externa colocam essa imagem num chip visível na PCB; o chip pode ser dessoldado e lido diretamente com ferramentas de prateleira, ou lido no local através de sondagem do barramento. Protegê-lo requer ativar o hardware integrado que desencripta o conteúdo da flash durante as leituras, gerar a chave de encriptação, provisionar essa chave na câmara e gravá-la irreversivelmente no armazenamento de programação única do MCU. Cada uma dessas operações é uma operação de uso único separada, e qualquer uma executada incorretamente numa unidade de produção inutiliza-a.
Cada item desta lista é a sua própria pilha de trabalho de compilação de firmware, passos na linha de produção e gravações irreversíveis. Um produto verdadeiramente bloqueado é uma compilação de firmware personalizada, um bootloader personalizado, um fluxo de produção que provisiona chaves por unidade e um conjunto de testes que provam que o bloqueio está realmente fechado antes de a unidade sair da linha. Isso representa meses de trabalho, não dias, e a irreversibilidade significa que os erros têm custos em unidades.
Por que a predefinição é aberta
Esta lista também explica por que o firmware padrão da OpenMV é enviado sem a proteção de leitura ativada. Uma câmara com o REPL fechado, o carregamento de scripts pelo IDE desativado e o firmware bloqueado é uma câmara em que não se pode desenvolver de todo – o fluxo de trabalho que torna as câmaras OpenMV utilizáveis desapareceria. A predefinição deixa tudo aberto; a equipa de produto escolhe que partes fechar no caminho para uma unidade enviada.
14.3.4.3. O que o acesso físico ainda permite¶
Mesmo com a proteção de leitura ativada, um atacante que segura a câmara pode fazer bastante:
Reproduzir o tráfego de rede da câmara por sniffing das suas saídas.
Observar o seu comportamento visível e inferir como reage às entradas.
Em alguns casos, recuperar segredos através de ataques de injeção de falhas ou de canal lateral especializados contra o MCU protegido.
A proteção de leitura aumenta o custo de aceder ao código-fonte da aplicação. Não elimina esse custo. «Acesso físico = comprometimento» é o pressuposto de trabalho com que uma revisão de segurança deve começar; o mecanismo de proteção apenas decide quanto esse comprometimento custa em tempo e equipamento.
14.3.4.4. O que o firmware da OpenMV inclui por predefinição¶
Um resumo, para que seja concreto:
Nenhuma proteção de leitura ativada por predefinição.
Nenhum indicador de compilação no firmware padrão que a ative.
Nenhuma API ao nível da aplicação para chamar a partir do MicroPython.
Um produto que necessita de proteção é enviado com firmware personalizado. Essa personalização reside no bootloader da placa e no fluxo de produção, e está fora do código base da OpenMV. As equipas que fazem isto pela primeira vez devem planear como um trabalho discreto na linha de tempo de desenvolvimento, e não como algo a acrescentar no final – a irreversibilidade torna «acrescentar mais tarde» dispendioso.