Postado por rakf

Como parte do verão do Hack 2019 na Digital Security, lidei com um ataque de energia e trabalhei com o ChipWhisperer.
O que é isso
A análise de energia é um tipo de ataque através de canais de terceiros. Ou seja, ataques que usam informações que aparecem como resultado da implementação física do sistema.
Quais informações podem ser úteis para um invasor:
- tempo de conversão criptográfica;
- consumo de energia;
- campos eletromagnéticos;
- barulho etc.
Um ataque de energia é considerado o mais universal.
Por que isso funciona?
Microprocessadores, microcontroladores, RAM e muitos outros circuitos lógicos são baseados na tecnologia CMOS. O consumo de energia dos circuitos CMOS consiste em dois componentes: estático e dinâmico. O consumo de energia estática é muito pequeno, o que é uma das razões da monopolização da tecnologia. A potência dinâmica é devida à comutação de transistores e depende dos dados processados e das operações executadas. Como o componente estático é principalmente constante, a mudança na potência total é devida exclusivamente à energia dinâmica e, portanto, o consumo total de energia pode ser usado para análise.
Toolkit
ChipWhisperer , usei a versão em duas partes:

O ChipWhisperer é um kit de ferramentas de código aberto para pesquisar a segurança de dispositivos incorporados. Permite análise de energia e ataques baseados em erros.
A taxa vai custar US $ 250. Os desenvolvedores a posicionam como uma solução revolucionária, porque esses complexos, segundo os criadores, custam US $ 30 mil. O dispositivo consiste em 2 placas: placa de captura e alvo.
Existem outras versões, com suas vantagens (mas também com um grande custo), você também pode comprar separadamente várias placas de destino, placas de expansão, sondar para uma análise completa de seus dispositivos e usar o ChipWhisperer apenas para remoção.
O ChipWhisperer possui um wiki excelente, pequenos laboratórios de desenvolvimento e, na 5ª versão, eles até fizeram uma boa documentação da API. As faixas são removidas do dispositivo conectado usando seu software e gravadas como uma matriz NumPy.
Primeiro você precisa escrever o firmware para o dispositivo de destino. Como parte do laboratório, as cifras AES, DES, TEA são consideradas. Para eles, já existem firmware e configurações prontos para remover rastreamentos (o número de amostras a serem coletadas, deslocamento, frequência ADC, etc.). Para pesquisas independentes, as configurações deverão ser selecionadas experimentalmente.
Como mencionado acima, você pode provocar uma falha no quadro de destino: causando um mau funcionamento do sinal do relógio, pular instruções e extrair informações secretas.
Em grandes complexos, um osciloscópio é usado para rastrear trilhas.
Análise
Existem vários métodos básicos de análise:
- análise simples de energia (SPA);
- análise de potência diferencial (DPA);
- análise de correlação de potência (CPA).
Uma simples análise de potência inclui uma análise visual do gráfico de potência. Por exemplo, uma senha pode ser obtida com um caractere de cada vez, observando o perfil de potência quando o caractere correto é inserido e comparando com o errado.

Ou você pode ver as rodadas de criptografia nas faixas. Não há dados suficientes para obter uma chave, mas pode-se assumir qual algoritmo é executado. A figura mostra claramente 10 rodadas de AES.

A análise diferencial (DPA) é muito mais eficiente do que a análise simples, baseada em métodos de análise estatística para detectar diferenças nos traços de energia. Uma ferramenta muito eficaz, no entanto, para "abrir" a chave exigirá um grande número de rotas. Não usei esse método para análise, mas no final darei alguns links para fontes onde é bem descrito.
A base da análise de correlação é um aparato estatístico para determinar a chave de criptografia secreta. Às vezes, é isolado em um tipo separado, às vezes chamado de DPA. Este método requer menos traços do que o DPA, usei-o para análise de energia. Vou lhe contar mais sobre isso.
A principal tarefa é construir um modelo preciso de consumo de energia do dispositivo em estudo. Se um modelo preciso for construído, há uma correlação perceptível entre o valor previsto e o real.
Um dos modelos de potência que pode ser usado é o modelo de peso de Hamming. O peso de Hamming é o número de valores diferentes de zero na representação binária. A suposição deste modelo é que o número de bits definido no registro se correlacionará com a energia consumida pelo dispositivo. O próprio peso de Hamming é usado posteriormente como uma unidade convencional de energia. O modelo de distância de Hamming também é usado - o número de bits diferentes em 2 valores.
Para comparar o modelo de peso de Hamming e o consumo real de energia, é usado um coeficiente linear de Pearson. Mostra a dependência linear de uma quantidade em outra. Com um modelo construído corretamente, esse coeficiente tenderá a 1.
O algoritmo de CPA generalizado consiste nas seguintes etapas principais:
- remova o consumo de energia ao converter mensagens em uma chave desconhecida;
- construímos um modelo de consumo de energia do chip ao converter as mesmas mensagens em todas as variantes possíveis do sub-bloco de chaves (256 opções para cada byte);
- encontramos o coeficiente de correlação linear para o consumo de energia simulado e real. No caso de uma chave verdadeira, o coeficiente tenderá a 1;
- o algoritmo é repetido para os sub-blocos de chaves restantes.
Como resultado, a chave é restaurada sequencialmente, em pequenas partes. Se atacarmos um byte da chave de cada vez, usaremos 2 8 tentativas para cada chave. Por exemplo, se você escolher AES - 128, o número total de tentativas para 16 bytes da chave será 2 12 , o que é muito melhor do que pressionar 2 128 .
Análise de Cifras de Magma
Magma é um código definido no GOST R 34.12-2015, na verdade o mesmo GOST 28147-89, apenas no perfil. O bloco criptografado passa por 32 rodadas nas quais ocorrem algumas transformações. A chave consiste em 256 bits, cada tecla redonda faz parte do original.

Analisaremos os dados obtidos usando o método CPA.
Primeiro, você precisa escolher um valor intermediário do algoritmo, que depende dos dados conhecidos e de uma pequena parte da chave e pode ser calculado por transformações simples. Normalmente, esse valor é a saída da caixa S (o Magma agora possui 1 tabela de substituição, portanto, é mais fácil realizar esses ataques) do primeiro (textos abertos são conhecidos) ou da última rodada (textos cifrados são conhecidos).
Eu pesquisei uma chave com textos abertos bem conhecidos, portanto essa opção será considerada mais adiante. No algoritmo Magma, ao contrário do DES, AES, a adição de um bloco de 32 bits com uma chave redonda ocorre no módulo 2 32 , portanto, é melhor iniciar a análise a partir das últimas saídas S-box, pois a adição dos valores mais altos não afeta os mais novos. Consideramos a saída de cada caixa S: primeiro 8, depois 8, 7 e assim sucessivamente até o primeiro. A remoção da faixa foi realizada em um microcontrolador de 8 bits e podemos assumir que funcionou com duas caixas S. Portanto, atacarei imediatamente por 1 byte.
Cálculo do modelo de energia para o último byte chave:
for kguess in range(0, 256):
onde a função de vazamento simplesmente retorna a saída S-box do último byte.
Calculamos o coeficiente linear de Pearson para os valores simulados e reais de acordo com a fórmula:

cpaoutput = [0]*256 maxcpa = [0]*256
Ao escolher uma subchave verdadeira, o coeficiente de correlação terá um aumento significativo:

Assim, cada byte da chave redonda é analisado.
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 a chave da primeira rodada, podemos calcular as 2 e as chaves da rodada subsequentes da mesma maneira. Uma chave Magma completa pode ser obtida retirando 8 teclas redondas.
No processo de solução desse problema, várias nuances surgem. Ao contrário de AES, DES, cifras Grasshopper, a adição de uma chave redonda em texto simples ocorre no módulo 2 32 . A adição de bits baixos afeta o alto, ao contrário do XORa. Ao calcular cada subchave subseqüente, você deve considerar os resultados do passado. Da mesma forma com as teclas redondas. Os dados são muito sensíveis. Se um dos valores for calculado incorretamente, o cálculo adicional da chave inteira estará incorreto.
Também vale a pena considerar que agora é bastante difícil encontrar um chip com arquitetura de quatro bits: a maioria dos chips possui oito bits. Obviamente, existem chips criptográficos especializados, projetados para um algoritmo de conversão de segurança específico (ou vários algoritmos) e com a arquitetura mais eficiente.
Para executar a cifra DES, esse criptoprocessador pode ter uma arquitetura de seis bits para o Magma - uma de quatro bits, que permite que cada caixa S seja processada separadamente. Meu dispositivo de destino é de 8 bits e, no caso de "Magma", a conversão será realizada em oito bits em uma abordagem, ou seja, a substituição ocorrerá na caixa 2 S, o consumo de energia será considerado na caixa 2 S. Se uma das caixas S, sênior ou junior, corresponder à chave verdadeira e a outra não corresponder, poderão ocorrer altas explosões de correlação.
Diante de tudo isso, na saída, temos o seguinte script para a análise dos caminhos de consumo de energia para a cifra Magma:
Script 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):
Repositório de Resultados do GitHub
Conclusões
Como parte do estudo, trabalhei com o ChipWhisperer. Apesar de não ter experimentado todas as ferramentas (por exemplo, falhas), definitivamente considero o ChipWhisperer útil, especialmente se você não deseja comprar hardware especial caro.
Quanto à análise de nossa cifra para consumo de energia, ela é mais resistente a esse ataque do que as cifras descritas acima, mas com dados suficientes, a chave pode ser obtida sem problemas.
Materiais interessantes: