[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:00.00,0:00:03.76,Default,,0000,0000,0000,,No último segmento, neste módulo, eu quero te mostrar um ataque geral que Dialogue: 0,0:00:03.76,0:00:07.62,Default,,0000,0000,0000,,afeta muitas implementações de algoritmos Mac. E há uma lição legal Dialogue: 0,0:00:07.62,0:00:11.73,Default,,0000,0000,0000,,ser aprendido a partir de um ataque como este. Então, vamos olhar para uma implementação específica Dialogue: 0,0:00:11.73,0:00:15.94,Default,,0000,0000,0000,,de verificação HMAC. Isto acontece por ser uma implementação da biblioteca Keyczar, Dialogue: 0,0:00:15.94,0:00:20.00,Default,,0000,0000,0000,,que passa a ser escrito em Python. Então aqui está o código que é usado para verificar uma Dialogue: 0,0:00:20.00,0:00:23.71,Default,,0000,0000,0000,,tag gerada pelo HMAC. Este código é realmente simplificada. Eu só queria Dialogue: 0,0:00:23.71,0:00:27.82,Default,,0000,0000,0000,,meio que simplificá-la tanto quanto eu puder para obter o ponto de vista. Então, basicamente, o que o Dialogue: 0,0:00:27.82,0:00:32.24,Default,,0000,0000,0000,,entradas são, a chave, a mensagem, e os bytes de tag. A forma como verificar se ele é, nós Dialogue: 0,0:00:32.24,0:00:38.08,Default,,0000,0000,0000,,re-calcular o HMAC da mensagem e então comparar dizem que a 16, resultando Dialogue: 0,0:00:38.08,0:00:43.27,Default,,0000,0000,0000,,bytes. Para as picadas de assinatura reais dadas. Então, isso parece perfeitamente bem. Dialogue: 0,0:00:43.27,0:00:47.83,Default,,0000,0000,0000,,De fato, qualquer um pode implementá-lo assim. E, de fato, muitas pessoas têm implementado Dialogue: 0,0:00:47.83,0:00:52.23,Default,,0000,0000,0000,,-lo assim. O problema é que, se você olhar como a comparação é feita, o Dialogue: 0,0:00:52.23,0:00:56.74,Default,,0000,0000,0000,,comparação, como se poderia esperar, é feita byte a byte. Há um laço dentro do Dialogue: 0,0:00:56.74,0:01:01.37,Default,,0000,0000,0000,,interpretador Python que faz um loop sobre todos os dezesseis bytes. E acontece que o Dialogue: 0,0:01:01.37,0:01:06.30,Default,,0000,0000,0000,,primeira vez que encontra uma desigualdade, o ciclo termina e diz que as cordas são Dialogue: 0,0:01:06.30,0:01:10.97,Default,,0000,0000,0000,,não igual. Eo facto de que as saídas do comparador quando a primeira desigualdade Dialogue: 0,0:01:10.97,0:01:16.15,Default,,0000,0000,0000,,é encontrado introduz um ataque de temporização significativo sobre esta biblioteca. Então deixe-me mostrar-lhe Dialogue: 0,0:01:16.15,0:01:21.26,Default,,0000,0000,0000,,como se poderia atacá-lo. Então, imagine que você é o invasor, e você tem a mensagem m, Dialogue: 0,0:01:21.26,0:01:26.37,Default,,0000,0000,0000,,para os quais você deseja obter uma marca válida. Agora, seu objetivo é atacar um servidor que Dialogue: 0,0:01:26.37,0:01:31.23,Default,,0000,0000,0000,,tem uma chave HMAC segredo armazenado nele. E o servidor expõe uma interface que Dialogue: 0,0:01:31.23,0:01:36.09,Default,,0000,0000,0000,,basicamente leva pares de mensagem MAC. Verifica se o MAC é válido, se o MAC é válido Dialogue: 0,0:01:36.09,0:01:40.45,Default,,0000,0000,0000,,ele faz algo com a mensagem. E se o MAC não é válido, diz rejeitar. Dialogue: 0,0:01:40.45,0:01:45.04,Default,,0000,0000,0000,,Ok, então ele está de volta ao remetente ou a mensagem rejeita. Então, agora este atacante Dialogue: 0,0:01:45.04,0:01:49.68,Default,,0000,0000,0000,,tem a oportunidade de apresentar, basicamente, muita mensagem que aparece e ver se ele Dialogue: 0,0:01:49.68,0:01:54.27,Default,,0000,0000,0000,,pode deduzir as tags da mensagem específica para a qual uma vez atacada. Aqui está Dialogue: 0,0:01:54.27,0:01:59.04,Default,,0000,0000,0000,,como podemos usar a implementação quebrado a partir do slide anterior para fazer exatamente isso. Dialogue: 0,0:01:59.04,0:02:03.66,Default,,0000,0000,0000,,Então, o que o atacante vai fazer é enviar consultas tag muitas mensagens, onde o Dialogue: 0,0:02:03.66,0:02:08.04,Default,,0000,0000,0000,,mensagem é sempre a mesma. Mas com uma tag, ele vai experimentar com lotes e Dialogue: 0,0:02:08.04,0:02:12.60,Default,,0000,0000,0000,,lotes e lotes de marcas diferentes. Assim, na primeira consulta, o que ele vai fazer é apenas Dialogue: 0,0:02:12.60,0:02:17.20,Default,,0000,0000,0000,,apresentar uma tag aleatório juntamente com a mensagem alvo. E ele vai medir o tempo Dialogue: 0,0:02:17.20,0:02:21.67,Default,,0000,0000,0000,,servidor o levou a responder. A próxima consulta que ele vai apresentar, é que ele vai tentar Dialogue: 0,0:02:21.67,0:02:25.90,Default,,0000,0000,0000,,todos os bytes possíveis primeiros para as marcas. Deixe-me explicar o que quero dizer com isso. Assim, o Dialogue: 0,0:02:25.90,0:02:30.01,Default,,0000,0000,0000,,bytes restantes das tags que ele coloca são apenas arbitrárias, realmente não Dialogue: 0,0:02:30.01,0:02:34.56,Default,,0000,0000,0000,,importa o que eles são. Mas para a primeira mordida, o que ele vai fazer é que ele vai apresentar uma tag Dialogue: 0,0:02:34.56,0:02:39.39,Default,,0000,0000,0000,,de partida com um zero bytes. E então ele vai ver se o servidor teve um pouco Dialogue: 0,0:02:39.39,0:02:44.28,Default,,0000,0000,0000,,pouco mais para verificar a marca do que antes. Se o servidor levou exactamente a mesma quantidade Dialogue: 0,0:02:44.28,0:02:49.06,Default,,0000,0000,0000,,de tempo para verificar a tag como no passo um, então ele vai tentar de novo, desta vez com Dialogue: 0,0:02:49.06,0:02:52.98,Default,,0000,0000,0000,,bytes em um. Se ainda o servidor respondeu muito rapidamente, ele vai tentar Dialogue: 0,0:02:52.98,0:02:56.96,Default,,0000,0000,0000,,com conjuntos de bytes de dois. Se o servidor respondeu rapidamente, em seguida, ele vai tentar Dialogue: 0,0:02:56.96,0:03:01.10,Default,,0000,0000,0000,,com conjuntos de bytes de três, e assim por diante até, finalmente, vamos dizer, quando o byte conjuntos de Dialogue: 0,0:03:01.10,0:03:05.34,Default,,0000,0000,0000,,três servidores do exame um pouco mais para responder. O que isto significa é realmente Dialogue: 0,0:03:05.34,0:03:09.48,Default,,0000,0000,0000,,quando se fez a comparação entre o MAC correto eo MAC apresentado pelo Dialogue: 0,0:03:09.48,0:03:14.33,Default,,0000,0000,0000,,atacante. Os dois combinados sobre este byte, ea rejeição aconteceu na segunda Dialogue: 0,0:03:14.33,0:03:19.07,Default,,0000,0000,0000,,bytes. Aha. Então, agora o atacante sabe que a primeira mordida da tag é definido como três Dialogue: 0,0:03:19.07,0:03:23.44,Default,,0000,0000,0000,,e agora ele pode montar exatamente o mesmo ataque na segunda mordida. Então aqui. É Dialogue: 0,0:03:23.44,0:03:28.52,Default,,0000,0000,0000,,vai apresentar o tag. E o segundo, volta aqui. Aqui Isto deve ir aqui. Assim Dialogue: 0,0:03:28.52,0:03:32.51,Default,,0000,0000,0000,,que vai apresentar uma tag quando o segundo byte é definido para zero. E vai Dialogue: 0,0:03:32.51,0:03:36.52,Default,,0000,0000,0000,,medida se este teve um pouco mais do que na etapa dois. Se não, ele é Dialogue: 0,0:03:36.52,0:03:40.50,Default,,0000,0000,0000,,vai mudar isso para ser definido como um, e ele vai medida se o servidor Dialogue: 0,0:03:40.50,0:03:44.76,Default,,0000,0000,0000,,tempo de resposta é um pouco mais do que antes. Eventualmente, vamos dizer, quando ele define Dialogue: 0,0:03:44.76,0:03:48.96,Default,,0000,0000,0000,,isso, eu não sei. Quando o byte é definido para, a 53, digamos, de repente, o Dialogue: 0,0:03:48.96,0:03:52.68,Default,,0000,0000,0000,,servidor demora um pouco mais para responder. O que significa que agora, o Dialogue: 0,0:03:52.68,0:03:56.94,Default,,0000,0000,0000,,comparador acompanhado nos dois primeiros bytes. E agora o atacante soube que o Dialogue: 0,0:03:56.94,0:04:01.06,Default,,0000,0000,0000,,dois primeiros bytes do Mac são três e 53. E agora ele pode seguir em frente e fazer o Dialogue: 0,0:04:01.06,0:04:05.27,Default,,0000,0000,0000,,mesma coisa no terceiro byte e, em seguida, o byte de quarto e assim por diante e assim Dialogue: 0,0:04:05.27,0:04:09.18,Default,,0000,0000,0000,,por diante. Até que, finalmente, o servidor diz que, sim, eu aceito. Você realmente me deu o Dialogue: 0,0:04:09.18,0:04:13.86,Default,,0000,0000,0000,,Mac direito. E então vamos em frente e agir sobre esta mensagem falsa. Isso, atacar o nosso Dialogue: 0,0:04:13.86,0:04:18.71,Default,,0000,0000,0000,,abastecimento. Então este é um belo exemplo de como um ataque de temporização pode revelar o valor Dialogue: 0,0:04:18.71,0:04:23.14,Default,,0000,0000,0000,,de um MAC, o valor correto do MAC. Tipo de byte por byte, até que finalmente, Dialogue: 0,0:04:23.14,0:04:28.09,Default,,0000,0000,0000,,atacante obtém todos os bytes corretos da marca, e então ele é capaz de enganar o Dialogue: 0,0:04:28.09,0:04:32.64,Default,,0000,0000,0000,,servidor em aceitar este par tag mensagem. A razão de eu gostar deste exemplo é Dialogue: 0,0:04:32.64,0:04:37.19,Default,,0000,0000,0000,,esta é uma maneira perfeitamente razoável de implementação de uma rotina de verificação MAC. Dialogue: 0,0:04:37.19,0:04:41.94,Default,,0000,0000,0000,,E ainda, se você direita-lo desta maneira, ele será completamente quebrado. Então o que fazemos? Assim Dialogue: 0,0:04:41.94,0:04:46.51,Default,,0000,0000,0000,,deixe-me mostrar-lhe duas defesas, a primeira defesa, vou escrevê-lo novamente em python Dialogue: 0,0:04:46.51,0:04:51.02,Default,,0000,0000,0000,,é, é como se segue. Na verdade, a biblioteca Keyczar exatamente implementada essa defesa. Dialogue: 0,0:04:51.02,0:04:55.59,Default,,0000,0000,0000,,Este código é realmente retirado da versão atualizada da biblioteca. O primeiro Dialogue: 0,0:04:55.59,0:05:00.33,Default,,0000,0000,0000,,coisa que fazemos é testar se os bytes de assinatura apresentadas pelo atacante são da Dialogue: 0,0:05:00.33,0:05:04.90,Default,,0000,0000,0000,,comprimento correto, dizem, por HMAC isso seria dizer, você sabe 96 bits ou 128 bits, e Dialogue: 0,0:05:04.90,0:05:09.42,Default,,0000,0000,0000,,se não rejeitamos que, como um MAC inválido. Mas agora, se os bytes de assinatura realmente Dialogue: 0,0:05:09.42,0:05:13.47,Default,,0000,0000,0000,,ter o comprimento correto, o que fazemos é implementar nosso comparador própria. E Dialogue: 0,0:05:13.47,0:05:17.90,Default,,0000,0000,0000,,sempre leva a mesma quantidade de tempo para comparar as duas strings. Assim, em particular, Dialogue: 0,0:05:17.90,0:05:22.16,Default,,0000,0000,0000,,este usa a função zip em Python, que, essencialmente, se você está dando Dialogue: 0,0:05:22.16,0:05:28.12,Default,,0000,0000,0000,,lo duas dezesseis cadeias de bytes. Ele vai criar dezesseis pares. De bytes. Por isso, vou Dialogue: 0,0:05:28.12,0:05:32.67,Default,,0000,0000,0000,,apenas criar um, uma lista de dezasseis elementos, onde cada elemento é um par de bytes. Um Dialogue: 0,0:05:32.67,0:05:37.05,Default,,0000,0000,0000,,tomadas a partir da esquerda e uma tomada a partir da direita. E então você volta, você sabe, você Dialogue: 0,0:05:37.05,0:05:41.33,Default,,0000,0000,0000,,percorrer esta lista de pares. Está calcular o XOR do primeiro par, ea Dialogue: 0,0:05:41.33,0:05:45.49,Default,,0000,0000,0000,,ou para o resultado. Em seguida, é calcular o XOR do segundo par, e Dialogue: 0,0:05:45.49,0:05:49.93,Default,,0000,0000,0000,,você ou que para o resultado. E você nota que, se em algum momento neste Dialogue: 0,0:05:49.93,0:05:54.21,Default,,0000,0000,0000,,loop, dois bytes que ser não igual, então o XOR irá avaliar a algo Dialogue: 0,0:05:54.21,0:05:58.58,Default,,0000,0000,0000,,que é diferente de zero. E, portanto, quando se or'ed-lo para o resultado. O resultado Dialogue: 0,0:05:58.58,0:06:02.63,Default,,0000,0000,0000,,também será contagem em zero, e, em seguida, vamos retornar falso, no final do Dialogue: 0,0:06:02.63,0:06:06.58,Default,,0000,0000,0000,,comparação. Assim, o ponto aqui é que agora o comparador sempre leva o mesmo Dialogue: 0,0:06:06.58,0:06:10.72,Default,,0000,0000,0000,,quantidade de tempo. Mesmo se encontra diferença no número de byte três, será Dialogue: 0,0:06:10.72,0:06:15.48,Default,,0000,0000,0000,,continuar executando as cordas ambos até o fim. E só então se Dialogue: 0,0:06:15.48,0:06:20.24,Default,,0000,0000,0000,,retornar os resultados. Portanto, agora o ataque de temporização supostamente é impossível. No entanto, Dialogue: 0,0:06:20.24,0:06:25.26,Default,,0000,0000,0000,,isso pode ser bastante problemático, porque compiladores tentou ser muito útil aqui. Assim Dialogue: 0,0:06:25.26,0:06:30.14,Default,,0000,0000,0000,,compilador otimizado um pode olhar para este código e dizer: ei, espere um minuto. Eu posso Dialogue: 0,0:06:30.14,0:06:35.11,Default,,0000,0000,0000,,realmente melhorar esse código, tornando o final do circuito fechado quatro. Logo que uma incompatível Dialogue: 0,0:06:35.11,0:06:39.38,Default,,0000,0000,0000,,conjunto de bytes é descoberto. E assim, um compilador otimizado pode ser o seu tipo, Dialogue: 0,0:06:39.38,0:06:43.93,Default,,0000,0000,0000,,de, calcanhar de Aquiles quando se trata de tornar os programas de sempre ter a mesma quantidade de Dialogue: 0,0:06:43.93,0:06:48.48,Default,,0000,0000,0000,,tempo. E assim uma defesa diferente, que não é tão amplamente implementado, é tentar Dialogue: 0,0:06:48.48,0:06:52.98,Default,,0000,0000,0000,,esconder do adversário, o que as cordas são realmente estão sendo comparados. Então deixe-me mostrar Dialogue: 0,0:06:52.98,0:06:57.42,Default,,0000,0000,0000,,você que eu quero dizer com isso. Então, novamente, aqui temos o nosso algoritmo de verificação. Por isso Dialogue: 0,0:06:57.42,0:07:01.74,Default,,0000,0000,0000,,toma como entradas, uma chave, uma mensagem, e MAC de um candidato do adversário. E Dialogue: 0,0:07:01.74,0:07:06.16,Default,,0000,0000,0000,,, em seguida, a forma como fazemos a comparação é que em primeiro lugar, calcular o MAC correto em Dialogue: 0,0:07:06.16,0:07:10.41,Default,,0000,0000,0000,,a mensagem. Mas, então, em vez de comparar diretamente o MAC ea assinatura Dialogue: 0,0:07:10.41,0:07:14.93,Default,,0000,0000,0000,,adversário bytes, o que vamos fazer é nós vamos uma vez mais de hash. Então, nós Dialogue: 0,0:07:14.93,0:07:19.46,Default,,0000,0000,0000,,computar um hash aqui do MAC. Nós computar um hash dos bytes de assinatura. Claro que, Dialogue: 0,0:07:19.46,0:07:23.76,Default,,0000,0000,0000,,se estes dois acontecer a ser a mesma, em seguida, os HMACs resultantes será também o Dialogue: 0,0:07:23.76,0:07:27.79,Default,,0000,0000,0000,,mesmo, assim que a comparação será bem sucedida. Mas a questão é agora, se sig Dialogue: 0,0:07:27.79,0:07:31.69,Default,,0000,0000,0000,,bytes acontecer a MAC igual no primeiro byte, mas não sobre os bytes remanescentes. Dialogue: 0,0:07:31.69,0:07:35.61,Default,,0000,0000,0000,,Então, quando fazemos essa camada adicional de hash, é provável que os dois resultando Dialogue: 0,0:07:35.61,0:07:39.68,Default,,0000,0000,0000,,valores são completamente diferentes. E, como resultado, o byte pelo comparador byte vai Dialogue: 0,0:07:39.68,0:07:43.69,Default,,0000,0000,0000,,saída apenas na primeira iteração. O ponto aqui é que o adversário não Dialogue: 0,0:07:43.69,0:07:47.26,Default,,0000,0000,0000,,realmente sabe quais seqüências estão sendo comparados. E, como resultado, ele não pode Dialogue: 0,0:07:47.26,0:07:50.81,Default,,0000,0000,0000,,montar um ataque de temporização que discutimos anteriormente. Ok, então isso é Dialogue: 0,0:07:50.81,0:07:55.45,Default,,0000,0000,0000,,defesa outro. Pelo menos agora, você não está à mercê de um compilador de otimização. Dialogue: 0,0:07:55.45,0:08:00.03,Default,,0000,0000,0000,,lição O principal de tudo isso é que você percebe que as pessoas que ainda são Dialogue: 0,0:08:00.03,0:08:04.49,Default,,0000,0000,0000,,especialistas em cryptolibraries de execução, obter esse material errado. E o código de direito Dialogue: 0,0:08:04.49,0:08:08.35,Default,,0000,0000,0000,,que as palavras perfeitamente bem e ainda é completamente vulnerável a um ataque de temporização Dialogue: 0,0:08:08.35,0:08:12.31,Default,,0000,0000,0000,,que completamente desfazer toda a segurança do sistema. Então a lição aqui é, naturalmente, Dialogue: 0,0:08:12.31,0:08:15.78,Default,,0000,0000,0000,,você não deve inventar o seu próprio crypto mas você não deve mesmo ser Dialogue: 0,0:08:15.78,0:08:19.78,Default,,0000,0000,0000,,implementar sua própria criptografia, porque muito provavelmente ele estará vulnerável para o lado Dialogue: 0,0:08:19.78,0:08:23.55,Default,,0000,0000,0000,,ataques de canal. Basta usar uma biblioteca padrão como OpenSSL. Keyczar é na verdade um Dialogue: 0,0:08:23.55,0:08:27.60,Default,,0000,0000,0000,,boa biblioteca de usar que reduziria as chances de que você está vulnerável a estes Dialogue: 0,0:08:27.60,0:08:28.45,Default,,0000,0000,0000,,tipos de ataques.