< Return to Video

ataques de tempo na verificação de MAC (9 min)

  • 0:00 - 0:04
    No último segmento, neste módulo, eu quero te mostrar um ataque geral que
  • 0:04 - 0:08
    afeta muitas implementações de algoritmos Mac. E há uma lição legal
  • 0:08 - 0:12
    ser aprendido a partir de um ataque como este. Então, vamos olhar para uma implementação específica
  • 0:12 - 0:16
    de verificação HMAC. Isto acontece por ser uma implementação da biblioteca Keyczar,
  • 0:16 - 0:20
    que passa a ser escrito em Python. Então aqui está o código que é usado para verificar uma
  • 0:20 - 0:24
    tag gerada pelo HMAC. Este código é realmente simplificada. Eu só queria
  • 0:24 - 0:28
    meio que simplificá-la tanto quanto eu puder para obter o ponto de vista. Então, basicamente, o que o
  • 0:28 - 0:32
    entradas são, a chave, a mensagem, e os bytes de tag. A forma como verificar se ele é, nós
  • 0:32 - 0:38
    re-calcular o HMAC da mensagem e então comparar dizem que a 16, resultando
  • 0:38 - 0:43
    bytes. Para as picadas de assinatura reais dadas. Então, isso parece perfeitamente bem.
  • 0:43 - 0:48
    De fato, qualquer um pode implementá-lo assim. E, de fato, muitas pessoas têm implementado
  • 0:48 - 0:52
    -lo assim. O problema é que, se você olhar como a comparação é feita, o
  • 0:52 - 0:57
    comparação, como se poderia esperar, é feita byte a byte. Há um laço dentro do
  • 0:57 - 1:01
    interpretador Python que faz um loop sobre todos os dezesseis bytes. E acontece que o
  • 1:01 - 1:06
    primeira vez que encontra uma desigualdade, o ciclo termina e diz que as cordas são
  • 1:06 - 1:11
    não igual. Eo facto de que as saídas do comparador quando a primeira desigualdade
  • 1:11 - 1:16
    é encontrado introduz um ataque de temporização significativo sobre esta biblioteca. Então deixe-me mostrar-lhe
  • 1:16 - 1:21
    como se poderia atacá-lo. Então, imagine que você é o invasor, e você tem a mensagem m,
  • 1:21 - 1:26
    para os quais você deseja obter uma marca válida. Agora, seu objetivo é atacar um servidor que
  • 1:26 - 1:31
    tem uma chave HMAC segredo armazenado nele. E o servidor expõe uma interface que
  • 1:31 - 1:36
    basicamente leva pares de mensagem MAC. Verifica se o MAC é válido, se o MAC é válido
  • 1:36 - 1:40
    ele faz algo com a mensagem. E se o MAC não é válido, diz rejeitar.
  • 1:40 - 1:45
    Ok, então ele está de volta ao remetente ou a mensagem rejeita. Então, agora este atacante
  • 1:45 - 1:50
    tem a oportunidade de apresentar, basicamente, muita mensagem que aparece e ver se ele
  • 1:50 - 1:54
    pode deduzir as tags da mensagem específica para a qual uma vez atacada. Aqui está
  • 1:54 - 1:59
    como podemos usar a implementação quebrado a partir do slide anterior para fazer exatamente isso.
  • 1:59 - 2:04
    Então, o que o atacante vai fazer é enviar consultas tag muitas mensagens, onde o
  • 2:04 - 2:08
    mensagem é sempre a mesma. Mas com uma tag, ele vai experimentar com lotes e
  • 2:08 - 2:13
    lotes e lotes de marcas diferentes. Assim, na primeira consulta, o que ele vai fazer é apenas
  • 2:13 - 2:17
    apresentar uma tag aleatório juntamente com a mensagem alvo. E ele vai medir o tempo
  • 2:17 - 2:22
    servidor o levou a responder. A próxima consulta que ele vai apresentar, é que ele vai tentar
  • 2:22 - 2:26
    todos os bytes possíveis primeiros para as marcas. Deixe-me explicar o que quero dizer com isso. Assim, o
  • 2:26 - 2:30
    bytes restantes das tags que ele coloca são apenas arbitrárias, realmente não
  • 2:30 - 2:35
    importa o que eles são. Mas para a primeira mordida, o que ele vai fazer é que ele vai apresentar uma tag
  • 2:35 - 2:39
    de partida com um zero bytes. E então ele vai ver se o servidor teve um pouco
  • 2:39 - 2:44
    pouco mais para verificar a marca do que antes. Se o servidor levou exactamente a mesma quantidade
  • 2:44 - 2:49
    de tempo para verificar a tag como no passo um, então ele vai tentar de novo, desta vez com
  • 2:49 - 2:53
    bytes em um. Se ainda o servidor respondeu muito rapidamente, ele vai tentar
  • 2:53 - 2:57
    com conjuntos de bytes de dois. Se o servidor respondeu rapidamente, em seguida, ele vai tentar
  • 2:57 - 3:01
    com conjuntos de bytes de três, e assim por diante até, finalmente, vamos dizer, quando o byte conjuntos de
  • 3:01 - 3:05
    três servidores do exame um pouco mais para responder. O que isto significa é realmente
  • 3:05 - 3:09
    quando se fez a comparação entre o MAC correto eo MAC apresentado pelo
  • 3:09 - 3:14
    atacante. Os dois combinados sobre este byte, ea rejeição aconteceu na segunda
  • 3:14 - 3:19
    bytes. Aha. Então, agora o atacante sabe que a primeira mordida da tag é definido como três
  • 3:19 - 3:23
    e agora ele pode montar exatamente o mesmo ataque na segunda mordida. Então aqui. É
  • 3:23 - 3:29
    vai apresentar o tag. E o segundo, volta aqui. Aqui Isto deve ir aqui. Assim
  • 3:29 - 3:33
    que vai apresentar uma tag quando o segundo byte é definido para zero. E vai
  • 3:33 - 3:37
    medida se este teve um pouco mais do que na etapa dois. Se não, ele é
  • 3:37 - 3:41
    vai mudar isso para ser definido como um, e ele vai medida se o servidor
  • 3:41 - 3:45
    tempo de resposta é um pouco mais do que antes. Eventualmente, vamos dizer, quando ele define
  • 3:45 - 3:49
    isso, eu não sei. Quando o byte é definido para, a 53, digamos, de repente, o
  • 3:49 - 3:53
    servidor demora um pouco mais para responder. O que significa que agora, o
  • 3:53 - 3:57
    comparador acompanhado nos dois primeiros bytes. E agora o atacante soube que o
  • 3:57 - 4:01
    dois primeiros bytes do Mac são três e 53. E agora ele pode seguir em frente e fazer o
  • 4:01 - 4:05
    mesma coisa no terceiro byte e, em seguida, o byte de quarto e assim por diante e assim
  • 4:05 - 4:09
    por diante. Até que, finalmente, o servidor diz que, sim, eu aceito. Você realmente me deu o
  • 4:09 - 4:14
    Mac direito. E então vamos em frente e agir sobre esta mensagem falsa. Isso, atacar o nosso
  • 4:14 - 4:19
    abastecimento. Então este é um belo exemplo de como um ataque de temporização pode revelar o valor
  • 4:19 - 4:23
    de um MAC, o valor correto do MAC. Tipo de byte por byte, até que finalmente,
  • 4:23 - 4:28
    atacante obtém todos os bytes corretos da marca, e então ele é capaz de enganar o
  • 4:28 - 4:33
    servidor em aceitar este par tag mensagem. A razão de eu gostar deste exemplo é
  • 4:33 - 4:37
    esta é uma maneira perfeitamente razoável de implementação de uma rotina de verificação MAC.
  • 4:37 - 4:42
    E ainda, se você direita-lo desta maneira, ele será completamente quebrado. Então o que fazemos? Assim
  • 4:42 - 4:47
    deixe-me mostrar-lhe duas defesas, a primeira defesa, vou escrevê-lo novamente em python
  • 4:47 - 4:51
    é, é como se segue. Na verdade, a biblioteca Keyczar exatamente implementada essa defesa.
  • 4:51 - 4:56
    Este código é realmente retirado da versão atualizada da biblioteca. O primeiro
  • 4:56 - 5:00
    coisa que fazemos é testar se os bytes de assinatura apresentadas pelo atacante são da
  • 5:00 - 5:05
    comprimento correto, dizem, por HMAC isso seria dizer, você sabe 96 bits ou 128 bits, e
  • 5:05 - 5:09
    se não rejeitamos que, como um MAC inválido. Mas agora, se os bytes de assinatura realmente
  • 5:09 - 5:13
    ter o comprimento correto, o que fazemos é implementar nosso comparador própria. E
  • 5:13 - 5:18
    sempre leva a mesma quantidade de tempo para comparar as duas strings. Assim, em particular,
  • 5:18 - 5:22
    este usa a função zip em Python, que, essencialmente, se você está dando
  • 5:22 - 5:28
    lo duas dezesseis cadeias de bytes. Ele vai criar dezesseis pares. De bytes. Por isso, vou
  • 5:28 - 5:33
    apenas criar um, uma lista de dezasseis elementos, onde cada elemento é um par de bytes. Um
  • 5:33 - 5:37
    tomadas a partir da esquerda e uma tomada a partir da direita. E então você volta, você sabe, você
  • 5:37 - 5:41
    percorrer esta lista de pares. Está calcular o XOR do primeiro par, ea
  • 5:41 - 5:45
    ou para o resultado. Em seguida, é calcular o XOR do segundo par, e
  • 5:45 - 5:50
    você ou que para o resultado. E você nota que, se em algum momento neste
  • 5:50 - 5:54
    loop, dois bytes que ser não igual, então o XOR irá avaliar a algo
  • 5:54 - 5:59
    que é diferente de zero. E, portanto, quando se or'ed-lo para o resultado. O resultado
  • 5:59 - 6:03
    também será contagem em zero, e, em seguida, vamos retornar falso, no final do
  • 6:03 - 6:07
    comparação. Assim, o ponto aqui é que agora o comparador sempre leva o mesmo
  • 6:07 - 6:11
    quantidade de tempo. Mesmo se encontra diferença no número de byte três, será
  • 6:11 - 6:15
    continuar executando as cordas ambos até o fim. E só então se
  • 6:15 - 6:20
    retornar os resultados. Portanto, agora o ataque de temporização supostamente é impossível. No entanto,
  • 6:20 - 6:25
    isso pode ser bastante problemático, porque compiladores tentou ser muito útil aqui. Assim
  • 6:25 - 6:30
    compilador otimizado um pode olhar para este código e dizer: ei, espere um minuto. Eu posso
  • 6:30 - 6:35
    realmente melhorar esse código, tornando o final do circuito fechado quatro. Logo que uma incompatível
  • 6:35 - 6:39
    conjunto de bytes é descoberto. E assim, um compilador otimizado pode ser o seu tipo,
  • 6:39 - 6:44
    de, calcanhar de Aquiles quando se trata de tornar os programas de sempre ter a mesma quantidade de
  • 6:44 - 6:48
    tempo. E assim uma defesa diferente, que não é tão amplamente implementado, é tentar
  • 6:48 - 6:53
    esconder do adversário, o que as cordas são realmente estão sendo comparados. Então deixe-me mostrar
  • 6:53 - 6:57
    você que eu quero dizer com isso. Então, novamente, aqui temos o nosso algoritmo de verificação. Por isso
  • 6:57 - 7:02
    toma como entradas, uma chave, uma mensagem, e MAC de um candidato do adversário. E
  • 7:02 - 7:06
    , em seguida, a forma como fazemos a comparação é que em primeiro lugar, calcular o MAC correto em
  • 7:06 - 7:10
    a mensagem. Mas, então, em vez de comparar diretamente o MAC ea assinatura
  • 7:10 - 7:15
    adversário bytes, o que vamos fazer é nós vamos uma vez mais de hash. Então, nós
  • 7:15 - 7:19
    computar um hash aqui do MAC. Nós computar um hash dos bytes de assinatura. Claro que,
  • 7:19 - 7:24
    se estes dois acontecer a ser a mesma, em seguida, os HMACs resultantes será também o
  • 7:24 - 7:28
    mesmo, assim que a comparação será bem sucedida. Mas a questão é agora, se sig
  • 7:28 - 7:32
    bytes acontecer a MAC igual no primeiro byte, mas não sobre os bytes remanescentes.
  • 7:32 - 7:36
    Então, quando fazemos essa camada adicional de hash, é provável que os dois resultando
  • 7:36 - 7:40
    valores são completamente diferentes. E, como resultado, o byte pelo comparador byte vai
  • 7:40 - 7:44
    saída apenas na primeira iteração. O ponto aqui é que o adversário não
  • 7:44 - 7:47
    realmente sabe quais seqüências estão sendo comparados. E, como resultado, ele não pode
  • 7:47 - 7:51
    montar um ataque de temporização que discutimos anteriormente. Ok, então isso é
  • 7:51 - 7:55
    defesa outro. Pelo menos agora, você não está à mercê de um compilador de otimização.
  • 7:55 - 8:00
    lição O principal de tudo isso é que você percebe que as pessoas que ainda são
  • 8:00 - 8:04
    especialistas em cryptolibraries de execução, obter esse material errado. E o código de direito
  • 8:04 - 8:08
    que as palavras perfeitamente bem e ainda é completamente vulnerável a um ataque de temporização
  • 8:08 - 8:12
    que completamente desfazer toda a segurança do sistema. Então a lição aqui é, naturalmente,
  • 8:12 - 8:16
    você não deve inventar o seu próprio crypto mas você não deve mesmo ser
  • 8:16 - 8:20
    implementar sua própria criptografia, porque muito provavelmente ele estará vulnerável para o lado
  • 8:20 - 8:24
    ataques de canal. Basta usar uma biblioteca padrão como OpenSSL. Keyczar é na verdade um
  • 8:24 - 8:28
    boa biblioteca de usar que reduziria as chances de que você está vulnerável a estes
  • 8:28 - 8:28
    tipos de ataques.
Title:
ataques de tempo na verificação de MAC (9 min)
Video Language:
English
erickshowplay added a translation

Portuguese, Brazilian subtitles

Revisions