As strings de texto são uma vulnerabilidade no software incorporado?
Por muitos anos, a segurança dos computadores desktop foi uma preocupação. Uma vez que a máquina está conectada à Internet, existe intrinsecamente a possibilidade de algum tipo de ataque. Essas infiltrações podem ser para roubar dados, danificar o sistema ou alterar sua operação de alguma forma. Os meios de proteção são bem conhecidos e amplamente aplicados. Os sistemas embarcados sempre pareceram imunes a esses problemas, já que raramente estavam em rede e seu código normalmente estava em algum tipo de ROM. As coisas mudaram. Uma grande parte dos sistemas modernos está conectada à Internet e é prática comum que o código seja copiado para a RAM e executado a partir daí. Isso significa que a segurança agora é uma consideração importante no design de software embarcado.
A língua inglesa é uma ótima ferramenta de comunicação. É uma linguagem muito expressiva que possibilita a comunicação com grande precisão e sutileza. No entanto, na fala cotidiana, a maioria de nós é preguiçosa e costuma usar palavras sem 100% de precisão. O exemplo que tenho em mente aqui é a forma como segurança e segurança são usados quase indistintamente, como se fossem sinônimos. Acho que a melhor definição que ouvi é mais ou menos assim:segurança é o processo de proteger o mundo do dispositivo; segurança é proteger o dispositivo do mundo. Segurança é o meu tópico de hoje.
Se um sistema realmente precisa ser totalmente à prova de balas, a criptografia de nível industrial é necessária. Isso normalmente requer suporte de hardware específico, que, embora prontamente disponível, pode ser considerado um exagero para um aplicativo onde tal alta segurança não é necessária. Nesses casos, existem outras opções e é isso que gostaria de explorar.
Se um hacker pode obter acesso ao conteúdo da memória de um dispositivo, eles podem começar a descobrir o que faz e como faz. Esta é a primeira etapa para alterar seu funcionamento. O código pode ser desmontado e, portanto, a lógica pode ser revelada. Sem criptografia, pouco pode ser feito para evitar isso. A próxima coisa que o hacker pode fazer é examinar um dump hex / ASCII dos dados e ver o que eles podem encontrar que faça sentido. Eles procuram padrões e estruturas reconhecíveis. É aqui que algumas precauções podem ser tomadas. Embora a criptografia possa não ser uma opção, a 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. Examinando um despejo de memória, uma das coisas fáceis de detectar são as cadeias de texto. Então, é nisso que vou me concentrar aqui.
No código C / C ++, as 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 mudá-lo. 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 ligeiramente embaralhados, para torná-los menos familiares - tudo o que farei é trocar os dois nibbles de cada byte. Preciso ter um programa utilitário no qual alimentaria as strings de texto simples e geraria a declaração de uma matriz com inicialização apropriada. Aqui está a função central deste utilitário:
void scramble (int index, unsigned char * input) {unsigned char * charpointer, character; printf ("string de caracteres sem sinal% d [% d] ={0x% 02x,", índice, strlen (entrada) +1, strlen (entrada)); charpointer =entrada; while (* charpointer) {character =* charpointer ++; caractere =((caractere &0x0f) <<4) | ((personagem &0xf0)>> 4); printf ("0x% 02x", personagem); if (* charpointer) printf (","); } Printf ("}; // \"% s \ "\ n", input);}
Se eu passasse a esta função um índice de 4 e uma string “Hello world” (original eh?), A saída seria:
string4 sem sinal [12] ={0x0b, 0x84, 0x56, 0xc6, 0xc6, 0xf6, 0x02, 0x77, 0xf6, 0x27, 0xc6, 0x46}; // "Olá, mundo"
Posso copiar e colar isso no meu código, então tudo que preciso fazer é escrever uma função para decodificar o texto quando eu precisar exibi-lo. Em vez de dar a cada string um número de índice, eu poderia dar a ela um nome arbitrário substituindo o índice parâmetro com uma string. Observe que o código gerado é um tanto autodocumentado, já que o comentário mostra a string em um formato legível, mas, é claro, isso só aparece no código-fonte. Se o hacker tiver acesso ao seu código-fonte, você está com problemas suficientes que não posso ajudar mais!
Aqui está um código para ilustrar o processo de desembaralhamento:
void main () {unsigned char temp, buffer [50]; contagem interna =string4 [0], índice =0; while (contagem--) {temp =string4 [índice + 1]; temp =((temp &0x0f) <<4) | ((temp &0xf0)>> 4); buffer [índice] =temp; index ++; } Buffer [índice] =0; printf ("-% s- \ n", buffer);}
A troca de nibbles em cada byte é uma das muitas maneiras diferentes de fazer o embaralhamento. Outra possibilidade é, digamos, girar para a esquerda cada caractere em três bits. Aqui está um 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 em vez disso. Por exemplo, trate a string como uma longa sequência de bits e gire-a um número arbitrário para a esquerda. Vou deixar a codificação desse algoritmo para o leitor mais entusiasmado.
É importante notar que um efeito colateral da localização de todas as strings de texto é que fazer versões diferentes do software para outros idiomas é bastante simples.
Devo reiterar e enfatizar que a ofuscação de dados está longe de ser à prova de balas e, na melhor das hipóteses, retardará o hacker sério. Se nada mais, o código de desembaralhamento poderia ser desmontado. O truque com essa técnica é tornar a ofuscação uma trilha difícil de seguir. Se você realmente precisa de mais segurança, deve considerar a criptografia completa.
Integrado
- Piano
- Função de sistemas incorporados em automóveis
- Noções básicas de sistema incorporado e aplicativos
- 10 Recursos de um software de fluxo de trabalho de impressão 3D que são verdadeiramente essenciais
- Arquitetura SOAFEE para borda incorporada permite carros definidos por software
- Usando DevOps para enfrentar desafios de software incorporado
- Os robôs estão se aproximando de sua fábrica?
- O software embarcado está mudando a natureza das cadeias de suprimentos de hardware
- Quais são os benefícios da interconexão de software para a fábrica inteligente?
- Por que as instituições religiosas estão implementando um software de gerenciamento de instalações