Pase a la 2FA segura en la blockchain

Los mensajes de SMS son una forma muy popular de autenticación de dos factores (2FA). Son utilizados por bancos, billeteras electrónicas y criptográficas, buzones de correo y varios servicios; el número de usuarios de este método se aproxima al 100%.

Este escenario me causa indignación, ya que este método no es seguro. La reasignación de un número de una tarjeta SIM a otra comenzó a utilizarse desde el inicio de la era móvil, como una forma de recuperar un número perdido. Los "expertos en el robo de dinero digital" se dieron cuenta de que la opción de "reescribir la SIM" se podía utilizar en esquemas fraudulentos. Quien controla la tarjeta SIM puede manejar la banca en línea ajena, billeteras electrónicas e incluso criptomonedas. Y apoderarse del número de otra persona puede hacerse a través de sobornos a empleados de telecomunicaciones, engaños o documentos falsificados.

Pase a la 2FA segura en la blockchain

Se han revelado miles de episodios de SIM swapping, así se llama este esquema de fraude. La magnitud del problema indica que pronto el mundo renunciará a la 2FA por SMS. Pero esto no está sucediendo en la investigación indica que el método 2FA no es elegido por los usuarios, sino por los propietarios de los servicios.

Proponemos utilizar un método seguro de 2FA con la entrega de códigos de un solo uso a través de blockchain, y explicaremos cómo integrarlo para el propietario del servicio.

La cuenta está en millones

En 2019, el fraude por SIM swapping aumentó un 63% según datos de la policía de Londres, y el 'cheque promedio' de un delincuente es de 4,000 GBP. No encontré estadísticas en Rusia, pero presumo que son aún peores.

El SIM swapping se utiliza para robar cuentas populares de Twitter, Instagram, Facebook, VK, cuentas bancarias, y recientemente también han llegado a las criptomonedas— informa el periódico Times según el empresario de bitcoin Joby Weeks. Los casos notorios de robo de criptomonedas mediante SIM swapping han salido a la luz en la prensa desde 2016; 2019 marcó el verdadero pico.

En mayo, la fiscalía de EE. UU. en el distrito este de Michigan presentó cargos contra nueve jóvenes de entre 19 y 26 años: se presume que forman parte de una banda de hackers llamada "The Community". Se les imputan siete ataques de swapping, a raíz de los cuales los hackers se apoderaron de criptomonedas por un valor superior a $2.4 millones. Y en abril, un estudiante de California, Joel Ortiz, recibió 10 años de prisión por SIM swapping; había robado $7.5 millones en criptomonedas.

Pase a la 2FA segura en la blockchain
Foto de Joel Ortiz en la conferencia de prensa de la universidad. Dos años después, será arrestado por fraude cibernético.

Principio del SIM swapping

«Swapping» significa intercambio. En todos estos esquemas, los delincuentes se apropian del número de teléfono de la víctima, generalmente a través de la reemisión de la tarjeta SIM, y lo usan para restablecer contraseñas. Un típico SIM swapping teóricamente se ve así:

  1. Inteligencia. Los delincuentes obtienen datos personales de la víctima: nombre y teléfono. Estos se pueden encontrar en fuentes abiertas (redes sociales, amigos) o recibir de un cómplice: un empleado del operador de telefonía móvil.
  2. Bloqueo. La tarjeta SIM de la víctima se desactiva; para esto, basta con llamar al soporte técnico del proveedor, informar el número y decir que el teléfono se ha perdido.
  3. Captura, traslado del número a su propia SIM. Generalmente, esto también se realiza a través de un cómplice en la empresa de telecomunicaciones o mediante la falsificación de documentos.

En la vida real, es incluso más severo. Los delincuentes eligen a su víctima y luego rastrean diariamente la ubicación del teléfono: una consulta para obtener información sobre si el abonado ha pasado a roaming cuesta entre 1 y 2 centavos. Tan pronto como el propietario de la SIM sale del país, ellos negocian con un gerente en la tienda de telefonía para emitir una nueva SIM. Esto cuesta alrededor de $50 (he encontrado información que varía entre $20 y $100 en diferentes países y operadores), y en el peor de los casos, el gerente será despedido — no hay responsabilidad por ello.

Ahora todos los SMS los recibirán los delincuentes, y el propietario del teléfono no podrá hacer nada al respecto — está en el extranjero. A partir de ahí, los villanos obtienen acceso a todas las cuentas de la víctima y, si quieren, cambian las contraseñas.

Las posibilidades de recuperar lo robado

Los bancos a veces ayudan a las víctimas y reembolsan las transferencias de sus cuentas. Por lo tanto, es posible recuperar el dinero fiat, incluso si no se encuentra al delincuente. Pero con las carteras de criptomonedas es más complicado — tanto técnicamente, como legislativamente. Hasta ahora, ninguna bolsa/cartera ha compensado a las víctimas del swapping.

Si los afectados quieren recuperar su dinero en los tribunales, acusan al operador: él creó las condiciones para el robo de dinero de la cuenta. Así fue como actuó Michael Terpin, quien perdió $224 millones debido al swapping. Actualmente, está demandando a la compañía de telecomunicaciones AT&T.

Pase a la 2FA segura en la blockchain

Hasta ahora, ningún país tiene esquemas operativos para proteger legalmente a los propietarios de criptomonedas. No es posible asegurar su capital ni obtener compensación por su pérdida. Por lo tanto, prevenir un ataque de sim swapping es más fácil que lidiar con sus consecuencias. La forma más obvia es usar un "segundo factor" más confiable para la autenticación de dos factores (2FA).

El sim swapping no es el único problema de la 2FA a través de SMS

Los códigos de confirmación enviados por SMS son inseguros desde un punto de vista técnico. Los mensajes pueden ser interceptados debido a vulnerabilidades inevitables en el sistema de señalización Signaling System 7 (SS7). La 2FA por SMS ha sido oficialmente reconocida como insegura (el Instituto Nacional de Estándares y Tecnología de EE. UU. dice esto en su Guía de autenticación digital).

Además, la presencia de 2FA a menudo da al usuario una falsa sensación de seguridad, lo que lo lleva a elegir una contraseña más simple. Por lo tanto, esta autenticación no dificulta, sino que facilita el acceso de los delincuentes a la cuenta.

Y también, a menudo los SMS llegan con gran retraso o no llegan en absoluto.

Otros métodos de 2FA

Por supuesto, no todo gira en torno a los smartphones y SMS. Existen otros métodos de 2FA. Por ejemplo, los códigos TAN únicos: un método primitivo, pero funcional, que todavía se utiliza en algunos bancos. Hay sistemas que utilizan datos biométricos: huellas dactilares, escaneos de retina. Otra opción que parece un compromiso razonable entre conveniencia, fiabilidad y precio son las aplicaciones especiales para 2FA: RSA Token, Google Authenticator. También existen llaves físicas y otros métodos.

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

Según un estudio, el uso de 2FA es una molestia en principio, y la popularidad de la 2FA por SMS se explica por "ser menos inconveniente que otros métodos"; recibir códigos únicos es comprensible para el usuario.

Muchos usuarios asocian los métodos de 2FA con el miedo a perder el acceso. Un llavero físico o una lista de contraseñas TAN se pueden perder o robar. Personalmente, he tenido una experiencia negativa con Google Authenticator. Mi primer smartphone con esta aplicación se rompió; evalúe el esfuerzo que hice para recuperar el acceso a mis cuentas. Otro problema es la transición a un nuevo dispositivo. Google Authenticator no tiene la opción de exportación por razones de seguridad (¿si las claves se pueden exportar, cuál es la seguridad?). Una vez transferí las claves manualmente, y luego decidí que era más fácil dejar el viejo smartphone en una caja en la estantería.

El método 2FA debe ser:

  • Seguro: solo usted debe obtener acceso a la cuenta, no los delincuentes.
  • Confiable: usted tiene acceso a la cuenta siempre que lo necesite.
  • Conveniente y accesible: el uso de 2FA es claro y toma el mínimo tiempo.
  • Económico.

Creemos que la blockchain es la solución adecuada.

Utilice 2FA en la blockchain.

Para el usuario, el 2FA en la blockchain se ve igual que recibir códigos de un solo uso por SMS. La única diferencia es el canal de entrega. La forma de recibir el código 2FA depende de lo que ofrece la blockchain. En nuestro proyecto (la información está en mi perfil), 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 a un mensajero en la blockchain. Luego, según lo clásico: el usuario introduce el código recibido en la interfaz del servicio y se autentica.

Pase a la 2FA segura en la blockchain

En el artículo Cómo funciona un mensajero descentralizado en la blockchain. he escrito que la blockchain garantiza la seguridad y la privacidad en la transmisión de mensajes. En cuanto al 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 se cifran con End-to-End curve25519xsalsa20poly1305.
  • Los ataques MITM están excluidos: cada mensaje con un código 2FA es una transacción en la blockchain y se firma con Ed25519 EdDSA.
  • El mensaje con el código 2FA llega a su bloque. La secuencia y la marca de tiempo de los bloques no se pueden modificar, y por lo tanto, el orden de los mensajes.
  • No existe una estructura central que realice verificaciones de 'veracidad' del mensaje. Esto lo hace un sistema distribuido de nodos basado en consenso, y pertenece a los usuarios.
  • La imposibilidad de desconexión: las cuentas no se pueden bloquear y los mensajes no se pueden eliminar.
  • Acceso a los códigos 2FA desde cualquier dispositivo en cualquier momento.
  • Confirmación de la entrega del mensaje con el código 2FA. El servicio que envía la contraseña de un solo uso sabe exactamente que ha sido entregada. Sin botones de “Enviar de nuevo.”

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

Pase a la 2FA segura en la blockchain

La cuenta en el mensajero blockchain para recibir códigos se obtiene en segundos: solo se utiliza la frase de acceso para ingresar. Por lo tanto, los métodos de aplicación pueden ser diversos: se puede usar una cuenta para recibir códigos para todos los servicios, o se puede crear una cuenta separada para cada servicio.

También hay una desventaja: la cuenta debe tener al menos una transacción. Para que el usuario reciba un mensaje cifrado con el código, es necesario conocer su clave pública, que solo aparece en la blockchain con la primera transacción. Nos las arreglamos para resolverlo así: permitimos obtener tokens gratuitos en la billetera. Sin embargo, una solución más adecuada es nombrar la cuenta con la clave pública. (Para comparar, nuestro número de cuenta U1467838112172792705 es un derivado de la clave pública cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. Para el mensajero, 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 desarrollará una solución así y trasladará “Conveniencia y disponibilidad” a la zona verde.

El costo de enviar un código 2FA es realmente bajo: 0.001 ADM, lo que actualmente equivale a 0.00001 USD. Nuevamente, se puede levantar su propia blockchain y hacer que el costo sea cero.

Cómo conectar 2FA en blockchain a su servicio

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

Voy a explicar cómo hacerlo usando nuestro mensajero como ejemplo, y por analogía, puede usar otra blockchain. En la aplicación de demostración 2FA usamos postgresql10 para almacenar información sobre las cuentas.

Pasos para la conexión:

  1. Cree una cuenta en blockchain desde la que enviará los códigos 2FA. Recibirá una frase de acceso que se utiliza como clave privada para cifrar mensajes con códigos y para firmar transacciones.
  2. Añadir un script a su servidor para generar códigos 2FA. Si ya está utilizando algún otro método de 2FA que envía contraseñas de un solo uso, esta etapa ya está completada.
  3. Añadir un script a su servidor para enviar códigos al usuario a través de un mensajero blockchain.
  4. Crear una interfaz de usuario para enviar e introducir el código 2FA. Si ya está utilizando algún otro método de 2FA que envía contraseñas de un solo uso, esta etapa ya está completada.

1 Creación de cuenta

La creación de una cuenta en la blockchain consiste en generar una clave privada, una clave pública y la dirección de la cuenta derivada de estas.

Pase a la 2FA segura en la blockchain

Primero se genera una frase secreta BIP39, de la cual se calcula un hash SHA-256. Este hash se utiliza para generar la clave privada ks y la clave pública kp. A partir de la clave pública, utilizando el mismo SHA-256 con inversión, se obtiene la dirección en la blockchain.

Si desea enviar códigos de 2FA cada vez desde una nueva cuenta, el código para crear la cuenta deberá añadirse 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 hemos simplificado: creamos una cuenta en la aplicación web y enviamos los códigos desde ella. En la mayoría de los casos, esto es más conveniente para el usuario: sabe que el servicio envía códigos 2FA desde una cuenta específica y puede nombrarla.

Pase a la 2FA segura en la blockchain

2 Generación de códigos 2FA

Se debe generar un código 2FA para cada inicio de sesión del usuario. Utilizamos la biblioteca speakeasy, pero puede elegir cualquier otra.

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

Verificación de la validez del código 2FA introducido por el usuario:

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

3 Envío del código 2FA

Para enviar el código 2FA, se puede utilizar la API de nodo de blockchain, la biblioteca JS API o la consola. En este ejemplo, utilizamos la consola, que es la Interfaz de Línea de Comando, una herramienta que simplifica la interacción con la blockchain. Para enviar un mensaje con el código 2FA, se debe usar el comando enviar mensaje de la consola.

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

…

const command = `adm enviar mensaje ${adamantAddress} "código 2FA: ${hotp}"`;
let { error, stdout, stderr } = await exec(command);

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

4 Interfaz de usuario

El usuario debe poder ingresar el código 2FA, esto se puede hacer de varias formas según la plataforma de su aplicación. En nuestro ejemplo, esto es Vue.

Pase a la 2FA segura en la blockchain

El código fuente de la aplicación de demostración de autenticación de dos factores en blockchain se puede ver en GitHub. En el Readme hay un enlace a la demo en vivo para probar.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster