O Schneier
postou no seu blog uma notícia sobre phishers que driblaram a autenticação de dois fatores de um banco através de um ataque "man in the middle". Eles basicamente faziam o proxy das credenciais do usuário para o site original.
O que mais me impressiona é que todo mundo começa a sugerir soluções para isso pensando no problema "como o site original pode identificar que a requisição não está vindo diretamente do usuário real". ESSA NÃO É A ABORDAGEM CERTA!
No ano passado apresentei no CNASI uma prova de conceito. O código era um BHO, mas poderia ter sido feito de outras formas. Ele tinha como alvo um Internet Banking específico, que usava autenticação de dois fatores. Seu objetivo não era roubar credenciais do usuário, mas utilizar a sessão estabelecida e autenticada por ele. Toda vez que a pessoa fizesse uma transferência de dinheiro, a conta destino era substituída por outra. O comprovante apresentado depois também era alterado para que o usuário não percebesse o que aconteceu. Ele acabava não percebendo nada de diferente em sua experiência ao usar o site, mas o dinheiro acabou de ser transferido para uma conta diferente da correta.
Por que se preocupar em roubar credenciais quando você pode usar a sessão já autenticada pelo próprio usuário para fazer o que você precisa? Se você resolve não roubar credenciais também tem o benefício adicional de não precisar mandá-las para você. Sem preocupações com personal firewalls, NAT, etc.
O problema real (tecnicamente falando) está relacionado às ações do usuário (acessando sites falsos) e seu ambiente (backdoors, trojans, DNS poisoning). Autenticação de dois fatores não resolve nenhum destes