sábado, 3 de maio de 2008

Paranóia x Matemática

No último post eu falei sobre Criptografia, então agora, pra balancear, o tópico é Criptanálise. Semana passada, a polícia prendeu uma gangue que estava instalando os mini-notebooks Eee PC dentro de caixas automáticos, para roubar senhas dos usuários. O vídeo com a matéria pode ser visto abaixo:



Eu tenho certeza que um monte de gente deve ter visto a matéria e pensado "omfg nunca mais vou usar caixas automáticos kthxbye", mas na verdade, mesmo com o notebook lá dentro, não é tão fácil conseguir roubar a senha!

Se o seu banco for como o meu, você não digita a sua senha diretamente, ao invés disso, a máquina associa dois dígitos para cada botão, e você aperta os botões correspondentes à sua senha. Assim, se algum xereta estiver atrás de você olhando, ele não vai conseguir descobrir sua senha, e isso vale também se tiver um notebook dentro da máquina registrando o que você digita.

Então esse sistema é à prova de sniffers? Não! Um jeito de quebrar esse sistema é fazendo várias observações. Se o xereta te olhar uma única vez, ele não consegue descobrir sua senha, mas reduz bastante as possibilidades. Se a senha tiver quatro dígitos, uma única observação reduz de dez mil possibilidades para apenas 16. Se ele olhar uma segunda vez, pode ser que consiga informação suficiente para reduzir ainda mais o espaço, e, eventualmente, repetindo o processo, ele pode conseguir deduzir a senha.

Para conseguir reconstruir computacionalmente a senha, tudo que ele precisa fazer é resolver uma matriz de exact cover (na verdade outros métodos podem ser usados, mas eu sou preguiçoso adepto da orientação à objeto e do reuso de código pronto). Assuma n observações: para cada um dos 4 dígitos da senha há dez possibilidades, então você tem 40 linhas. Além disso, para cada observação, você precisa garantir que os quatro dígitos são consistentes, o que dá 4n colunas, e ainda mais 4 colunas extras para garantir que um único número estará associado a cada dígito da senha. No total, a matriz terá 40x(4n+4) elementos.

E quantas observações ele precisa? Isso não dá pra saber a priori, depende de como os números foram sorteados. Se a máquina repetir sempre a mesma distribuição, ele nunca vai conseguir deduzir a senha (mas também nem precisaria, pois aí ele só precisa apertar os mesmos botões que você). Por outro lado, se você tiver azar, pode ser que só duas observações sejam suficientes, como no caso abaixo:

observação 1:
senha CADA, botões A=(6 2) B=(5 8) C=(4 3) D=(1 9) E=(7 0)
observação 2:
senha CAAC, botões A=(1 2) B=(8 4) C=(6 3) D=(5 0) E=(7 9)

Nesse exemplo, dá pra ver claramente que a única senha consistente com os dados é 3216. Se o ladrão for levemente mais esperto, ele pode até perceber que não precisa fazer observações suficientes para que a senha seja única, basta que ele reduza o espaço de possibilidades para 3 ou menos (já que ele pode chutar 3 senhas antes da máquina bloquear o cartão).

Embora não seja possível calcular a priori quantas observações são necessárias, é perfeitamente possível calcular qual é o valor esperado dessa distribuição. Como eu sou preguiçoso adepto das simulações computacionais, ao invés de calcular as probabilidades na unha, eu escrevi uma simulação de Monte Carlo para calcular esse valor. O resultado é que, para uma senha de 4 dígitos, um ladrão que queira achar a senha exata precisa de 2.3 observações, enquanto que o ladrão esperto, que se contenta em reduzir pra 3 ou menos possibilidades, precisa de apenas 2.1 observações.

Código do simulador de Monte Carlo

A lição prática dessa análise é que, se você estiver desconfiado que o caixa tem um sniffer, não precisa ficar preocupado, desde que digite sua senha uma única vez. Se você precisar fazer uma outra operação, é melhor fazer em outra máquina.

4 comentários:

  1. Só pra fazer um pouco de FUD, você considera uma premissa no seu artigo que não é necessáriamente verdade:

    Que o terminal NÃO terá acesso a sua senha verdadeira e que a comparação será feita no "servidor".

    Outras coisas que você precisa também levar em conta: O interesse do ladrão não é necessariamente "roubar senhas". Ele pode roubar "apenas" um "token" de seção e usá-lo pra fazer transferências AO INVÉS DE executar sua transação, ele pode roubar apenas os seus dados bancários/de cartão para fazer outros tipos de fraude (clonar seu cartão, por exemplo), pode sacar alguns reais a mais em cada saque que ele ao invés de entregar ao cliente joga em algum compartimento secreto. Enfim, as possibilidades são infinitas!

    E pra voltar pra área da criptanálise: se o gerador de números aleatórios for "fraco", um número suficiente de observações de clientes diferentes pode ser suficiente pra deduzir a seqüência de dígitos que aparece na tela a cada vez, eliminando a necessidade de mais de uma observação ;)

    Como diria o Schneier: 20 anos atrás eu achava que a criptografia ia salvar o mundo, hoje eu sei que só as pessoas podem fazê-lo.

    ResponderExcluir
  2. Ah sim, ladrões podem ser tão criativos quanto se queira :)

    O único método 100% seguro de criptografia é o one-time pad, todo o resto pode ser quebrado, com recursos suficientes.

    ResponderExcluir
  3. Na verdade o buraco é mais embaixo. A criptografia pode ser segura o quanto for, mas e o resto do sistema? Criptografia aplicada de forma errada (e geralmente é) não resolve absolutamente nada e só causa transtorno pro usuário.

    Quem já trabalhou na área de sistemas dos bancos sabe: essas "firulas" nos caixas automáticos são simplesmente estéticas. a intenção é fazer o cliente (ou o gerente do banco, dependendo do caso) se sentir mais seguro, e não aumentar a segurança real.

    ResponderExcluir
  4. Outra dica boa é trocar a senha regularmente. Quase ninguém troca senha de banco.

    ResponderExcluir