Move para asegurar 2FA na cadea de bloques

As mensaxes SMS son o método máis popular de autenticación de dous factores (2FA). É utilizado por bancos, carteiras electrónicas e criptográficas, caixas de correo e todo tipo de servizos; o número de usuarios do método achégase ao 100%.

Estou indignado por este escenario, porque este método non é seguro. A reasignación dun número dunha tarxeta SIM a outra comezou a principios da era dos móbiles; así é como se restaura o número cando se perde unha tarxeta SIM. Os "especialistas en roubo de diñeiro dixital" decatáronse de que a opción de "reescribir a tarxeta SIM" pode usarse en esquemas fraudulentos. Despois de todo, quen controla a tarxeta SIM pode controlar a banca en liña doutras persoas, as carteiras electrónicas e incluso as criptomoedas. E podes tomar posesión do número doutra persoa subornando a un empregado de telecomunicacións, usando enganos ou documentos falsificados.

Move para asegurar 2FA na cadea de bloques

Descubrironse miles de episodios de intercambio de SIM, como se chama este esquema de fraude. A magnitude do desastre suxire que o mundo pronto abandonará 2FA por SMS. Pero isto non ocorre - en investigación din que non son os usuarios os que elixen o método 2FA, senón os propietarios dos servizos.

Propoñémosche usar o método seguro 2FA con entrega de códigos únicos a través da cadea de bloques, e dirémosche como pode conectar o propietario do servizo.

A conta vai en millóns

En 2019, a fraude de intercambio de SIM aumentou un 63 % segundo a policía de Londres, e a "factura media" dun atacante foi de 4,000 GBP. Non atopei ningunha estatística en Rusia, pero supoño que son aínda peores.

O intercambio de SIM úsase para roubar contas populares de Twitter, Instagram, Facebook, VK, contas bancarias e, recentemente, incluso criptomoedas. O xornal The Times informa segundo o empresario de Bitcoin Joby Weeks. Desde 2016 aparecen na prensa casos destacados de roubo de criptomoedas mediante o intercambio de SIM; 2019 viu un verdadeiro pico.

En maio, a Oficina do Fiscal dos Estados Unidos para o Distrito Leste de Michigan presentou cargos nove mozos de entre 19 e 26 anos: crese que forman parte dunha banda de hackers chamada "The Community". A banda está acusada de sete ataques de intercambio, como resultado dos cales os hackers roubaron criptomonedas por valor de máis de 2,4 millóns de dólares. E en abril, o estudante californiano Joel Ortiz recibiu 10 anos de prisión por troco de SIM; a súa produción foi de 7.5 millóns de dólares en criptomoedas.

Move para asegurar 2FA na cadea de bloques
Foto de Joel Ortiz nunha rolda de prensa universitaria. Dous anos despois será detido por fraude cibernético.

Como funciona o intercambio de SIM

"Intercambio" significa intercambio. En todos estes esquemas, os criminais asumen o número de teléfono da vítima, normalmente mediante a reemisión dunha tarxeta SIM, e utilízano para restablecer o contrasinal. Un intercambio de SIM típico en teoría é así:

  1. Servizo de intelixencia. Os defraudadores descobren a información persoal da vítima: nome e número de teléfono. Pódense atopar en fontes abertas (redes sociais, amigos) ou recibirse dun cómplice: un empregado dun operador móbil.
  2. Bloqueo. A tarxeta SIM da vítima está desactivada; Para iso, só tes que chamar ao soporte técnico do provedor, proporcionar o número e dicir que se perdeu o teléfono.
  3. Captura, transfire o número á túa tarxeta SIM. Normalmente isto tamén se fai a través dun cómplice da empresa de telecomunicacións ou mediante falsificación de documentos.

Na vida real as cousas son aínda máis graves. Os atacantes seleccionan unha vítima e despois rastrexan a localización do teléfono diariamente: unha solicitude para recibir información de que o abonado cambiou a itinerancia custa entre 1 e 2 céntimos. En canto o propietario da tarxeta SIM marcha ao estranxeiro, negocian co xestor da tenda de comunicación para emitir unha nova tarxeta SIM. Custa uns 50 dólares (atopei información -en diferentes países e con diferentes operadores de 20 a 100 dólares), e no peor dos casos o director será despedido - non hai ningunha responsabilidade por isto.

Agora os atacantes recibirán todas as SMS e o propietario do teléfono non poderá facer nada respecto diso: está no estranxeiro. E entón os viláns acceden a todas as contas da vítima e cambian os contrasinais se o desexan.

Posibilidades de devolver os bens roubados

Os bancos ás veces acomodan ás vítimas á metade e retiran as transferencias das súas contas. Polo tanto, é posible devolver diñeiro fiduciario aínda que non se atope o criminal. Pero coas carteiras de criptomonedas todo é máis complicado - e tecnicamente, e lexislativamente. Ata o momento, nin un só intercambio / carteira pagou unha compensación ás vítimas do intercambio.

Se as vítimas queren defender o seu diñeiro no xulgado, culpan ao operador: el creou as condicións para o roubo de diñeiro da conta. Iso é exactamente o que fixen Michael Turpin, que perdeu 224 millóns de dólares debido ao intercambio. Agora demanda á empresa de telecomunicacións AT&T.

Move para asegurar 2FA na cadea de bloques

Ata agora, ningún estado ten esquemas de traballo para protexer legalmente os propietarios de criptomoedas. É imposible asegurar o seu capital ou recibir compensación pola súa perda. Polo tanto, evitar un ataque de intercambio é máis fácil que xestionar as súas consecuencias. A forma máis obvia é usar un "segundo factor" máis fiable para 2FA.

O intercambio de SIM non é o único problema con 2FA por SMS

Os códigos de confirmación en SMS tamén son inseguros desde o punto de vista técnico. As mensaxes pódense interceptar debido a vulnerabilidades sen parches en Signaling System 7 (SS7). 2FA a través de SMS está oficialmente recoñecido como inseguro (o Instituto Nacional de Estándares e Tecnoloxía dos EUA di isto no seu Guía de autenticación dixital).

Ao mesmo tempo, a presenza de 2FA adoita darlle ao usuario unha sensación de seguridade falsa e elixe un contrasinal máis sinxelo. Polo tanto, tal autenticación non dificulta, pero facilita que un atacante acceda á conta.

E moitas veces os SMS chegan con moito atraso ou non chegan en absoluto.

Outros métodos 2FA

Por suposto, a luz non converxeu nos teléfonos intelixentes e nos SMS. Hai outros métodos de 2FA. Por exemplo, códigos TAN únicos: un método primitivo, pero funciona - aínda se usa nalgúns bancos. Existen sistemas que utilizan datos biométricos: pegadas dixitais, exploracións da retina. Outra opción que parece un compromiso razoable en canto a comodidade, fiabilidade e prezo son as aplicacións especiais para 2FA: RSA Token, Google Authenticator. Tamén hai claves físicas e outros métodos.

En teoría, todo parece lóxico e fiable. Pero na práctica, as solucións 2FA modernas teñen problemas e, por mor deles, a realidade difire das expectativas.

Conforme investigación, o uso de 2FA é un inconveniente en principio, e a popularidade de 2FA a través de SMS explícase por "menos inconvenientes en comparación con outros métodos": recibir códigos únicos é comprensible para o usuario.

Os usuarios asocian moitos métodos 2FA co medo de que se perda o acceso. Pódese perder ou roubar a clave física ou a lista de contrasinais TAN. Persoalmente, tiven malas experiencias con Google Authenticator. O meu primeiro teléfono intelixente con esta aplicación avariaba: agradezo os meus esforzos para restaurar o acceso ás miñas contas. Outro problema é cambiar a un dispositivo novo. Google Authenticator non ten unha opción de exportación por motivos de seguridade (se as chaves se poden exportar, que seguridade hai?). Unha vez que levei as chaves manualmente, e entón decidín que era máis fácil deixar o vello teléfono intelixente nunha caixa nun estante.

O método 2FA debe ser:

  • Seguro: só ti e non os atacantes deberías acceder á túa conta
  • Fiable: tes acceso á túa conta sempre que o necesites
  • Cómodo e accesible: usar 2FA é claro e leva un tempo mínimo
  • Barato

Cremos que a cadea de bloques é a solución correcta.

Use 2FA na cadea de bloques

Para o usuario, 2FA na cadea de bloques ten o mesmo aspecto que recibir códigos únicos por SMS. A única diferenza é a canle de entrega. O método para obter un código 2FA depende do que ofreza a cadea de bloques. No noso proxecto (a información está no meu perfil) trátase dunha aplicación web, Tor, iOS, Android, Linux, Windows, MacOS.

O servizo xera un código único e envíao ao mensaxeiro na cadea de bloques. A continuación, siga os clásicos: o usuario introduce o código recibido na interface de servizo e inicia sesión.

Move para asegurar 2FA na cadea de bloques

O artigo Como funciona un mensaxeiro descentralizado na cadea de bloques? Escribín que a cadea de bloques garante a seguridade e privacidade da transmisión de mensaxes. Sobre o tema do envío de códigos 2FA, destacarei:

  • Un clic para crear unha conta, sen teléfonos nin correos electrónicos.
  • Todas as mensaxes con códigos 2FA están cifradas de extremo a extremo curve25519xsalsa20poly1305.
  • O ataque MITM está excluído: cada mensaxe co código 2FA é unha transacción na cadea de bloques e está asinada por Ed25519 EdDSA.
  • A mensaxe co código 2FA acaba no seu propio bloque. Non se pode corrixir a secuencia e a marca de tempo dos bloques e, polo tanto, a orde das mensaxes.
  • Non hai unha estrutura central que verifique a "autenticidade" dunha mensaxe. Isto faise por un sistema distribuído de nodos baseado no consenso, e é propiedade dos usuarios.
  • Non se pode desactivar: as contas non se poden bloquear e as mensaxes non se poden eliminar.
  • Acceda aos códigos 2FA desde calquera dispositivo en calquera momento.
  • Confirmación da entrega da mensaxe co código 2FA. O servizo que envía o contrasinal único sabe con certeza que foi entregado. Non hai botóns "Enviar de novo".

Para comparar con outros métodos 2FA, fixen unha táboa:

Move para asegurar 2FA na cadea de bloques

O usuario recibe unha conta no messenger blockchain para recibir códigos nun segundo; só se usa unha frase de acceso para iniciar sesión. Polo tanto, os métodos de aplicación poden ser diferentes: pode usar unha conta para recibir códigos para todos os servizos ou pode crear unha conta separada para cada servizo.

Tamén hai un inconveniente: a conta debe ter polo menos unha transacción. Para que o usuario reciba unha mensaxe cifrada cun código, cómpre coñecer a súa clave pública, e só aparece na cadea de bloques coa primeira transacción. Así conseguimos saír dela: démoslles a oportunidade de recibir fichas gratis na súa carteira. Non obstante, unha mellor solución é nomear a conta como chave pública. (Para comparación, temos o número de conta U1467838112172792705 é un derivado da clave pública cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. Para o messenger isto é máis cómodo e lexible, pero para o sistema de envío de códigos 2FA é unha limitación). Creo que no futuro alguén tomará esa decisión e trasladará "Conveniencia e Accesibilidade" á zona verde.

O prezo do envío dun código 2FA é moi baixo: 0.001 ADM, agora é de 0.00001 USD. De novo, pode aumentar a súa cadea de bloques e facer o prezo cero.

Como conectar 2FA na cadea de bloques ao teu servizo

Espero que puiden interesar a algúns lectores para engadir autorización de blockchain aos seus servizos.

Vouche dicir como facelo usando o noso messenger como exemplo e, por analoxía, podes usar outra cadea de bloques. Na aplicación de demostración 2FA usamos postgresql10 para almacenar información da conta.

Etapas de conexión:

  1. Crea unha conta na cadea de bloques desde a que enviarás códigos 2FA. Recibirás unha frase de acceso, que se usa como clave privada para cifrar mensaxes con códigos e para asinar transaccións.
  2. Engade un script ao teu servidor para xerar códigos 2FA. Se xa estás a usar calquera outro método 2FA con entrega de contrasinal única, xa completaches este paso.
  3. Engade un script ao teu servidor para enviar códigos ao usuario no messenger blockchain.
  4. Crea unha interface de usuario para enviar e introducir un código 2FA. Se xa estás a usar calquera outro método 2FA con entrega de contrasinal única, xa completaches este paso.

1 Crea unha conta

Crear unha conta na cadea de bloques significa xerar unha clave privada, unha clave pública e un enderezo de conta derivado.

Move para asegurar 2FA na cadea de bloques

En primeiro lugar, xérase a frase de acceso BIP39 e calcúlase a partir dela o hash SHA-256. O hash úsase para xerar a clave privada ks e a clave pública kp. Desde a chave pública, usando o mesmo SHA-256 con inversión, obtemos o enderezo na cadea de bloques.

Se queres enviar códigos 2FA cada vez desde unha nova conta, terás que engadir o código de creación da conta 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()
}

Na aplicación de demostración, simplificámola: creamos unha conta na aplicación web e enviamos códigos desde ela. Na maioría dos casos, isto tamén é máis cómodo para o usuario: sabe que o servizo envía códigos 2FA desde unha conta específica e pode poñerlle un nome.

Move para asegurar 2FA na cadea de bloques

2 Xeración de códigos 2FA

Debe xerarse un código 2FA para cada inicio de sesión de usuario. Usamos a biblioteca locutorio, pero podes escoller calquera outro.

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

Comprobando a validez do código 2FA introducido polo usuario:

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

3 Enviando código 2FA

Para enviar un código 2FA, podes usar a API do nodo blockchain, a biblioteca API JS ou a consola. Neste exemplo, usamos a consola: esta é a interface de liña de comandos, unha utilidade que simplifica a interacción coa cadea de bloques. Para enviar unha mensaxe cun código 2FA, cómpre usar o comando send message consola.

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);

Unha forma alternativa de enviar mensaxes é utilizar o método send na biblioteca da API JS.

4 Interface de usuario

O usuario debe ter a opción de introducir un código 2FA, isto pódese facer de diferentes xeitos dependendo da plataforma da súa aplicación. No noso exemplo é Vue.

Move para asegurar 2FA na cadea de bloques

O código fonte para a aplicación de demostración de autenticación de dous factores blockchain pódese ver en GitHub. Hai unha ligazón no Readme a unha demostración en directo para probalo.

Fonte: www.habr.com

Engadir un comentario