As mensagens SMS são uma das formas mais populares de autenticação em duas etapas (2FA). Elas são utilizadas por bancos, carteiras eletrônicas e criptográficas, caixas de e-mail e diversos serviços; .
Essa situação me causa indignação, pois esse método não é seguro. A transferência de número de um cartão SIM para outro começou no início da era mobile — é assim que se recupera um número ao perder o cartão SIM. Os 'especialistas em roubo de dinheiro digital' perceberam: a opção de 'regravar o SIM' pode ser utilizada em esquemas fraudulentos. Quem controla o cartão SIM pode gerenciar tanto o internet banking alheio quanto carteiras eletrônicas e até mesmo criptomoedas. E é possível obter o número de outra pessoa através de suborno a um funcionário de telecomunicações, por meio de engano ou documentos falsificados.

Milhares de casos de SIM swapping foram revelados — assim é chamada essa fraudes. A magnitude do problema indica que em breve o mundo abandonará a 2FA via SMS. Mas isso não está acontecendo — afirmam que a escolha do método de 2FA não é feita pelos usuários, mas pelos proprietários dos serviços.
Nós oferecemos um método seguro de 2FA com entrega de códigos únicos através da blockchain e explicaremos como o proprietário do serviço pode conectá-lo.
A contagem chega a milhões
Em 2019, as fraudes por SIM swapping aumentaram 63% segundo dados da polícia de Londres, e o 'ticket médio' do criminoso foi de 4.000 GBP. Não encontrei estatísticas na Rússia, mas suponho que sejam ainda piores.
O SIM swapping é utilizado para o roubo de contas populares do Twitter, Instagram, Facebook, VK, contas bancárias, e recentemente até mesmo criptomoedas — segundo o empresário de Bitcoin, Joby Wicks. Casos notáveis de roubo de criptomoedas por meio de SIM swapping surgem na imprensa desde 2016; em 2019, houve um verdadeiro pico.
Em maio, o Ministério Público dos EUA no distrito leste de Michigan contra nove jovens com idades entre 19 e 26 anos: eles supostamente pertencem a um grupo de hackers chamado 'The Community'. Ao grupo são atribuídos sete ataques de swapping, resultando em um roubo de criptomoedas no valor superior a $2,4 milhões. E em abril, um estudante da Califórnia, Joel Ortiz, foi condenado a 10 anos de prisão por SIM swapping; seu prêmio foi de $7,5 milhões em criptomoedas.

Foto de Joel Ortiz na coletiva de imprensa da universidade. Dois anos depois, ele será preso por fraude cibernética.
Princípio de funcionamento do SIM swapping
«Swapping» significa troca. Em todos esses esquemas, os criminosos se apropriam do número de telefone da vítima, normalmente através da reemissão do cartão SIM, e o utilizam para redefinir senhas. Um típico SIM swapping teoricamente se desenrola assim:
- Investigação. Os criminosos descobrem os dados pessoais da vítima: nome e telefone. Estes podem ser encontrados em fontes abertas (redes sociais, amigos) ou obtidos de um cúmplice — funcionário da operadora de celular.
- Bloqueio. O cartão SIM da vítima é desativado; para isso, basta ligar para o suporte técnico da operadora, informar o número e dizer que o telefone foi perdido.
- Captura, transferência do número para seu próprio chip. Normalmente, isso também é feito através de um cúmplice na empresa de telecomunicações ou com a ajuda de documentos falsificados.
Na vida real, tudo é ainda mais severo. Os criminosos escolhem uma vítima e, em seguida, rastreiam diariamente a localização do telefone — uma solicitação para obter informações sobre a mudança de roaming do assinante custa 1-2 centavos. Assim que o proprietário do chip sai do país, eles negociam com o gerente da loja de telecomunicações para emitir um novo cartão SIM. Isso custa cerca de $50 (encontrei informações — em diferentes países e operadoras, de $20 a $100), e o gerente, na pior das hipóteses, será demitido — não há responsabilidade por isso.
Agora, todas as SMS serão recebidas pelos criminosos, e o proprietário do telefone não poderá fazer nada a respeito — ele está no exterior. E, em seguida, os vilões obtêm acesso a todas as contas da vítima e, se desejarem, mudam as senhas.
chances de recuperar o que foi roubado
Os bancos às vezes coadunam com as vítimas e cancelam transferências de suas contas. Portanto, é possível recuperar dinheiro fiduciário, mesmo que o criminoso não seja encontrado. Mas com carteiras de criptomoedas, tudo é mais complicado — técnica e legalmente.Até agora, nenhuma bolsa/carteira pagou compensações às vítimas de swapping.
Se os afetados quiserem lutar por seu dinheiro no tribunal, eles processam a operadora: ela criou condições para o roubo do dinheiro da conta. Foi exatamente isso que fez , que perdeu $224 milhões devido ao swapping. Ele está processando a empresa de telecomunicações AT&T agora.

Até agora, nenhum país possui esquemas funcionais para proteger legalmente os proprietários de criptomoedas. Não é possível segurar seu capital ou obter compensação por sua perda. Portanto, prevenir um ataque de sim swapping é mais fácil do que lidar com suas consequências. A maneira mais óbvia é usar um fator 'secundário' mais confiável para a 2FA.
SIM swapping não é o único problema da 2FA via SMS
Os códigos de confirmação via SMS não são seguros do ponto de vista técnico. As mensagens podem ser interceptadas devido a vulnerabilidades irreparáveis no sistema de sinalização Signaling System 7 (SS7). A 2FA por SMS é oficialmente reconhecida como insegura (o Instituto Nacional de Padrões e Tecnologia dos EUA menciona isso em seu ).
Além disso, a presença da 2FA frequentemente induz o usuário a uma falsa sensação de segurança, levando-o a escolher uma senha mais simples. Portanto, essa autenticação não dificulta, mas facilita o acesso de um invasor à conta.
E muitas vezes, os SMS chegam com grande atraso ou não chegam de forma alguma.
Outras formas de 2FA
Certamente, smartphones e SMS não são as únicas opções. Existem outros métodos de 2FA. Por exemplo, códigos TAN de uso único: um método primitivo, mas funcional — ainda é utilizado por alguns bancos. Há sistemas que utilizam dados biométricos: impressões digitais, escaneamento da íris. Outra opção, que parece um compromisso razoável entre conveniência, segurança e custo, são aplicativos especializados para 2FA: RSA Token, Google Authenticator. E também existem chaves físicas e outros métodos.
Em teoria, tudo parece lógico e seguro. Mas na prática, as soluções de 2FA modernas têm problemas que tornam a realidade diferente das expectativas.
De acordo com , o uso de 2FA é um inconveniente por si só, e a popularidade da 2FA via SMS é explicada por ser um 'menor inconveniente em comparação com outros métodos' — a obtenção de códigos de uso único é compreensível para o usuário.
Muitos usuários associam os métodos de 2FA ao medo de perder o acesso. Uma chave física ou uma lista de senhas TAN pode ser perdida ou furtada. Pessoalmente, tive uma experiência negativa com o Google Authenticator. Meu primeiro smartphone com esse aplicativo quebrou - você pode imaginar a dificuldade que tive para recuperar o acesso às minhas contas. Outro problema é a transição para um novo dispositivo. O Google Authenticator não tem a opção de exportação por razões de segurança (se as chaves podem ser exportadas, onde está a segurança?). Uma vez, transferi as chaves manualmente, mas depois decidi que era mais fácil deixar meu smartphone antigo guardado na prateleira.
O método 2FA deve ser:
- Seguro - apenas você deve ter acesso à conta, e não os atacantes
- Confiável - você deve ter acesso à conta sempre que precisar
- Confortável e acessível - usar 2FA deve ser claro e levar o mínimo de tempo
- Barato
Acreditamos que a blockchain é uma solução adequada.
Use 2FA na blockchain
Para o usuário, 2FA na blockchain parece tão simples quanto receber códigos únicos por SMS. A única diferença é o canal de entrega. O método de recebimento do código 2FA depende do que a blockchain oferece. No nosso projeto (as informações estão no meu perfil), isso é um aplicativo Web, Tor, iOS, Android, Linux, Windows, MacOS.
O serviço gera um código único e o envia para um mensageiro na blockchain. Depois, seguindo o padrão: o usuário insere o código recebido na interface do serviço e se autentica.

No artigo Eu escrevi que a blockchain garante segurança e privacidade na transmissão de mensagens. Sobre o envio de códigos 2FA, gostaria de destacar:
- Um clique para criar uma conta - sem necessidade de telefones ou emails.
- Todas as mensagens com códigos 2FA são criptografadas End-to-End usando curve25519xsalsa20poly1305.
- Ataques MITM estão excluídos - cada mensagem com um código 2FA é uma transação na blockchain e é assinada com Ed25519 EdDSA.
- A mensagem com o código 2FA é armazenada em seu bloco. A sequência e a marca temporal dos blocos não podem ser alteradas, e, portanto, a ordem das mensagens também não pode.
- Não há uma estrutura central que verifica a 'veracidade' da mensagem. Isso é feito pelo sistema distribuído de nós com base em consenso, que pertence aos usuários.
- Impossibilidade de desativação - contas não podem ser bloqueadas e mensagens não podem ser excluídas.
- Acesso aos códigos 2FA de qualquer dispositivo a qualquer momento.
- Confirmação da entrega da mensagem com o código 2FA. O serviço que envia a senha única tem certeza de que ela foi entregue. Sem botões de 'Enviar novamente'.
Para comparação com alguns outros métodos de 2FA, eu criei uma tabela:

A conta no mensageiro blockchain para receber os códigos é criada em segundos — para o login, usa-se apenas a senha. Portanto, as formas de uso podem ser diferentes: é possível usar uma única conta para receber códigos para todos os serviços, ou criar uma conta separada para cada serviço.
Há uma desvantagem — a conta deve ter pelo menos uma transação. Para que o usuário receba uma mensagem criptografada com o código, é necessário conhecer sua chave pública, a qual aparece no blockchain somente após a primeira transação. Nós encontramos uma solução: permitimos que os usuários recebam tokens gratuitos na carteira. No entanto, uma solução mais correta seria nomear a conta pela chave pública. (Para comparação, nosso número de conta U1467838112172792705 é derivado da chave pública cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. Para o mensageiro, isso é mais conveniente e legível, enquanto para o sistema de envio de códigos 2FA — é uma limitação). Acredito que no futuro alguém fará tal solução e transformará “Conveniência e Acessibilidade” em uma zona verde.
O custo do envio do código 2FA é realmente baixo — 0.001 ADM, atualmente isso equivale a 0.00001 USD. Novamente, você pode lançar seu próprio blockchain e tornar o custo zero.
Como conectar o 2FA no blockchain ao seu serviço
Espero ter conseguido interessar alguns leitores a adicionar a autenticação via blockchain em seus serviços.
Eu explicarei como fazer isso usando o exemplo do nosso mensageiro, e de forma análoga, você pode usar qualquer outro blockchain. No aplicativo demo de 2FA, utilizamos postgresql10 para armazenar informações sobre as contas.
Etapas de integração:
- Crie uma conta no blockchain, de onde você enviará os códigos 2FA. Você receberá uma senha, que é usada como chave privada para criptografar mensagens com os códigos e para assinar transações.
- Adicione ao seu servidor um script para gerar códigos 2FA. Se você já usa qualquer outro método de 2FA com entrega de senhas temporárias, esta etapa já foi concluída.
- Adicione ao seu servidor um script para enviar códigos ao usuário no mensageiro blockchain.
- Crie uma interface de usuário para enviar e inserir o código 2FA. Se você já usa qualquer outro método de 2FA com entrega de senhas temporárias, esta etapa já foi concluída.
1 Criação de Conta
A criação de conta na blockchain envolve a geração de uma chave privada, uma chave pública e um endereço de conta derivado.

Primeiro, uma frase-secreta BIP39 é gerada, a partir da qual um hash SHA-256 é calculado. O hash é usado para gerar a chave privada ks e a chave pública kp. A partir da chave pública, obtemos o endereço na blockchain utilizando o mesmo SHA-256 com inversão.
Se você deseja enviar códigos 2FA a partir de uma nova conta a cada vez, o código para criar a 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 os códigos dela. Na maioria dos casos, isso é 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.

2 Geração de Códigos 2FA
O código 2FA deve ser gerado para cada entrada do usuário. Nós usamos a biblioteca , mas você pode escolher qualquer outra.
const hotp = speakeasy.hotp({
counter,
secret: account.seSecretAscii,
});
Verificação de validade do código 2FA inserido pelo usuário:
se2faVerified = speakeasy.hotp.verify({
counter: this.seCounter,
secret: this.seSecretAscii,
token: hotp,
});
3 Envio do Código 2FA
Para enviar o código 2FA, você pode usar a API do nó blockchain, a biblioteca JS API ou o console. Neste exemplo, usamos o console — uma Interface de Linha de Comando, uma ferramenta que facilita a interação com a blockchain. Para enviar uma mensagem com o código 2FA, você precisa usar o comando send message do console.
const util = require('util');
const exec = util.promisify(require('child_process').exec);
…
const command = `adm send message ${adamantAddress} "código 2FA: ${hotp}"`;
let { error, stdout, stderr } = await exec(command);
Uma maneira alternativa de enviar mensagens é usar o método send na biblioteca JS API.
4 Interface do Usuário
Os usuários devem ter a opção de inserir o código 2FA, o que pode ser realizado de várias maneiras, dependendo da plataforma do seu aplicativo. No nosso exemplo, é o Vue.

O código-fonte do aplicativo de demonstração de autenticação de dois fatores na blockchain pode ser encontrado em . No Readme há um link para a demonstração ao vivo, para você experimentar.
Fonte: habr.com
