Atualização (17/01/2018): foi disponibilizada hoje na App Store a versão 1.6.15 do aplicativo, que corrige a falha. O conteúdo original deste texto, a seguir, foi mantido.


Enquanto realizava alguns testes com aplicativos mobile no mês passado, me chamou a atenção o fato de que eu estava conseguindo interceptar, com o Burp Proxy, tráfego HTTPS associado ao aplicativo do banco Neon, muito embora o certificado SSL gerado pela ferramenta não estivesse instalado no meu dispositivo.

Este tipo de vulnerabilidade é identificado pelo projeto CWE (Common Weakness Enumeration) como CWE-295: Improper Certificate Validation.

Uma particularidade do Neon é que ele implementa, além da SSL, uma camada própria de criptografia, a qual precisei estudar para avaliar o risco representado pela falha. Encontrei fraquezas e confirmei que esta proteção adicional não impede a exploração da vulnerabilidade.

Elaborei um advisory e o enviei para a Full Disclosure. Publiquei também no Gist para que ele pudesse ser acessado antes de ser aprovado na lista, e o incluí no final deste texto.

Detalhes

Interceptando requisições do Neon com o Burp Proxy

O aplicativo não verifica os certificados SSL dos domínios webapimethods.banconeon.com.br e servicos.banconeon.com.br, permitindo que um atacante intercepte as requisições silenciosamente via man-in-the-middle.

Um dos grandes problemas com o esquema de criptografia próprio do Neon é o uso de uma chave AES enviada pelo servidor ao cliente no momento em que o usuário efetua o login para criptografar dados sensíveis que são enviados e recebidos nas requisições. Ocorre que, apesar desta chave estar criptografada com RSA no momento da transmissão, as chaves privadas necessárias para descriptografá-la são fixas e estão presentes no código do aplicativo, de onde poderiam ser facilmente extraídas por um atacante por meio de técnicas de engenharia reversa.

Durante os testes, uma possibilidade que chamou a atenção foi a de interceptar o nome do usuário, número completo, data de registro, validade e CVV do cartão virtual na requisição ao endpoint //v1/Card/GetCards.

A seguir, incluo um exemplo de JSON enviado como resposta por este endpoint, já descriptografado com a chave capturada durante o login. Para fins de publicação, substituí os dados sensíveis pelas sequências de “x” em negrito. É importante destacar que o número do cartão virtual aparece completo, junto com todas as outras informações que um atacante necessitaria para utilizá-lo.

{
   "Success":true,
   "Message":{
      "Title":"Atenção",
      "Message":"Sucesso!",
      "MessageId":0
   },
   "Data":{
      "HasPassword":true,
      "Cards":[
         {
            "EmbossingName":"xxxxxxxxxxxxxxx",
            "CardStatusApp":5,
            "CardType":2,
            "IdCardConductor":xxxxxx,
            "Id":xxxxxx,
            "CardNumber":"xxxx xxxx xxxx xxxx",
            "RegisterDate":"xx/xx/xxxx",
            "ValidThru":"xx/xx",
            "CVV":"xxx"
         },
         {
            "EmbossingName":"xxxxxxxxxxxxxxx",
            "CardStatusApp":5,
            "CardType":1,
            "IdCardConductor":xxxxxx,
            "Id":xxxxxx,
            "CardNumber":"xxxx",
            "RegisterDate":"xx/xx/xxxx",
            "ValidThru":"xx/xx",
            "CVV":null
         }
      ],
      "HasMultipleCard":true
   }
}

Notificação

Após confirmar que um atacante poderia usar a falha para obter dados sensíveis dos usuários do aplicativo, notifiquei o banco. Meu e-mail, enviado para oi@banconeon.com.br — na falta de um canal específico para tratar sobre segurança — no último dia 30 de dezembro, não foi respondido.

Em 6 de janeiro, reencaminhei a mensagem. No mesmo dia, recebi resposta de agradecimento, com a afirmação de que o relatório seria repassado à equipe de desenvolvimento. A informação era acompanhada pelo conteúdo dos e-mails que enviei tanto no dia 6 quanto no dia 30, evidenciando que ambos foram recebidos. Muito embora eu houvesse solicitado, não foi oferecida uma previsão para a correção da falha.

No último sábado (13), enviei um novo e-mail informando sobre a atribuição do identificador CVE-2018–5258 à vulnerabilidade e a minha intenção de publicar os detalhes hoje (15), uma vez que já havia decorrido tempo razoável desde a primeira notificação. Recebi resposta reiterando os agradecimentos e que o caso estava sendo investigado pela equipe de desenvolvimento.

Ainda não foi disponibilizada atualização com a correção para a falha

Ainda hoje, às 8h30min da manhã, já após o envio do advisory para a Full Disclosure, recebi um e-mail do Júlio Dário, CTO do Neon, informando que “o referido bug já estava mapeado em nosso backlog e que a correção já foi efetuada”. No entanto, até o momento da publicação deste texto, não foi lançada uma nova versão do aplicativo na App Store. A mais recente disponível, 1.6.14, lançada há três semanas, é a mesma na qual a falha foi estudada e confirmada.


Advisory