¿Son las cadenas de texto una vulnerabilidad en el software integrado?
Durante muchos años, la seguridad de las computadoras de escritorio ha sido una preocupación. Una vez que una máquina está conectada a Internet, existe intrínsecamente la posibilidad de algún tipo de ataque. Tales infiltraciones pueden ser para robar datos, dañar el sistema o cambiar su funcionamiento de alguna manera. Los medios de protección son bien conocidos y se aplican ampliamente. Los sistemas integrados siempre parecían ser inmunes a estos problemas, ya que rara vez estaban conectados en red y su código estaba normalmente en ROM de algún tipo. Las cosas han cambiado. Una gran proporción de los sistemas modernos están conectados a Internet y es una práctica común que el código se copie en la RAM y se ejecute desde allí. Esto significa que la seguridad es ahora una consideración importante en el diseño del software integrado.
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 perezosos y usamos palabras sin una precisión del 100%. El ejemplo que tengo en mente aquí es la forma en que seguridad y seguridad se utilizan casi indistintamente, como si fueran sinónimos. Creo que la mejor definición que he escuchado es algo como esto:la seguridad es el proceso de proteger al mundo del dispositivo; la seguridad es proteger el dispositivo del mundo. La seguridad es mi tema de hoy.
Si un sistema realmente necesita ser totalmente a prueba de balas, se requiere un cifrado de grado industrial. Esto normalmente requiere soporte de hardware específico, que, si bien está disponible, podría considerarse excesivo para una aplicación en la que no es necesaria una seguridad tan alta. En tales casos, hay otras opciones y eso es lo que me gustaría explorar.
Si un pirata informático puede obtener acceso al contenido de la memoria de un dispositivo, puede comenzar a descubrir qué hace y cómo lo hace. Esta es la primera etapa en la alteración de su funcionamiento. El código se puede desmontar y, por lo tanto, se puede revelar la lógica. Sin cifrado, es poco lo que se puede hacer para evitarlo. Lo siguiente que podría hacer el pirata informático es mirar un volcado hexadecimal / ASCII de los datos y ver qué pueden encontrar allí que tengan sentido. Buscan patrones y estructuras reconocibles. Aquí es donde se pueden tomar algunas precauciones. Si bien el cifrado puede no ser una opción, la ofuscación es una posibilidad.
El objetivo de la ofuscación de datos es retrasar o disuadir al pirata informático simplemente haciendo que los datos sean menos reconocibles por lo que son. Al escanear un volcado de memoria, una de las cosas fáciles de detectar son las cadenas de texto. Entonces, esto es en lo que me enfocaré aquí.
En el código C / C ++, las cadenas de texto normalmente son solo 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 codificados ligeramente, para que se vean menos familiares; todo lo que haré es intercambiar los dos nibbles de cada byte. Necesito tener un programa de utilidad en el que alimentaría las cadenas de texto sin formato y genera la declaración para una matriz con la inicialización adecuada. Aquí está la función en el corazón de esta utilidad:
void scramble (int index, unsigned char * input) {unsigned char * charpointer, character; printf ("cadena de caracteres sin firmar% d [% d] ={0x% 02x,", index, strlen (input) +1, strlen (input)); charpointer =entrada; while (* charpointer) {carácter =* charpointer ++; carácter =((carácter &0x0f) <<4) | ((carácter &0xf0)>> 4); printf ("0x% 02x", carácter); if (* charpointer) printf (","); } Printf ("}; // \"% s \ "\ n", entrada);}
Si le pasara a esta función un índice de 4 y una cadena "Hola mundo" (¿original eh?), La salida sería:
unsigned char string4 [12] ={0x0b, 0x84, 0x56, 0xc6, 0xc6, 0xf6, 0x02, 0x77, 0xf6, 0x27, 0xc6, 0x46}; // "Hola mundo"
Puedo copiar y pegar esto en mi código, luego todo lo que necesito hacer es escribir una función para descifrar el texto cuando necesito mostrarlo. En lugar de darle a cada cadena un número de índice, podría darle un nombre arbitrario reemplazando el índice parámetro con una cadena. Tenga en cuenta que el código generado es algo autodocumentado, ya que el comentario muestra la cadena en una forma legible, pero, por supuesto, esto solo aparece en el código fuente. Si el pirata informático tiene acceso a tu código fuente, entonces estás en suficientes problemas y no puedo ayudarte más.
Aquí hay un código para ilustrar el proceso de descifrado:
void main () {temperatura de carácter sin firmar, búfer [50]; int count =string4 [0], index =0; while (cuenta--) {temp =cadena4 [índice + 1]; temp =((temp &0x0f) <<4) | ((temp &0xf0)>> 4); búfer [índice] =temp; índice ++; } Búfer [índice] =0; printf ("-% s- \ n", búfer);}
El intercambio de nibbles en cada byte es una de las muchas formas diferentes en que se puede realizar la codificación. Otra posibilidad es, por ejemplo, rotar a la izquierda cada carácter tres bits. Aquí hay un código para hacer precisamente eso:
carácter sin firmar leftrotate3 (carácter c sin signo) {c =(c <<3) | (c>> 5); return c;}
Las técnicas de ofuscación que he esbozado mezclan la cadena carácter por carácter. En su lugar, sería posible hacer cosas con toda la cadena. Por ejemplo, trate la cadena como una secuencia larga de bits y gírela un número arbitrario hacia la izquierda. Dejaré la codificación de este algoritmo al lector más entusiasta.
Vale la pena señalar que un efecto secundario de localizar todas las cadenas de texto es que crear diferentes versiones del software para otros idiomas es bastante sencillo.
Debo reiterar y enfatizar que la ofuscación de datos está lejos de ser una prueba de balas y, en el mejor de los casos, ralentizará al pirata informático serio. Al menos, el código de descifrado podría desmontarse. El truco con esta técnica es hacer que la ofuscación sea un camino difícil de seguir. Si necesita una seguridad realmente mayor, debe buscar el cifrado completo.
Incrustado
- Piano
- Rol de los sistemas integrados en automóviles
- Conceptos básicos del sistema integrado y las aplicaciones
- 10 características de un software de flujo de trabajo de impresión 3D que son realmente esenciales
- Por qué la impresión 3D y el software son cruciales para la transformación digital
- La arquitectura SOAFEE para edge embebido permite automóviles definidos por software
- Uso de DevOps para abordar los desafíos del software integrado
- ¿Se están acercando los robots a su fábrica?
- El software integrado está cambiando la naturaleza de las cadenas de suministro de hardware
- ¿Cuáles son los beneficios de la interconexión de software para la fábrica inteligente?
- Por qué las instituciones religiosas están implementando un software de administración de instalaciones