CVE-2018-5258 Writeup: aplicativo do banco Neon para iOS não valida certificados SSL
A vulnerabilidade havia sido confirmada na versão mais recente do aplicativo (1.6.14); correção foi disponibilizada na quarta-feira (17)
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.