O app do @Itau e a falha de segurança no login

O internet banking é uma das maiores invenções do mundo moderno. Poder pagar contas, movimentar dinheiro, fazer investimentos, tudo no conforto da sua casa ou mesmo na correria do dia-a-dia através do seu celular é algo maravilhosamente prático.

Entretanto, para garantir a segurança dos dados e das finanças dos clientes, foi necessário adicionar diversas camadas de segurança para tornar esse tipo de serviço menos suscetível a ataques externos; enquanto o banco tem completo controle e conhecimento sobre o que acontece num caixa eletrônico ou agência bancária (principalmente com relação a software), em celulares e computadores alheios esse controle é obviamente muito inferior. Então, surgiram (pelo menos no Itaú) coisas como tokens e senhas eletrônicas, criados especificamente pro uso do internet banking.

O Itaú, há certo tempo, antes da era da biometria, usava um sistema interessante para que você digite sua senha: em vez de exibir um teclado numérico completo, onde qualquer passer-by facilmente determinaria o seu código, eles optaram por exibir os dígitos em pares. Assim, você não consegue mais isolar a senha do usuário, mas vai ser deixado com algumas dezenas de possibilidades.

O grande problema é que os pares de dígitos são alterados a cada sessão, então, dado um número suficiente de sessões (na grande maioria dos casos, apenas duas) é possível determinar com certeza a senha do usuário. Ainda assim, esse sistema funcionava muito bem em caixas eletrônicos, porque:

  1. É improvável que alguém estivesse próximo de você duas vezes em duas ocasiões distintas (provavelmente em lugares distintos) pra ver você digitando a sua senha duas vezes.
  2. É improvável que essa pessoa tivesse algum meio de capturar a sua tela ou de memorizar os pares de números que você digitou.
  3. Por mais que ela soubesse a sua senha, ela não conseguiria acessar sua conta porque precisaria do seu cartão ou da sua biometria.

Eu não quero minimizar a falha de segurança que isso representa: existe a possibilidade de alguém determinar a sua senha muito facilmente, e isso é terrível. Mas fica pior.


Agora, a gente usa caixas eletrônicos dentro dos nossos celulares. Existem malwares capazes de gravar a tela de smartphones remotamente e de mapear pontos de toque na tela. E é aqui que o sistema de login do Itaú se mostra incrivelmente frágil.

Vamos pegar uma senha padrão: 123456. Eu abro o app do Itaú pela primeira vez, e é isso que eu vejo:

Intuitivamente, mesmo que alguém me gravasse digitando, eles não seriam capazes de determinar com precisão a minha senha, pois existem as seguintes possibilidades pra cada dígito:

1º dígito: 1 ou 4

2º dígito: 2 ou 8

3º dígito: 3 ou 9

4º dígito: 1 ou 4

5º dígito: 0 ou 5

6º dígito: 6 ou 7

Matematicamente, existem 2⁶ = 64 possibilidades de senha, um número ridiculamente baixo que é um problema por si só: se alguém querendo invadir sua conta escolhesse uma senha dessas aleatoriamente, ele teria mais de 1,5% de chance de acertar; chances baixas, mas não desprezíveis, principalmente quando se lida com sistemas bancários (isso porque eu estou considerando que existe um sistema eficaz pra mitigar qualquer eventual tentativa de login por força bruta).

O grande problema aqui é que os pares de números da tela de login mudam, então, ao logar de novo (mantendo a mesma senha, 123456):

1º dígito: 1 ou 5

2º dígito: 2 ou 6

3º dígito: 3 ou 8

4º dígito: 0 ou 4

5º dígito: 1 ou 5

6º dígito: 2 ou 6

Repare que, novamente, isoladamente, nós possuímos 64 possibilidades, mas existe uma interseção entre as 64 possibilidades de agora e as 64 possibilidades da primeira vez. Essa interseção é, precisamente, a sua senha.

Isso porque da primeira vez, o primeiro dígito da sua senha era 1 ou 4, e na segunda vez, era 1 ou 5. O único número comum a ambas as senhas é 1, logo já descobrimos o primeiro dígito. O segundo dígito na primeira tentativa era 2 ou 8, e na segunda tentativa, 2 ou 6. Logo, o número comum é 2, e portanto, já se descobriu o segundo dígito. Esse mesmo processo pode ser aplicado para determinar todos os demais dígitos, para qualquer senha.

Quão sério é isso?

Bastante. Por mais que existam outros mecanismos de segurança no interior do app, você permite que uma pessoa não-autorizada descubra a sua senha. Isso não é uma coisa boa de forma alguma. Se alguém conseguir controlar seu celular remotamente, o dano potencial é muito grande, principalmente porque dentro do app, boa parte das confirmações é feita usando a senha do cartão, que é possível de ser descoberta de forma ainda mais trivial usando os malwares descritos no início desse texto. De posse da senha eletrônica e da senha do cartão, as possibilidades são infinitas: um invasor consegue pagar contas e movimentar dinheiro livremente.

Como melhorar?

Desative screenshots na tela de login. O Android oferece suporte à flag LayoutParams.FLAG_SECURE que impossibilita não apenas screenshots, mas por consequência, inutiliza qualquer forma de remote broadcasting, inviabilizando qualquer invasor remoto de descobrir sua senha, mesmo sabendo os pontos de toque na tela.

Manter os pares fixos não é uma solução. Ao manter os pares de dígitos fixos, você torna ainda mais fácil para que alguém com acesso ao seu celular invada sua conta, porque basta que ela veja você digitando sua senha apenas uma vez pra conseguir passar pela tela de login.

Uma alternativa que dificultaria o acesso de eventuais invasores seria manter apenas dois botões, cada um com grupos de 5 dígitos que se alteram a cada sessão. Claro que, eventualmente, você incorreria no mesmo problema descrito acima, mas a quantidade de vezes que o invasor precisaria ver você digitando sua senha precisaria ser pelo menos duas vezes maior.

Além disso, o número de possibilidades para alguém que viu você digitando sua senha apenas uma vez é de 5⁶ = 15.625, um número quase 250 vezes maior do que o atual, o que virtualmente erradica qualquer possibilidade de alguém acessar sua conta por uma tentativa aleatória, já que as chances de acerto são de 0,0064%.

Celulares agora tem leitores biométricos. Se o objetivo é dar mais segurança para o usuário, permita que ele seja capaz de verificar o login usando a digital. Isso não só limita o acesso de invasores com acesso físico ao dispositivo, mas também elimina completamente a possibilidade de um acesso remoto por hackers.


Me espanta como conceitos aparentemente óbvios de segurança e usabilidade passam despercebidos por desenvolvedores. O app do Itaú não é o primeiro que eu vejo enfrentando problemas desse tipo, mas foi o primeiro que eu tomei a iniciativa de postar alguma coisa sobre, visto que oferece de fato um risco real.

Me irrita profundamente que empresas bilionárias contratem empresas milionárias pra criar produtos que não valem um centavo.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.