Hacking com Unicode (no exemplo do GitHub)

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() // 'ss' 'ß'.toLowerCase() === 'SS'.toLowerCase() // true // Note the Turkish dotless i 'John@Gıthub.com'.toUpperCase() === 'John@Github.com'.toUpperCase() 

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.

AssinarPonto de códigoResultado
ß0x00DFSS
ı0x0131I
ſ0x017FS
0xFB00FF
fi0xFB01FI
fl0xFB02FL
0xFB03FFI
0xFB04FFL
0xFB05ST
0xFB06ST
K0x212Ak

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:

  1. O endereço digitado está em minúsculas usando o método toLowerCase.
  2. O endereço digitado é comparado com o endereço no banco de dados de usuários registrados.
  3. 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.comxn—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.






Source: https://habr.com/ru/post/pt481318/


All Articles