Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial Internet of Things >> Incrustado

Cadenas de texto: Una vulnerabilidad oculta en el software embebido

Durante muchos años, la seguridad de los ordenadores de sobremesa ha sido una preocupación constante. Una vez que una máquina se conecta a Internet, existe intrínsecamente la posibilidad de algún tipo de ataque. Dichas intrusiones pueden tener como objetivo robar datos, dañar el sistema o alterar su funcionamiento. Los medios de protección son bien conocidos y ampliamente aplicados. Los sistemas embebidos siempre parecieron inmunes a estos problemas, ya que rara vez estaban conectados a red y su código residía normalmente en memoria ROM. Las cosas han cambiado. Una gran proporción de los sistemas modernos están conectados a Internet y es práctica habitual copiar el código en RAM y ejecutarlo desde allí. Esto significa que la seguridad es ahora una consideración importante en el diseño de software embebido.

El idioma inglés es una gran herramienta de comunicación. Es un lenguaje muy expresivo que permite comunicarse con gran precisión y sutileza. Sin embargo, en el habla cotidiana, la mayoría de nosotros somos vagos y a menudo usamos palabras sin una precisión del 100 %. El ejemplo que tengo en mente es la forma en que safety (seguridad funcional) y security (ciberseguridad) se usan casi indistintamente, como si fueran sinónimos. Creo que la mejor definición que he escuchado es algo así: la seguridad funcional es el proceso de proteger el mundo del dispositivo; la ciberseguridad es proteger el dispositivo del mundo. La ciberseguridad es mi tema de hoy.

Si un sistema realmente necesita ser totalmente a prueba de balas, se requiere cifrado de grado industrial. Esto normalmente exige soporte de hardware específico, que, aunque fácilmente disponible, podría considerarse excesivo para una aplicación donde no es necesaria una seguridad tan alta. En esos casos, existen otras opciones y eso es lo que me gustaría explorar.

Si un hacker puede acceder al contenido de la memoria de un dispositivo, puede empezar a averiguar qué hace y cómo lo hace. Esta es la primera etapa para alterar su funcionamiento. El código puede ser desensamblado y, por tanto, se puede revelar la lógica. Sin cifrado, poco se puede hacer para evitarlo. Lo siguiente que podría hacer el hacker es examinar un volcado hexadecimal/ASCII de los datos y ver qué encuentra allí que tenga sentido. Busca patrones y estructuras reconocibles. Aquí es donde se pueden tomar algunas precauciones. Aunque el cifrado no sea una opción, la ofuscación es una posibilidad.

El objetivo de la ofuscación de datos es retrasar o disuadir al hacker simplemente haciendo que los datos sean menos reconocibles. Al escanear un volcado de memoria, una de las cosas fáciles de detectar son las cadenas de texto. Así que me centraré en eso.

En código C/C++, las cadenas de texto son normalmente secuencias de bytes que contienen códigos ASCII terminados por un byte nulo. Eso es muy fácil de detectar, así que lo cambiaré. Primero, en lugar del terminador nulo, el primer byte de cada cadena será un especificador de longitud. Los caracteres de la cadena tendrán sus datos ligeramente alterados, para que parezcan menos familiares; todo lo que haré es intercambiar los dos nibbles de cada byte. Necesito un programa utilitario al que alimentar las cadenas de texto plano y que genere la declaración de un array con la inicialización adecuada. Aquí está la función central de esta utilidad:

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); } 

Si paso a esta función un índice 4 y la cadena "Hello world" (original, ¿eh?), la salida sería:

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

Puedo copiar y pegar esto en mi código, y luego solo necesito escribir una función para desofuscar el texto cuando necesite mostrarlo. En lugar de dar a cada cadena un número de índice, podría darle un nombre arbitrario reemplazando el parámetro index por una cadena. Observa que el código generado es algo auto-documentado, ya que el comentario muestra la cadena en forma legible, pero, por supuesto, esto solo aparece en el código fuente. ¡Si el hacker tiene acceso a tu código fuente, estás en problemas suficientes como para que yo no pueda ayudar más!

Aquí hay algo de código para ilustrar el proceso de desofuscación:

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); }

El intercambio de nibbles en cada byte es una de las muchas formas en que se puede hacer la ofuscación. Otra posibilidad es, por ejemplo, rotar a la izquierda cada carácter en tres bits. Aquí hay código para hacer precisamente eso:

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

Las técnicas de ofuscación que he descrito alteran la cadena carácter por carácter. Sería posible hacer cosas con la cadena completa. Por ejemplo, tratar la cadena como una larga secuencia de bits y rotarla un número arbitrario a la izquierda. Dejaré la codificación de este algoritmo al lector más entusiasta.

Vale la notar que un efecto secundario de localizar todas las cadenas de texto es que crear diferentes versiones del software para otros idiomas resulta bastante sencillo.

Debo reiterar y enfatizar que la ofuscación de datos está lejos de ser a prueba de balas y, en el mejor de los casos, ralentizará al hacker serio. Si nada más, el código de desofuscación podría ser desensamblado. El truco con esta técnica es hacer que la ofuscación sea un rastro difícil de seguir. Si necesitas una seguridad realmente mayor, debes recurrir al cifrado completo.

Incrustado

  1. El Piano: De Raíces Antiguas al Dominio Moderno
  2. 10 características esenciales que todo software de flujo de trabajo de impresión 3D debe ofrecer
  3. Cómo la impresión 3D y el software impulsan la transformación digital en fabricación
  4. Robots transformando tu fábrica: Lo que necesitas saber
  5. El software integrado remodela las cadenas de suministro de hardware para mayor agilidad
  6. Interconexión de Software: Beneficios Clave para Fábricas Inteligentes
  7. Cómo el Software de Gestión de Instalaciones Mejora las Instituciones Religiosas
  8. Cómo los Sistemas Embebidos Impulsan la Innovación en Vehículos Modernos
  9. Fundamentos de Sistemas Embebidos y Aplicaciones del Mundo Real
  10. SOAFEE: Arquitectura Cloud-Native que Potencia Plataformas Automotrices Software-Defined
  11. Aprovechar DevOps para superar los desafíos del software embebido