Migrar para asegurar 2FA en blockchain

Los mensajes SMS son el método más popular de autenticación de dos factores (2FA). Es utilizado por bancos, billeteras electrónicas y criptográficas, buzones de correo y todo tipo de servicios; el número de usuarios del método se acerca al 100%.

Estoy indignado por este escenario, porque este método no es seguro. La reasignación de un número de una tarjeta SIM a otra comenzó al comienzo de la era móvil; así es como se restaura el número cuando se pierde una tarjeta SIM. Los "especialistas en robo de dinero digital" se dieron cuenta de que la opción "reescribir la tarjeta SIM" se puede utilizar en esquemas fraudulentos. Después de todo, quien controla la tarjeta SIM puede controlar la banca en línea, las billeteras electrónicas e incluso las criptomonedas de otras personas. Y puedes apoderarte del número de otra persona sobornando a un empleado de telecomunicaciones, mediante engaños o documentos falsificados.

Migrar para asegurar 2FA en blockchain

Se han descubierto miles de episodios de intercambio de SIM, como se denomina a este esquema de fraude. La magnitud del desastre sugiere que el mundo pronto abandonará 2FA a través de SMS. Pero esto no sucede -en estudio Dicen que no son los usuarios quienes eligen el método 2FA, sino los propietarios del servicio.

Proponemos utilizar el método seguro 2FA con entrega de códigos únicos a través de blockchain y le diremos cómo el propietario del servicio puede conectarlo.

La cuenta asciende a millones.

En 2019, el fraude de intercambio de SIM aumentó un 63 % según la policía de Londres, y la “factura media” de un atacante fue de 4,000 libras esterlinas. No he encontrado estadísticas en Rusia, pero supongo que son aún peores.

El intercambio de SIM se utiliza para robar cuentas populares de Twitter, Instagram, Facebook, VK, cuentas bancarias y, recientemente, incluso criptomonedas. El periódico The Times informa según el empresario de Bitcoin Joby Weeks. Desde 2016 han aparecido en la prensa casos de alto perfil de robo de criptomonedas mediante intercambio de SIM; 2019 vio un verdadero pico.

En mayo, la Fiscalía Federal para el Distrito Este de Michigan presentó cargos nueve jóvenes de entre 19 y 26 años: se cree que forman parte de una banda de hackers llamada “La Comunidad”. La banda está acusada de siete ataques de intercambio, como resultado de los cuales los piratas informáticos robaron criptomonedas por valor de más de 2,4 millones de dólares. Y en abril, el estudiante de California Joel Ortiz recibió 10 años de prisión por intercambio de SIM; su producción fue de 7.5 millones de dólares en criptomonedas.

Migrar para asegurar 2FA en blockchain
Foto de Joel Ortiz en conferencia de prensa universitaria. Dos años después será detenido por ciberfraude.

Cómo funciona el intercambio de SIM

"Swaping" significa intercambio. En todos estos esquemas, los delincuentes se apoderan del número de teléfono de la víctima, generalmente mediante la reemisión de una tarjeta SIM, y la utilizan para restablecer la contraseña. En teoría, un intercambio de SIM típico se ve así:

  1. Servicio de inteligencia. Los estafadores descubren la información personal de la víctima: nombre y número de teléfono. Se pueden encontrar en fuentes abiertas (redes sociales, amigos) o recibirse de un cómplice: un empleado de un operador de telefonía móvil.
  2. Bloqueo. La tarjeta SIM de la víctima está desactivada; Para hacer esto, simplemente llame al soporte técnico del proveedor, proporcione el número y diga que perdió el teléfono.
  3. Capture, transfiera el número a su tarjeta SIM. Normalmente esto también se hace a través de un cómplice de la empresa de telecomunicaciones o mediante falsificación de documentos.

En la vida real las cosas son aún más graves. Los atacantes seleccionan una víctima y luego rastrean la ubicación del teléfono diariamente; una solicitud para recibir información de que el suscriptor ha cambiado a roaming cuesta entre 1 y 2 centavos. Tan pronto como el propietario de la tarjeta SIM se va al extranjero, negocia con el gerente de la tienda de comunicaciones la emisión de una nueva tarjeta SIM. Cuesta alrededor de $50 (encontré información, en diferentes países y con diferentes operadores de $20 a $100), y en el peor de los casos, el gerente será despedido, no hay responsabilidad por esto.

Ahora todos los SMS serán recibidos por los atacantes y el propietario del teléfono no podrá hacer nada al respecto: está en el extranjero. Y luego los villanos obtienen acceso a todas las cuentas de las víctimas y cambian las contraseñas si lo desean.

Posibilidades de devolver propiedad robada

A veces los bancos aceptan a las víctimas a medias y retiran transferencias de sus cuentas. Por lo tanto, es posible devolver dinero fiduciario incluso si no se encuentra al delincuente. Pero con las carteras de criptomonedas todo es más complicado, y técnicamentey legislativamente. Hasta ahora, ningún exchange/billetera ha pagado compensación a las víctimas del swap.

Si las víctimas quieren defender su dinero ante los tribunales, culpan al operador: él creó las condiciones para el robo del dinero de la cuenta. Eso es exactamente lo que hice Michael Turpin, que perdió 224 millones de dólares en el swap y ahora ha demandado a la empresa de telecomunicaciones AT&T.

Migrar para asegurar 2FA en blockchain

Hasta ahora, ningún estado cuenta con planes que funcionen para proteger legalmente a los propietarios de criptomonedas. Es imposible asegurar su capital o recibir una compensación por su pérdida. Por tanto, prevenir un ataque de swap es más fácil que afrontar sus consecuencias. La forma más obvia es utilizar un "segundo factor" más confiable para 2FA.

El intercambio de SIM no es el único problema con 2FA vía SMS

Los códigos de confirmación en SMS tampoco son seguros desde un punto de vista técnico. Los mensajes pueden interceptarse debido a vulnerabilidades no parcheadas en Signaling System 7 (SS7). 2FA sobre SMS está oficialmente reconocido como inseguro (el Instituto Nacional de Estándares y Tecnología de EE. UU. lo dice en su Guía de autenticación digital).

Al mismo tiempo, la presencia de 2FA a menudo le da al usuario una sensación de falsa seguridad y elige una contraseña más simple. Por lo tanto, dicha autenticación no dificulta, pero facilita que un atacante obtenga acceso a la cuenta.

Y a menudo los SMS llegan con mucho retraso o no llegan en absoluto.

Otros métodos 2FA

Por supuesto, la luz no convergió en los teléfonos inteligentes y los SMS. Existen otros métodos de 2FA. Por ejemplo, códigos TAN de un solo uso: un método primitivo, pero funciona; todavía se utiliza en algunos bancos. Existen sistemas que utilizan datos biométricos: huellas dactilares, escáneres de retina. Otra opción que parece un compromiso razonable en términos de conveniencia, confiabilidad y precio son las aplicaciones especiales para 2FA: RSA Token, Google Authenticator. También existen claves físicas y otros métodos.

En teoría, todo parece lógico y fiable. Pero en la práctica, las soluciones 2FA modernas tienen problemas y, debido a ellos, la realidad difiere de las expectativas.

según investigacion, el uso de 2FA es en principio un inconveniente, y la popularidad de 2FA a través de SMS se explica por "menos inconvenientes en comparación con otros métodos": recibir códigos de un solo uso es comprensible para el usuario.

Los usuarios asocian muchos métodos 2FA con el temor de perder el acceso. La clave física o la lista de contraseñas TAN se pueden perder o ser robadas. Personalmente he tenido malas experiencias con Google Authenticator. Mi primer teléfono inteligente con esta aplicación se averió; agradezco mis esfuerzos por restaurar el acceso a mis cuentas. Otro problema es cambiar a un nuevo dispositivo. Google Authenticator no tiene una opción de exportación por razones de seguridad (si las claves se pueden exportar, ¿qué seguridad existe?). Una vez llevé las llaves a mano y decidí que era más fácil dejar el viejo teléfono inteligente en una caja en un estante.

El método 2FA debería ser:

  • Seguro: sólo usted y no los atacantes deben tener acceso a su cuenta
  • Confiable: obtienes acceso a tu cuenta cuando lo necesitas
  • Cómodo y accesible: el uso de 2FA es claro y requiere un tiempo mínimo
  • Barato

Creemos que blockchain es la solución correcta.

Utilice 2FA en la cadena de bloques

Para el usuario, 2FA en la cadena de bloques tiene el mismo aspecto que recibir códigos de un solo uso por SMS. La única diferencia es el canal de entrega. El método para obtener un código 2FA depende de lo que ofrece blockchain. En nuestro proyecto (la información está en mi perfil) esta es una aplicación web, Tor, iOS, Android, Linux, Windows, MacOS.

El servicio genera un código de un solo uso y lo envía al mensajero en la cadena de bloques. Luego sigue lo clásico: el usuario ingresa el código recibido en la interfaz del servicio e inicia sesión.

Migrar para asegurar 2FA en blockchain

El artículo ¿Cómo funciona un mensajero descentralizado en blockchain? Escribí que blockchain garantiza la seguridad y privacidad de la transmisión de mensajes. Sobre el tema del envío de códigos 2FA destacaré:

  • Un clic para crear una cuenta, sin teléfonos ni correos electrónicos.
  • Todos los mensajes con códigos 2FA están cifrados de extremo a extremo curve25519xsalsa20poly1305.
  • El ataque MITM está excluido: cada mensaje con el código 2FA es una transacción en la cadena de bloques y está firmado por Ed25519 EdDSA.
  • El mensaje con el código 2FA termina en su propio bloque. La secuencia y la marca de tiempo de los bloques no se pueden corregir y, por tanto, el orden de los mensajes.
  • No existe una estructura central que verifique la “autenticidad” de un mensaje. Esto se hace mediante un sistema distribuido de nodos basado en consenso y es propiedad de los usuarios.
  • No se puede desactivar: las cuentas no se pueden bloquear y los mensajes no se pueden eliminar.
  • Acceda a códigos 2FA desde cualquier dispositivo en cualquier momento.
  • Confirmación de entrega de mensaje con código 2FA. El servicio que envía la contraseña de un solo uso sabe con seguridad que ha sido entregada. No hay botones de "Enviar de nuevo".

Para comparar con otros métodos 2FA, hice una tabla:

Migrar para asegurar 2FA en blockchain

El usuario recibe una cuenta en el mensajero blockchain para recibir códigos en un segundo; solo se utiliza una frase de contraseña para iniciar sesión. Por lo tanto, los métodos de solicitud pueden ser diferentes: puede usar una cuenta para recibir códigos para todos los servicios o puede crear una cuenta separada para cada servicio.

También existe un inconveniente: la cuenta debe tener al menos una transacción. Para que el usuario reciba un mensaje cifrado con un código, necesita conocer su clave pública, y aparece en la cadena de bloques solo con la primera transacción. Así logramos salir de esto: les dimos la oportunidad de recibir tokens gratis en su billetera. Sin embargo, una mejor solución es nombrar la cuenta como clave pública. (A modo de comparación, tenemos el número de cuenta U1467838112172792705 es un derivado de la clave pública cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. Para el Messenger esto es más conveniente y legible, pero para el sistema de envío de códigos 2FA es una limitación). Creo que en el futuro alguien tomará esa decisión y trasladará "Comodidad y accesibilidad" a la zona verde.

El precio de enviar un código 2FA es realmente bajo: 0.001 ADM, ahora es 0.00001 USD. Nuevamente, puedes aumentar tu blockchain y hacer que el precio sea cero.

Cómo conectar 2FA en blockchain a su servicio

Espero haber podido interesar a algunos lectores para que agreguen la autorización blockchain a sus servicios.

Te diré cómo hacer esto usando nuestro mensajero como ejemplo y, por analogía, puedes usar otra cadena de bloques. En la aplicación de demostración 2FA usamos postgresql10 para almacenar información de la cuenta.

Etapas de conexión:

  1. Cree una cuenta en blockchain desde la cual enviará códigos 2FA. Recibirá una frase de contraseña, que se utiliza como clave privada para cifrar mensajes con códigos y firmar transacciones.
  2. Agregue un script a su servidor para generar códigos 2FA. Si ya está utilizando cualquier otro método 2FA con entrega de contraseña de un solo uso, ya ha completado este paso.
  3. Agregue un script a su servidor para enviar códigos al usuario en blockchain messenger.
  4. Cree una interfaz de usuario para enviar e ingresar un código 2FA. Si ya está utilizando cualquier otro método 2FA con entrega de contraseña de un solo uso, ya ha completado este paso.

1 creación de cuenta

Crear una cuenta en blockchain significa generar una clave privada, una clave pública y una dirección de cuenta derivada.

Migrar para asegurar 2FA en blockchain

Primero, se genera la frase de contraseña BIP39 y a partir de ella se calcula el hash SHA-256. El hash se utiliza para generar la clave privada ks y la clave pública kp. De la clave pública, utilizando el mismo SHA-256 con inversión, obtenemos la dirección en la blockchain.

Si desea enviar códigos 2FA cada vez desde una cuenta nueva, deberá agregar el código de creación de la cuenta al 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()
}

En la aplicación de demostración, lo simplificamos: creamos una cuenta en la aplicación web y enviamos códigos desde ella. En la mayoría de los casos, esto también es más conveniente para el usuario: sabe que el servicio envía códigos 2FA desde una cuenta específica y puede nombrarla.

Migrar para asegurar 2FA en blockchain

2 Generando códigos 2FA

Se debe generar un código 2FA para cada inicio de sesión de usuario. Usamos la biblioteca clandestino, pero puedes elegir cualquier otro.

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

Comprobando la validez del código 2FA ingresado por el usuario:

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

3 Envío de código 2FA

Para enviar un código 2FA, puede utilizar la API del nodo blockchain, la biblioteca API JS o la consola. En este ejemplo, usamos la consola: esta es la interfaz de línea de comandos, una utilidad que simplifica la interacción con blockchain. Para enviar un mensaje con un código 2FA, debe usar el comando send message consolas.

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

Una forma alternativa de enviar mensajes es utilizar el método send en la biblioteca JS API.

4 interfaz de usuario

El usuario debe tener la opción de ingresar un código 2FA; esto se puede hacer de diferentes maneras según la plataforma de su aplicación. En nuestro ejemplo, este es Vue.

Migrar para asegurar 2FA en blockchain

El código fuente de la aplicación de demostración de autenticación de dos factores blockchain se puede ver en GitHub. Hay un enlace en el archivo Léame a una demostración en vivo para probarlo.

Fuente: habr.com

Añadir un comentario