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;
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.
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
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.
En maio, a Oficina do Fiscal dos Estados Unidos para o Distrito Leste de Michigan
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í:
- 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.
- 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.
- 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
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
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
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.
O artigo
- 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:
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:
- 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.
- 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.
- Engade un script ao teu servidor para enviar códigos ao usuario no messenger blockchain.
- 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.
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.
2 Xeración de códigos 2FA
Debe xerarse un código 2FA para cada inicio de sesión de usuario. Usamos a biblioteca
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.
O código fonte para a aplicación de demostración de autenticación de dous factores blockchain pódese ver en
Fonte: www.habr.com