Mude para 2FA seguro no blockchain

As mensagens SMS são o método mais popular de autenticação de dois fatores (2FA). É utilizado por bancos, carteiras eletrônicas e criptográficas, caixas de correio e todo tipo de serviços; o número de usuários do método está se aproximando de 100%.

Estou indignado com este cenário, porque este método não é seguro. A reatribuição de um número de um cartão SIM para outro começou no início da era móvel - é assim que o número é restaurado quando um cartão SIM é perdido. “Especialistas em roubo de dinheiro digital” perceberam que a opção “reescrever cartão SIM” pode ser usada em esquemas fraudulentos. Afinal, quem controla o cartão SIM pode controlar o banco online, as carteiras eletrônicas e até a criptomoeda de outras pessoas. E você pode tomar posse do número de outra pessoa subornando um funcionário de telecomunicações, usando fraude ou documentos falsificados.

Mude para 2FA seguro no blockchain

Milhares de episódios de troca de SIM foram descobertos, como é chamado esse esquema de fraude. A escala do desastre sugere que o mundo abandonará em breve o 2FA via SMS. Mas isso não acontece - em Pesquisa dizem que não são os usuários que escolhem o método 2FA, mas os proprietários do serviço.

Propomos usar o método 2FA seguro com entrega de códigos únicos por meio do blockchain e diremos como o proprietário do serviço pode conectá-lo.

A contagem chega a milhões

Em 2019, a fraude de troca de SIM aumentou 63%, de acordo com a polícia de Londres, e a “fatura média” de um invasor foi de 4,000 libras esterlinas. Não encontrei nenhuma estatística na Rússia, mas presumo que sejam ainda piores.

A troca de SIM é usada para roubar contas populares do Twitter, Instagram, Facebook, VK, contas bancárias e, recentemente, até criptomoedas - O jornal The Times relata de acordo com o empresário Bitcoin Joby Weeks. Casos de roubo de criptomoedas usando troca de SIM têm surgido na imprensa desde 2016; 2019 viu um verdadeiro pico.

Em maio, a Procuradoria dos EUA para o Distrito Leste de Michigan apresentou acusações nove jovens com idades entre 19 e 26 anos: acredita-se que façam parte de uma gangue de hackers chamada “A Comunidade”. A gangue é acusada de sete ataques de swap, em que os hackers roubaram criptomoedas no valor de mais de US$ 2,4 milhões. E em abril, o estudante californiano Joel Ortiz recebeu 10 anos de prisão por troca de SIM; sua produção foi de US$ 7.5 milhões em criptomoedas.

Mude para 2FA seguro no blockchain
Foto de Joel Ortiz em entrevista coletiva universitária. Dois anos depois, ele será detido por fraude cibernética.

Como funciona a troca de SIM

“Swaping” significa troca. Em todos esses esquemas, os criminosos assumem o número de telefone da vítima, geralmente através da reemissão de um cartão SIM, e usam-no para redefinir a senha. Uma troca de SIM típica, em teoria, é assim:

  1. Serviço de inteligência. Os fraudadores descobrem as informações pessoais da vítima: nome e telefone. Eles podem ser encontrados em fontes abertas (redes sociais, amigos) ou recebidos de um cúmplice - funcionário de uma operadora móvel.
  2. Bloqueio. O cartão SIM da vítima está desativado; Para isso, basta ligar para o suporte técnico da operadora, fornecer o número e dizer que o telefone foi perdido.
  3. Capture, transfira o número para o seu cartão SIM. Normalmente isso também é feito por meio de cúmplice da empresa de telecomunicações ou por meio de falsificação de documentos.

Na vida real as coisas são ainda mais graves. Os invasores selecionam uma vítima e rastreiam a localização do telefone diariamente - uma solicitação para receber informações de que o assinante mudou para roaming custa de 1 a 2 centavos. Assim que o dono do cartão SIM vai para o exterior, ele negocia com o gerente da loja de comunicação a emissão de um novo cartão SIM. Custa cerca de US$ 50 (encontrei informações - em diferentes países e com diferentes operadoras de US$ 20 a US$ 100), e na pior das hipóteses o gerente será demitido - não há responsabilidade por isso.

Agora todos os SMS serão recebidos pelos invasores e o dono do telefone não poderá fazer nada a respeito - ele está no exterior. E então os vilões ganham acesso a todas as contas da vítima e alteram as senhas se desejarem.

Chances de devolver bens roubados

Os bancos por vezes acomodam as vítimas a meio caminho e retiram transferências das suas contas. Portanto, é possível devolver dinheiro fiduciário mesmo que o criminoso não seja encontrado. Mas com carteiras de criptomoedas tudo é mais complicado – e tecnicamentee legislativamente. Até agora, nem uma única exchange/carteira pagou indenização às vítimas de swap.

Se as vítimas querem defender o seu dinheiro em tribunal, culpam o operador: ele criou as condições para o roubo do dinheiro da conta. Foi exatamente isso que eu fiz Michael Turpin, que perdeu US$ 224 milhões devido à troca. Ele agora está processando a empresa de telecomunicações AT&T.

Mude para 2FA seguro no blockchain

Até agora, nenhum estado possui esquemas funcionais para proteger legalmente os proprietários de criptomoedas. É impossível segurar seu capital ou receber indenização por sua perda. Portanto, prevenir um ataque de troca é mais fácil do que lidar com suas consequências. A maneira mais óbvia é usar um “segundo fator” mais confiável para 2FA.

A troca de SIM não é o único problema com 2FA via SMS

Os códigos de confirmação em SMS também não são seguros do ponto de vista técnico. As mensagens podem ser interceptadas devido a vulnerabilidades não corrigidas no Signaling System 7 (SS7). 2FA sobre SMS é oficialmente reconhecido como inseguro (o Instituto Nacional de Padrões e Tecnologia dos EUA afirma isso em seu Guia de autenticação digital).

Ao mesmo tempo, a presença de 2FA muitas vezes dá ao usuário uma sensação de falsa segurança, e ele escolhe uma senha mais simples. Portanto, tal autenticação não dificulta, mas facilita o acesso de um invasor à conta.

E muitas vezes os SMS chegam com muito atraso ou nem chegam.

Outros métodos 2FA

Claro, a luz não convergiu para smartphones e SMS. Existem outros métodos de 2FA. Por exemplo, códigos TAN únicos: um método primitivo, mas funciona - ainda é usado em alguns bancos. Existem sistemas que utilizam dados biométricos: impressões digitais, exames de retina. Outra opção que parece um compromisso razoável em termos de conveniência, confiabilidade e preço são os aplicativos especiais para 2FA: Token RSA, Google Authenticator. Existem também chaves físicas e outros métodos.

Em teoria, tudo parece lógico e confiável. Mas, na prática, as soluções 2FA modernas apresentam problemas e, por causa deles, a realidade difere das expectativas.

Conforme pesquisa, o uso de 2FA é, em princípio, um inconveniente, e a popularidade do 2FA via SMS é explicada por “menos inconvenientes em comparação com outros métodos” - o recebimento de códigos únicos é compreensível para o usuário.

Os usuários associam muitos métodos 2FA ao medo de perda de acesso. A chave física ou lista de senhas TAN pode ser perdida ou roubada. Pessoalmente, tive experiências ruins com o Google Authenticator. Meu primeiro smartphone com este aplicativo quebrou. Agradeço meus esforços para restaurar o acesso às minhas contas. Outro problema é mudar para um novo dispositivo. O Google Authenticator não tem opção de exportação por motivos de segurança (se as chaves podem ser exportadas, que segurança existe?). Uma vez carreguei as chaves manualmente e decidi que era mais fácil deixar o smartphone antigo em uma caixa na prateleira.

O método 2FA deve ser:

  • Seguro - somente você e não invasores devem obter acesso à sua conta
  • Confiável – você obtém acesso à sua conta sempre que precisar
  • Conveniente e acessível – usar 2FA é claro e leva um tempo mínimo
  • Barato

Acreditamos que o blockchain é a solução certa.

Use 2FA no blockchain

Para o usuário, 2FA no blockchain parece o mesmo que receber códigos únicos via SMS. A única diferença é o canal de entrega. O método para obter um código 2FA depende do que o blockchain oferece. No nosso projeto (as informações estão no meu perfil) esta é uma aplicação Web, Tor, iOS, Android, Linux, Windows, MacOS.

O serviço gera um código único e o envia ao mensageiro no blockchain. Depois siga os clássicos: o usuário insere o código recebido na interface do serviço e faz login.

Mude para 2FA seguro no blockchain

o artigo Como funciona um mensageiro descentralizado no blockchain? Escrevi que o blockchain garante a segurança e a privacidade da transmissão de mensagens. Sobre a questão do envio de códigos 2FA, destaco:

  • Um clique para criar uma conta - sem telefones ou e-mails.
  • Todas as mensagens com códigos 2FA são criptografadas curva ponta a ponta25519xsalsa20poly1305.
  • O ataque MITM está excluído - cada mensagem com o código 2FA é uma transação no blockchain e é assinada por Ed25519 EdDSA.
  • A mensagem com o código 2FA termina em um bloco próprio. A sequência e o carimbo de data/hora dos blocos não podem ser corrigidos e, portanto, a ordem das mensagens.
  • Não existe uma estrutura central que verifique a “autenticidade” de uma mensagem. Isso é feito por um sistema distribuído de nós baseado em consenso e é de propriedade dos usuários.
  • Não pode ser desativado - as contas não podem ser bloqueadas e as mensagens não podem ser excluídas.
  • Acesse códigos 2FA de qualquer dispositivo a qualquer momento.
  • Confirmação de entrega de mensagem com código 2FA. O serviço que envia a senha de uso único sabe com certeza que ela foi entregue. Não há botões “Enviar novamente”.

Para comparar com alguns outros métodos 2FA, fiz uma tabela:

Mude para 2FA seguro no blockchain

O usuário recebe uma conta no mensageiro blockchain para receber códigos em um segundo – apenas uma senha é usada para fazer login. Portanto, os métodos de aplicação podem ser diferentes: você pode usar uma conta para receber códigos para todos os serviços ou pode criar uma conta separada para cada serviço.

Há também um inconveniente - a conta deve ter pelo menos uma transação. Para que o usuário receba uma mensagem criptografada com um código, é necessário conhecer sua chave pública, e ela aparece no blockchain apenas na primeira transação. Foi assim que conseguimos sair dessa: demos a eles a oportunidade de receber tokens grátis em suas carteiras. No entanto, uma solução melhor é nomear a conta como uma chave pública. (Para comparação, temos um número de conta U1467838112172792705 é um derivado da chave pública cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. Para o mensageiro isso é mais conveniente e legível, mas para o sistema de envio de códigos 2FA é uma limitação). Acho que no futuro alguém tomará essa decisão e moverá “Conveniência e Acessibilidade” para a zona verde.

O preço de envio de um código 2FA é muito baixo - 0.001 ADM, agora é 0.00001 USD. Novamente, você pode aumentar seu blockchain e zerar o preço.

Como conectar 2FA no blockchain ao seu serviço

Espero ter conseguido interessar alguns leitores para adicionar autorização blockchain aos seus serviços.

Vou lhe dizer como fazer isso usando nosso messenger como exemplo e, por analogia, você pode usar outro blockchain. No aplicativo de demonstração 2FA, usamos postgresql10 para armazenar informações da conta.

Estágios de conexão:

  1. Crie uma conta no blockchain a partir da qual você enviará códigos 2FA. Você receberá uma senha, que será usada como chave privada para criptografar mensagens com códigos e assinar transações.
  2. Adicione um script ao seu servidor para gerar códigos 2FA. Se você já estiver usando qualquer outro método 2FA com entrega de senha única, você já concluiu esta etapa.
  3. Adicione um script ao seu servidor para enviar códigos ao usuário no blockchain messenger.
  4. Crie uma interface de usuário para enviar e inserir um código 2FA. Se você já estiver usando qualquer outro método 2FA com entrega de senha única, você já concluiu esta etapa.

1 Crie uma conta

Criar uma conta no blockchain significa gerar uma chave privada, uma chave pública e um endereço de conta derivado.

Mude para 2FA seguro no blockchain

Primeiro, a senha BIP39 é gerada e o hash SHA-256 é calculado a partir dela. O hash é usado para gerar a chave privada ks e a chave pública kp. A partir da chave pública, utilizando o mesmo SHA-256 com inversão, obtemos o endereço no blockchain.

Se você quiser enviar códigos 2FA sempre de uma nova conta, o código de criação da conta precisará ser adicionado ao servidor:

import Mnemonic from 'bitcore-mnemonic'
this.passphrase = new Mnemonic(Mnemonic.Words.ENGLISH).toString()

…

import * as bip39 from 'bip39'
import crypto from 'crypto'

adamant.createPassphraseHash = function (passphrase) {
  const seedHex = bip39.mnemonicToSeedSync(passphrase).toString('hex')
  return crypto.createHash('sha256').update(seedHex, 'hex').digest()
}

…

import sodium from 'sodium-browserify-tweetnacl'

adamant.makeKeypair = function (hash) {
  var keypair = sodium.crypto_sign_seed_keypair(hash)
  return {
    publicKey: keypair.publicKey,
    privateKey: keypair.secretKey
  }
}

…

import crypto from 'crypto'

adamant.getAddressFromPublicKey = function (publicKey) {
  const publicKeyHash = crypto.createHash('sha256').update(publicKey, 'hex').digest()
  const temp = Buffer.alloc(8)
  for (var i = 0; i < 8; i++) {
    temp[i] = publicKeyHash[7 - i]
  }
  return 'U' + bignum.fromBuffer(temp).toString()
}

No aplicativo de demonstração, simplificamos - criamos uma conta no aplicativo web e enviamos códigos a partir dela. Na maioria dos casos, isso também é mais conveniente para o usuário: ele sabe que o serviço envia códigos 2FA de uma conta específica e pode nomeá-la.

Mude para 2FA seguro no blockchain

2 Gerando códigos 2FA

Um código 2FA deve ser gerado para cada login de usuário. Usamos a biblioteca speakeasy, mas você pode escolher qualquer outro.

const hotp = speakeasy.hotp({
  counter,
  secret: account.seSecretAscii,
});

Verificando a validade do código 2FA inserido pelo usuário:

se2faVerified = speakeasy.hotp.verify({
  counter: this.seCounter,
  secret: this.seSecretAscii,
  token: hotp,
});

3 Envio de código 2FA

Para enviar um código 2FA, você pode usar a API do nó blockchain, a biblioteca JS API ou o console. Neste exemplo, usamos o console - esta é a Command Line Interface, um utilitário que simplifica a interação com o blockchain. Para enviar uma mensagem com código 2FA, você precisa usar o comando send message console.

const util = require('util');
const exec = util.promisify(require('child_process').exec);

…

const command = `adm send message ${adamantAddress} "2FA code: ${hotp}"`;
let { error, stdout, stderr } = await exec(command);

Uma forma alternativa de enviar mensagens é usar o método send na biblioteca da API JS.

4 Interface do usuário

O usuário precisa ter a opção de inserir um código 2FA, isso pode ser feito de diferentes maneiras dependendo da plataforma de sua aplicação. Em nosso exemplo, este é o Vue.

Mude para 2FA seguro no blockchain

O código-fonte do aplicativo de demonstração de autenticação de dois fatores blockchain pode ser visualizado em GitHub. Há um link no Leiame para uma demonstração ao vivo para experimentar.

Fonte: habr.com

Adicionar um comentário