Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial Internet of Things >> Integrado

Strings de Texto: Uma Vulnerabilidade Oculta em Software Embarcado

Por muitos anos, a segurança de computadores desktop tem sido uma preocupação. Uma vez que uma máquina está conectada à Internet, existe intrinsecamente a possibilidade de algum tipo de ataque. Tais infiltrações podem ser para roubar dados, danificar o sistema ou alterar sua operação de alguma forma. Meios de proteção são bem conhecidos e amplamente aplicados. Sistemas embarcados sempre pareceram imunes a tais problemas, pois raramente eram conectados em rede, e seu código normalmente estava em ROM de algum tipo. As coisas mudaram. Uma grande proporção de sistemas modernos está conectada à Internet e é prática comum copiar código para RAM e executar a partir daí. Isso significa que segurança agora é uma consideração importante de design de software embarcado.

A língua inglesa é uma ótima ferramenta de comunicação. É uma linguagem muito expressiva que permite comunicação com grande precisão e sutileza. No entanto, na fala cotidiana, a maioria de nós é preguiçosa e frequentemente usa palavras sem 100% de precisão. O exemplo que tenho em mente aqui é a forma que safety e security são usadas quase intercambiavelmente, como se fossem sinônimos. Acho que a melhor definição que já ouvi vai algo assim: safety é o processo de proteger o mundo do dispositivo; security é proteger o dispositivo do mundo. Security é meu tópico para hoje.

Se um sistema realmente precisa ser totalmente à prova de bala, criptografia de grau industrial é necessária. Isso normalmente requer suporte de hardware específico, que, embora prontamente disponível, pode ser considerado overkill para uma aplicação onde tal alta segurança não é necessária. Em tais casos, existem outras opções e é isso que gostaria de explorar.

Se um hacker puder acessar o conteúdo da memória de um dispositivo, ele pode começar a descobrir o que ele faz e como faz. Este é o primeiro estágio para alterar sua operação. Código pode ser desmontado e, portanto, a lógica pode ser revelada. Sem criptografia, há pouco que pode ser feito para prevenir isso. A próxima coisa que o hacker pode fazer é olhar um dump hex/ASCII dos dados e ver o que encontra lá que faz sentido. Eles estão procurando padrões e estruturas reconhecíveis. É aqui que algumas precauções podem ser tomadas. Enquanto criptografia pode não ser uma opção, ofuscação é uma possibilidade.

O objetivo da ofuscação de dados é atrasar ou deter o hacker simplesmente tornando os dados menos reconhecíveis pelo que são. Escaneando um dump de memória, uma das coisas fáceis de detectar são strings de texto. Então, é nisso que vou focar aqui.

Em código C/C++, strings de texto são normalmente apenas sequências de bytes contendo códigos ASCII terminados por um byte nulo. Isso é muito fácil de detectar, então vou mudar isso. Primeiro, em vez do terminador nulo, o primeiro byte de cada string será um especificador de comprimento. Os caracteres da string terão seus dados embaralhados levemente, para torná-los menos familiares — tudo que farei é trocar os dois nibbles de cada byte. Preciso ter um programa utilitário no qual eu alimentaria as strings de texto simples e ele gera a declaração para um array com inicialização apropriada. Aqui está a função no coração deste utilitário:

void scramble(int index, unsigned char *input) { unsigned char *charpointer, character; printf("unsigned char string%d[%d] = {0x%02x,", index, strlen(input)+1, strlen(input)); charpointer = input; while(*charpointer) { character = *charpointer++; character = ((character & 0x0f) << 4) | ((character & 0xf0) >> 4); printf("0x%02x", character); if (*charpointer) printf(","); } printf("}; // \"%s\"\n", input); } 

Se eu passasse para esta função um índice 4 e uma string "Hello world" (original, hein?), a saída seria:

unsigned char string4[12] = {0x0b, 0x84, 0x56, 0xc6, 0xc6, 0xf6, 0x02, 0x77, 0xf6, 0x27, 0xc6, 0x46}; // "Hello world" 

Posso copiar e colar isso no meu código, então tudo que preciso fazer é escrever uma função para desembaralhar o texto quando precisar exibi-lo. Em vez de dar a cada string um número de índice, eu poderia dar um nome arbitrário substituindo o parâmetro index por uma string. Note que o código gerado é auto-documentável, pois o comentário mostra a string em forma legível, mas, claro, isso só aparece no código-fonte. Se o hacker tem acesso ao seu código-fonte, então você está em problemas suficientes que não posso ajudar mais!

Aqui está algum código para ilustrar o processo de desembaralhamento:

void main() { unsigned char temp, buffer[50]; int count = string4[0], index=0; while(count--) { temp = string4[index+1]; temp = ((temp & 0x0f) << 4) | ((temp & 0xf0) >> 4); buffer[index] = temp; index++; } buffer[index] = 0; printf("-%s-\n", buffer); }

A troca de nibbles em cada byte é uma de muitas maneiras diferentes que o embaralhamento pode ser feito. Outra possibilidade é, digamos, rotacionar à esquerda cada caractere em três bits. Aqui está algum código para fazer exatamente isso:

unsigned char leftrotate3(unsigned char c) { c = (c << 3) | (c >> 5); return c; }

As técnicas de ofuscação que descrevi embaralham a string caractere por caractere. Seria possível fazer coisas com a string inteira. Por exemplo, tratar a string como uma longa sequência de bits e rotacioná-la um número arbitrário para a esquerda. Deixarei a codificação deste algoritmo para o leitor mais entusiasmado.

Vale notar que um efeito colateral de localizar todas as strings de texto é que criar versões diferentes do software para outros idiomas é bastante direto.

Devo reiterar e enfatizar que ofuscação de dados está longe de ser à prova de bala e, na melhor das hipóteses, vai atrasar o hacker sério. Se nada mais, o código de desembaralhamento poderia ser desmontado. O truque com esta técnica é tornar a ofuscação uma trilha difícil de seguir. Se você precisa de segurança realmente maior, deve olhar para criptografia completa.


Integrado

  1. O Piano: Das Raízes Antigas à Maestria Moderna
  2. Como Sistemas Embarcados Impulsionam a Inovação em Veículos Modernos
  3. Fundamentos de Sistemas Embarcados e Aplicações no Mundo Real
  4. 10 Recursos Essenciais que Todo Software de Fluxo de Trabalho de Impressão 3D Deve Oferecer
  5. SOAFEE: Arquitetura Cloud-Native Capacitando Plataformas Automotivas Software-Defined
  6. Aproveitando DevOps para Superar Desafios de Software Embarcado
  7. Robôs Transformando Sua Fábrica: O Que Você Precisa Saber
  8. Software Embarcado Remodela Cadeias de Suprimentos de Hardware para Maior Agilidade
  9. Interconexão de Software: Principais Benefícios para Fábricas Inteligentes
  10. Como Software de Gestão de Instalações Beneficia Instituições Religiosas