Publicado por rakf

Como parte del Summer of Hack 2019 en Digital Security, enfrenté un ataque de poder y trabajé con ChipWhisperer.
Que es esto
El análisis de energía es un tipo de ataque a través de canales de terceros. Es decir, ataques que usan información que aparece como resultado de la implementación física del sistema.
Qué información puede ser útil para un atacante:
- tiempo de conversión criptográfica;
- consumo de energía;
- campos electromagneticos;
- ruido etc.
Un ataque de energía se considera el más universal.
Por que funciona
Los microprocesadores, microcontroladores, RAM y muchos otros circuitos lógicos se basan en la tecnología CMOS. El consumo de energía de los circuitos CMOS consta de dos componentes: estático y dinámico. El consumo de energía estática es muy pequeño, lo cual es una de las razones de la monopolización de la tecnología. La potencia dinámica se debe a la conmutación de los transistores y depende de los datos procesados y las operaciones realizadas. Dado que el componente estático es principalmente constante, el cambio en la potencia total se debe exclusivamente a la potencia dinámica y, por lo tanto, el consumo total de energía se puede utilizar para el análisis.
Kit de herramientas
ChipWhisperer , utilicé la versión de 2 partes:

ChipWhisperer es un kit de herramientas de código abierto para investigar la seguridad de los dispositivos integrados. Permite análisis de energía y ataques basados en errores.
La tarifa costará $ 250. Los desarrolladores lo posicionan como una solución revolucionaria, porque tales complejos, según los creadores, cuestan desde $ 30k. El dispositivo consta de 2 tableros: objetivo y tablero de captura.
Hay otras versiones, con sus ventajas (pero también a un gran costo), también puede comprar por separado varias placas de destino, tarjetas de expansión, sondear para un análisis completo de sus dispositivos y usar ChipWhisperer solo para su eliminación.
ChipWhisperer tiene una excelente wiki , pequeños laboratorios de desarrollo, y para la quinta versión incluso hicieron una buena documentación de API. Las pistas se eliminan del dispositivo conectado utilizando su software y se registran como una matriz NumPy.
Primero debe escribir el firmware para el dispositivo de destino. Como parte del laboratorio, se consideran los cifrados AES, DES, TEA. Para ellos, ya hay configuraciones y firmware listos para eliminar rastros (el número de muestras a tomar, compensación, frecuencia de ADC, etc.). Para la investigación independiente, los ajustes deberán seleccionarse experimentalmente.
Como se mencionó anteriormente, puede provocar una falla de la placa de destino: causar un mal funcionamiento de la señal del reloj, omitir instrucciones y extraer información secreta.
En complejos grandes, se utiliza un osciloscopio para rastrear pistas.
Análisis
Existen varios métodos de análisis básicos:
- análisis de potencia simple (SPA);
- análisis de potencia diferencial (DPA);
- análisis de correlación de potencia (CPA).
Un análisis de potencia simple incluye un análisis visual del gráfico de potencia. Por ejemplo, se puede obtener una contraseña de un carácter a la vez observando el perfil de potencia cuando se ingresa el carácter correcto y comparándolo con el incorrecto.

O puede ver las rondas de cifrado en las pistas. No son suficientes datos para obtener una clave, pero se puede suponer qué algoritmo se ejecuta. La figura muestra claramente 10 rondas de AES.

El análisis diferencial (DPA) es mucho más eficiente que el análisis simple, ya que se basa en métodos de análisis estadístico para detectar diferencias en los rastros de potencia. Sin embargo, una herramienta muy efectiva para "abrir" la llave requerirá una gran cantidad de rutas. No utilicé este método para el análisis, pero al final daré algunos enlaces a fuentes donde está bien descrito.
La base del análisis de correlación es un aparato estadístico para determinar la clave secreta de cifrado. A veces se aísla en un tipo separado, a veces denominado DPA. Este método requiere menos trazas que DPA, lo usé para el análisis de potencia. Te contaré más al respecto.
La tarea principal es construir un modelo preciso de consumo de energía del dispositivo en estudio. Si se construye un modelo preciso, hay una correlación notable entre el valor predicho y el real.
Uno de los modelos de potencia que se puede utilizar es el modelo de peso Hamming. El peso de Hamming es el número de valores distintos de cero en la representación binaria. La suposición de este modelo es que el número de bits establecidos en el registro se correlacionará con la energía consumida por el dispositivo. El peso de Hamming en sí se usa en adelante como una unidad convencional de energía. También se usa el modelo de distancia de Hamming: el número de bits diferentes en 2 valores.
Para comparar el modelo de peso de Hamming y el consumo de energía real, se utiliza un coeficiente lineal de Pearson. Muestra la dependencia lineal de una cantidad con otra. Con un modelo construido correctamente, este coeficiente tenderá a 1.
El algoritmo de CPA generalizado consta de los siguientes pasos principales:
- eliminar el consumo de energía al convertir mensajes en una clave desconocida;
- creamos un modelo de consumo de energía del chip al convertir los mismos mensajes en todas las variantes posibles del subbloque clave (256 opciones para cada byte);
- Encontramos el coeficiente de correlación lineal para el consumo de energía simulado y real. En el caso de una clave verdadera, el coeficiente tenderá a 1;
- el algoritmo se repite para los subbloques clave restantes.
Como resultado, la clave se restaura secuencialmente, en partes pequeñas. Si atacamos un byte de la clave a la vez, entonces usamos 2 8 intentos para cada clave. Por ejemplo, si elige AES - 128, entonces el número total de intentos para 16 bytes de la clave será 2 12 , que es mucho mejor que presionar 2 128 .
Análisis de cifrado de magma
Magma es un código que se define en GOST R 34.12-2015, de hecho, el mismo GOST 28147-89, solo de perfil. El bloque encriptado pasa por 32 rondas en las cuales ocurren algunas transformaciones. La clave consta de 256 bits, cada clave redonda es parte del original.

Analizaremos los datos obtenidos utilizando el método de CPA.
Primero, debe elegir un valor intermedio del algoritmo, que depende de los datos conocidos y una pequeña parte de la clave y puede calcularse mediante transformaciones simples. Por lo general, este valor es la salida de S-box (Magma ahora tiene 1 tabla de sustitución, por lo que es más fácil llevar a cabo tales ataques) de la primera (se conocen textos abiertos) o la última ronda (se conocen los textos cifrados).
Investigué una clave con textos abiertos bien conocidos, por lo tanto, esta opción se considerará más a fondo. En el algoritmo Magma, a diferencia de DES, AES, la adición de un bloque de 32 bits con una clave redonda se produce en el módulo 2 32 , por lo tanto, es mejor comenzar el análisis desde las últimas salidas de S-box, ya que agregar los valores más altos no afecta a los más jóvenes. Consideramos la salida de cada S-box: primero 8, luego 8, 7 y así sucesivamente hasta el primero. La eliminación de pistas se realizó en un microcontrolador de 8 bits, y podemos suponer que funcionó con cajas S dobles. Por lo tanto, atacaré inmediatamente por 1 byte.
Cálculo del modelo de energía para el último byte clave:
for kguess in range(0, 256):
donde la función de fuga simplemente devuelve la salida de S-box del último byte.
Calculamos el coeficiente lineal de Pearson para los valores simulados y reales de acuerdo con la fórmula:

cpaoutput = [0]*256 maxcpa = [0]*256
Al elegir una subclave verdadera, el coeficiente de correlación tendrá un aumento significativo:

Por lo tanto, se analiza cada byte de la tecla redonda.
for bnum in range(0, 4): cpaoutput = [0]*256 maxcpa = [0]*256 for kguess in range(0, 256): best_round_key = kguess << (bnum * 8) | best_round ...
Dada la tecla de la primera ronda, podemos calcular las teclas redondas 2 y posteriores de la misma manera. Se puede obtener una llave Magma completa sacando 8 llaves redondas.
En el proceso de resolver este problema, surgen varios matices. A diferencia de los cifrados AES, DES, Grasshopper, la adición de una clave redonda de texto sin formato se produce en el módulo 2 32 . La adición de bits bajos afecta a los altos, a diferencia de XORa. Al calcular cada subclave posterior, debe tener en cuenta los resultados del pasado. Del mismo modo con llaves redondas. Los datos son muy sensibles. Si uno de los valores se calcula incorrectamente, el cálculo adicional de la clave completa será incorrecto.
También vale la pena considerar que ahora es bastante difícil encontrar un chip que tenga una arquitectura de cuatro bits: la mayoría de los chips tienen ocho bits. Por supuesto, hay chips criptográficos especializados que están diseñados para un algoritmo de conversión de seguridad específico (o varios algoritmos) y tienen la arquitectura más eficiente.
Para ejecutar el cifrado DES, dicho criptoprocesador puede tener una arquitectura de seis bits, para Magma, una de cuatro bits, que permite que cada S-box se procese por separado. Mi dispositivo objetivo es de 8 bits, y en el caso de "Magma", la conversión se realizará en ocho bits en un enfoque, es decir. el reemplazo se realizará en 2 S-box, se considerará el consumo de energía para 2 S-box. Si una de las cajas S, senior o junior, coincide con la clave verdadera y la otra no coincide, pueden producirse ráfagas de alta correlación.
Dado todo lo anterior, en la salida tenemos el siguiente script para el análisis de las rutas de consumo de energía para el cifrado Magma:
Script de Python import numpy as np path = r'C:\Users\user\chipwhisperer\projects\gost_10000_2_data\traces\2019.08.11-19.53.25_' traces = np.load(path + 'traces.npy') text = np.load(path + 'textin.npy') keys = np.load(path + 'keylist.npy') HW = [bin(n).count("1") for n in range(0,256)] SBOXES = {"Gost28147_tc26_ParamZ": ( (12, 4, 6, 2, 10, 5, 11, 9, 14, 8, 13, 7, 0, 3, 15, 1), (6, 8, 2, 3, 9, 10, 5, 12, 1, 14, 4, 7, 11, 13, 0, 15), (11, 3, 5, 8, 2, 15, 10, 13, 14, 1, 7, 4, 12, 9, 6, 0), (12, 8, 2, 1, 13, 4, 15, 6, 7, 0, 10, 5, 3, 14, 9, 11), (7, 15, 5, 10, 8, 1, 6, 13, 0, 9, 3, 14, 11, 4, 2, 12), (5, 13, 15, 6, 9, 2, 12, 10, 11, 7, 8, 1, 4, 3, 14, 0), (8, 14, 2, 5, 6, 9, 1, 12, 15, 4, 11, 0, 13, 10, 3, 7), (1, 7, 14, 13, 0, 5, 8, 3, 4, 15, 10, 6, 9, 12, 11, 2), )} def _K(s, _in): """ S-box substitution :param s: S-box :param _in: 32-bit word :returns: substituted 32-bit word """ return ( (s[0][(_in >> 0) & 0x0F] << 0) + (s[1][(_in >> 4) & 0x0F] << 4) + (s[2][(_in >> 8) & 0x0F] << 8) + (s[3][(_in >> 12) & 0x0F] << 12) + (s[4][(_in >> 16) & 0x0F] << 16) + (s[5][(_in >> 20) & 0x0F] << 20) + (s[6][(_in >> 24) & 0x0F] << 24) + (s[7][(_in >> 28) & 0x0F] << 28) ) def block2ns(data): """ Convert block to N1 and N2 integers """ data = bytearray(data) return ( data[7] | data[6] << 8 | data[5] << 16 | data[4] << 24, data[3] | data[2] << 8 | data[1] << 16 | data[0] << 24, ) def addmod(x, y, mod=2 ** 32): """ Modulo adding of two integers """ r = x + int(y) return r if r < mod else r - mod def _shift11(x): """ 11-bit cyclic shift """ return ((x << 11) & (2 ** 32 - 1)) | ((x >> (32 - 11)) & (2 ** 32 - 1)) def round(sbox, key, data, byte): s = SBOXES[sbox] _in = addmod(data, key) sbox_leak = _K(s, _in); return (sbox_leak >> (8 * byte)) & 0xFF def Feistel(sbox, key, data, nround): s = SBOXES[sbox] w = bytearray(key) x = [ w[3 + i * 4] | w[2 + i * 4] << 8 | w[1 + i * 4] << 16 | w[0 + i * 4] << 24 for i in range(8) ] n1, n2 = block2ns(data) for i in range(nround): n1, n2 = _shift11(_K(s, addmod(n1, x[i]))) ^ n2, n1 return n1 numtraces = len(traces) numpoint = np.shape(traces)[1] bestguess = [0]*32 round_data = [0] * numtraces for i in range(numtraces): round_data[i] = [0] * 8 for rnum in range(0, 8): best_round = 0 for tnum_r in range(numtraces): round_data[tnum_r][rnum] = Feistel("Gost28147_tc26_ParamZ", bestguess, text[tnum_r], rnum) for bnum in range(0, 4): cpaoutput = [0]*256 maxcpa = [0]*256 for kguess in range(0, 256):
Repositorio de resultados de GitHub
Conclusiones
Como parte del estudio, trabajé con ChipWhisperer. A pesar de que no probé todas las herramientas (por ejemplo, fallas técnicas), definitivamente encuentro útil ChipWhisperer, especialmente si no desea comprar hardware especial costoso.
En cuanto al análisis de nuestro cifrado para consumo de energía, es más resistente a este ataque que los cifrados descritos anteriormente, pero con suficientes datos, la clave se puede obtener sin problemas.
Materiales interesantes: