Unicode é excepcionalmente complexo. Poucas pessoas conhecem
todos os truques : de caracteres invisíveis e caracteres de controle a pares substitutos e emojis combinados (ao adicionar dois caracteres resulta em um terceiro). O padrão inclui 2
16 posições de código em 17
planos . De fato, aprender Unicode pode ser comparado a aprender uma linguagem de programação separada.
Não é de surpreender que os desenvolvedores da web ignorem algumas das nuances. Por outro lado, os invasores podem usar os recursos do Unicode para seus próprios fins, o que eles fazem.
O especialista em segurança John Gracie
demonstrou um exemplo de um bug de verificação de email do
GitHub para recuperar uma senha esquecida. Erros semelhantes podem ser encontrados em outros sites.
John Gracie explica o que é uma "colisão de tradução de sinais" quando dois caracteres diferentes após a conversão são traduzidos para o mesmo caractere.
Nesse caso, ele usou o caractere turco 'ı' ('i' sem um ponto), que é traduzido para o latim 'i', para que o endereço de email
John@Gıthub.com
após o processamento se transforme em
John@Github.com
:
'ß'.toLowerCase()
Tais colisões podem ser encontradas em todos os planos Unicode: aqui está a
lista completa .
Estamos interessados principalmente nos caracteres traduzidos para caracteres latinos. Existem apenas onze opções. Em terceiro lugar na tabela, há apenas o sinal turco 'i' sem um ponto.
O GitHub permitiu que um invasor obtivesse uma senha da conta de outra pessoa, porque o procedimento para recuperar uma senha esquecida não funcionou corretamente.
Como parte deste procedimento, o endereço de email inserido foi comparado com o endereço armazenado no banco de dados. Algoritmo de verificação:
- O endereço digitado está em minúsculas usando o método toLowerCase.
- O endereço digitado é comparado com o endereço no banco de dados de usuários registrados.
- Se uma correspondência for encontrada, a senha do banco de dados será enviada para o endereço digitado .
Obviamente, os desenvolvedores não estavam cientes da colisão da conversão de endereços ao usar o método
toLowerCase
.
Nesse caso, corrigir o erro é simples. Basta enviar a senha não para o endereço digitado, mas para o endereço do banco de dados.
Obviamente, essa não é uma correção completa de bug, mas apenas uma correção rápida. Uma solução mais completa seria transmitir para o Punycode para verificação:
John@Gıthub.com
→
xn—john@gthub-2ub.com
. O Punycode foi projetado para converter exclusivamente nomes de domínio em uma sequência de caracteres ASCII. O endereço de email pode ser verificado da mesma maneira, mas a maioria dos aplicativos da Web não.
John Gracie recebeu uma recompensa em dinheiro e
2500 pontos pela vulnerabilidade, embora ainda esteja longe do principal hacker do Github
Alexander Dobkin <img src = 404 onerror = alert (document.domain)> : um usuário com um nome tão incomum já ganhou 30.750 pontos, inclusive para executar código arbitrário nos servidores GitHub que geram páginas do GitHub.
O Messenger falha ao receber o emoji de ponto preto (Messenger no iOS, WhatsApp para Android)Os erros relacionados ao Unicode possuem uma propriedade que pode ser encontrada em qualquer aplicativo que processe o texto digitado pelo usuário. Existem vulnerabilidades em aplicativos da web e em programas nativos para Android e iOS. Um dos mais famosos foi o
bug do iOS de 2015 , quando vários caracteres Unicode em uma mensagem de texto causaram uma falha no sistema operacional. No ano passado, um bug Unicode semelhante foi descoberto no iOS 11.3, conhecido como
"ponto preto" . Ocorreu uma falha semelhante no aplicativo WhatsApp para Android quando você toca no emoji.

