Procedi per proteggere la 2FA sulla blockchain

I messaggi SMS sono il metodo più popolare di autenticazione a due fattori (2FA). Viene utilizzato da banche, portafogli elettronici e crittografici, caselle di posta e tutti i tipi di servizi; il numero di utenti del metodo si avvicina al 100%.

Sono indignato per questo scenario, perché questo metodo non è sicuro. La riassegnazione del numero da una carta SIM all'altra è iniziata all'inizio dell'era mobile: è così che il numero viene ripristinato in caso di smarrimento della carta SIM. Gli "specialisti del furto di denaro digitale" si sono resi conto che l'opzione "riscrivi la carta SIM" può essere utilizzata in schemi fraudolenti. Dopotutto, chi controlla la carta SIM può controllare l’online banking, i portafogli elettronici e persino la criptovaluta di altre persone. E puoi impossessarti del numero di un'altra persona corrompendo un dipendente delle telecomunicazioni, utilizzando l'inganno o documenti contraffatti.

Procedi per proteggere la 2FA sulla blockchain

Sono stati scoperti migliaia di episodi di scambio di SIM, come viene chiamato questo schema di frode. La portata del disastro suggerisce che il mondo abbandonerà presto la 2FA via SMS. Ma questo non accade - in studio dicono che non sono gli utenti a scegliere il metodo 2FA, ma i proprietari dei servizi.

Proponiamo di utilizzare il metodo 2FA sicuro con consegna di codici monouso tramite blockchain e ti diremo come il proprietario del servizio può collegarlo.

Il conteggio arriva a milioni

Nel 2019, secondo la polizia di Londra, le frodi relative allo scambio di SIM sono aumentate del 63% e la “fattura media” di un aggressore era di 4,000 sterline. Non ho trovato statistiche in Russia, ma presumo che siano anche peggiori.

Lo scambio SIM viene utilizzato per rubare i popolari account Twitter, Instagram, Facebook, VK, conti bancari e recentemente anche criptovalute - Lo riferisce il quotidiano Times secondo l'imprenditore Bitcoin Joby Weeks. Casi di alto profilo di furto di criptovaluta tramite scambio di SIM sono apparsi sulla stampa dal 2016; Il 2019 ha visto un vero e proprio picco.

A maggio, l'ufficio del procuratore degli Stati Uniti per il distretto orientale del Michigan ha sporto denuncia nove giovani tra i 19 e i 26 anni: si ritiene facciano parte di una banda di hacker chiamata “The Community”. La banda è accusata di sette attacchi di scambio, a seguito dei quali gli hacker hanno rubato criptovaluta per un valore di oltre 2,4 milioni di dollari. E ad aprile, lo studente californiano Joel Ortiz ha ricevuto 10 anni di prigione per scambio di SIM; la sua produzione è stata di 7.5 milioni di dollari in criptovalute.

Procedi per proteggere la 2FA sulla blockchain
Foto di Joel Ortiz ad una conferenza stampa universitaria. Due anni dopo sarà arrestato per frode informatica.

Come funziona lo scambio SIM

"Swaping" significa scambio. In tutti questi schemi, i criminali si impossessano del numero di telefono della vittima, solitamente riemettendo una carta SIM, e lo utilizzano per reimpostare la password. Un tipico scambio di SIM in teoria è simile a questo:

  1. Servizio di intelligence. I truffatori scoprono le informazioni personali della vittima: nome e numero di telefono. Possono essere trovati in fonti aperte (social network, amici) o ricevuti da un complice, un dipendente di un operatore di telefonia mobile.
  2. Blocco. La carta SIM della vittima è disattivata; Per fare ciò, basta chiamare il supporto tecnico del provider, fornire il numero e dire che il telefono è stato smarrito.
  3. Cattura, trasferisci il numero sulla tua carta SIM. Di solito ciò avviene anche attraverso un complice della compagnia di telecomunicazioni o attraverso la falsificazione di documenti.

Nella vita reale le cose sono ancora più gravi. Gli aggressori selezionano una vittima e poi tracciano quotidianamente la posizione del telefono: una richiesta per ricevere informazioni che l'abbonato è passato al roaming costa 1-2 centesimi. Non appena il proprietario della carta SIM si reca all'estero, negozia con il gestore del negozio di comunicazione l'emissione di una nuova carta SIM. Costa circa 50 dollari (ho trovato informazioni - in diversi paesi e con diversi operatori da 20 a 100 dollari), e nel peggiore dei casi il manager verrà licenziato - non c'è alcuna responsabilità per questo.

Ora tutti gli SMS verranno ricevuti dagli aggressori e il proprietario del telefono non potrà farci nulla: si trova all'estero. E poi i criminali ottengono l’accesso a tutti gli account delle vittime e, se lo desiderano, cambiano le password.

Possibilità di restituire la merce rubata

Le banche a volte accolgono le vittime a metà strada e ritirano i trasferimenti dai loro conti. Pertanto, è possibile restituire la moneta fiat anche se il criminale non viene trovato. Ma con i portafogli di criptovaluta tutto è più complicato - e tecnicamentee legislativamente. Finora, nessun exchange/portafoglio ha pagato un risarcimento alle vittime dello swapping.

Se le vittime vogliono difendere i propri soldi in tribunale, danno la colpa all'operatore: ha creato le condizioni per il furto di denaro dal conto. Questo è esattamente quello che ho fatto Michele Turpino, che ha perso 224 milioni di dollari a causa dello scambio, e ora ha fatto causa alla società di telecomunicazioni AT&T.

Procedi per proteggere la 2FA sulla blockchain

Finora, nessuno stato ha programmi funzionanti per proteggere legalmente i proprietari di criptovalute. È impossibile assicurare il proprio capitale o ricevere un risarcimento per la sua perdita. Pertanto, prevenire un attacco di scambio è più semplice che affrontarne le conseguenze. Il modo più ovvio è utilizzare un "secondo fattore" più affidabile per 2FA.

Lo scambio SIM non è l'unico problema con 2FA via SMS

Anche i codici di conferma negli SMS non sono sicuri dal punto di vista tecnico. I messaggi possono essere intercettati a causa di vulnerabilità senza patch nel Signaling System 7 (SS7). La 2FA tramite SMS è ufficialmente riconosciuta come non sicura (lo afferma il National Institute of Standards and Technology degli Stati Uniti nel suo Guida all'autenticazione digitale).

Allo stesso tempo, la presenza di 2FA spesso dà all'utente un senso di falsa sicurezza, che lo spinge a scegliere una password più semplice. Pertanto, tale autenticazione non rende difficile, ma rende più semplice per un utente malintenzionato ottenere l'accesso all'account.

E spesso gli SMS arrivano con molto ritardo o non arrivano affatto.

Altri metodi 2FA

Certo, la luce non è convergente su smartphone e SMS. Esistono altri metodi di 2FA. Ad esempio, i codici TAN una tantum: un metodo primitivo, ma funziona: è ancora utilizzato in alcune banche. Esistono sistemi che utilizzano dati biometrici: impronte digitali, scansioni della retina. Un'altra opzione che sembra un ragionevole compromesso in termini di praticità, affidabilità e prezzo sono le applicazioni speciali per 2FA: RSA Token, Google Authenticator. Esistono anche chiavi fisiche e altri metodi.

In teoria, tutto sembra logico e affidabile. Ma in pratica, le moderne soluzioni 2FA presentano problemi e, a causa di essi, la realtà differisce dalle aspettative.

Secondo esplorazione, l'uso di 2FA è in linea di principio un inconveniente e la popolarità di 2FA tramite SMS è spiegata da "meno inconvenienti rispetto ad altri metodi": la ricezione di codici monouso è comprensibile per l'utente.

Gli utenti associano molti metodi 2FA al timore che l'accesso venga perso. La chiave fisica o l'elenco delle password TAN possono essere persi o rubati. Personalmente ho avuto brutte esperienze con Google Authenticator. Il mio primo smartphone con questa applicazione si è rotto: apprezza i miei sforzi per ripristinare l'accesso ai miei account. Un altro problema è il passaggio a un nuovo dispositivo. Google Authenticator non dispone di un'opzione di esportazione per motivi di sicurezza (se le chiavi possono essere esportate, quale sicurezza c'è?). Una volta ho portato le chiavi manualmente, poi ho deciso che era più facile lasciare il vecchio smartphone in una scatola su uno scaffale.

Il metodo 2FA dovrebbe essere:

  • Sicuro: solo tu e non gli aggressori dovreste avere accesso al vostro account
  • Affidabile: puoi accedere al tuo account ogni volta che ne hai bisogno
  • Comodo e accessibile: l'utilizzo della 2FA è chiaro e richiede un tempo minimo
  • Economico

Crediamo che la blockchain sia la soluzione giusta.

Usa 2FA sulla blockchain

Per l'utente, 2FA sulla blockchain equivale a ricevere codici monouso tramite SMS. L'unica differenza è il canale di consegna. Il metodo per ottenere un codice 2FA dipende da ciò che offre la blockchain. Nel nostro progetto (le informazioni sono nel mio profilo) questa è un'applicazione Web, Tor, iOS, Android, Linux, Windows, MacOS.

Il servizio genera un codice monouso e lo invia al messenger sulla blockchain. Quindi segui i classici: l'utente inserisce il codice ricevuto nell'interfaccia del servizio ed effettua il login.

Procedi per proteggere la 2FA sulla blockchain

l'articolo Come funziona un messenger decentralizzato sulla blockchain? Ho scritto che la blockchain garantisce la sicurezza e la privacy della trasmissione dei messaggi. Sulla questione dell'invio dei codici 2FA, evidenzierò:

  • Un clic per creare un account: senza telefono o e-mail.
  • Tutti i messaggi con codici 2FA sono crittografati End-to-End curve25519xsalsa20poly1305.
  • L'attacco MITM è escluso: ogni messaggio con il codice 2FA è una transazione sulla blockchain ed è firmato da Ed25519 EdDSA.
  • Il messaggio con il codice 2FA finisce in un blocco a parte. La sequenza e il timestamp dei blocchi non possono essere corretti e quindi l'ordine dei messaggi.
  • Non esiste una struttura centrale che controlli l’“autenticità” di un messaggio. Questo viene fatto da un sistema distribuito di nodi basato sul consenso ed è di proprietà degli utenti.
  • Non può essere disabilitato: gli account non possono essere bloccati e i messaggi non possono essere eliminati.
  • Accedi ai codici 2FA da qualsiasi dispositivo in qualsiasi momento.
  • Conferma di consegna del messaggio con codice 2FA. Il servizio che invia la password monouso sa con certezza che è stata consegnata. Nessun pulsante "Invia di nuovo".

Per confrontare con altri metodi 2FA, ho creato una tabella:

Procedi per proteggere la 2FA sulla blockchain

L'utente riceve un account nel messenger blockchain per ricevere i codici in un secondo: per accedere viene utilizzata solo una passphrase. Pertanto, le modalità di richiesta possono essere diverse: puoi utilizzare un account per ricevere i codici per tutti i servizi, oppure puoi creare un account separato per ciascun servizio.

C'è anche un inconveniente: almeno una transazione deve essere presente sul conto. Affinché l'utente possa ricevere un messaggio crittografato con un codice, è necessario conoscere la sua chiave pubblica, che apparirà nella blockchain solo alla prima transazione. Noi siamo riusciti così a venirne fuori: abbiamo dato loro la possibilità di ricevere dei token gratuiti nel loro wallet. Tuttavia, una soluzione migliore è denominare l'account con una chiave pubblica. (Per confronto, abbiamo un numero di conto U1467838112172792705 è un derivato della chiave pubblica cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. Per il messenger questo è più comodo e leggibile, ma per il sistema di invio dei codici 2FA è una limitazione). Penso che in futuro qualcuno prenderà una decisione del genere e sposterà “Convenienza e Accessibilità” nella zona verde.

Il prezzo per l'invio di un codice 2FA è davvero basso: 0.001 ADM, ora è 0.00001 USD. Ancora una volta, puoi aumentare la tua blockchain e rendere il prezzo pari a zero.

Come collegare la 2FA sulla blockchain al tuo servizio

Spero di essere riuscito a convincere alcuni lettori ad aggiungere l'autorizzazione blockchain ai loro servizi.

Ti dirò come farlo usando il nostro messenger come esempio e per analogia puoi usare un'altra blockchain. Nell'app demo 2FA utilizziamo postgresql10 per archiviare le informazioni sull'account.

Fasi di connessione:

  1. Crea un account sulla blockchain da cui invierai i codici 2FA. Riceverai una passphrase, che viene utilizzata come chiave privata per crittografare i messaggi con codici e per firmare le transazioni.
  2. Aggiungi uno script al tuo server per generare codici 2FA. Se stai già utilizzando qualsiasi altro metodo 2FA con consegna di password monouso, hai già completato questo passaggio.
  3. Aggiungi uno script al tuo server per inviare codici all'utente nel messenger blockchain.
  4. Crea un'interfaccia utente per l'invio e l'inserimento di un codice 2FA. Se stai già utilizzando qualsiasi altro metodo 2FA con consegna di password monouso, hai già completato questo passaggio.

1 Crea un account

Creare un account nella blockchain significa generare una chiave privata, una chiave pubblica e un indirizzo di account derivato.

Procedi per proteggere la 2FA sulla blockchain

Innanzitutto, viene generata la passphrase BIP39 e da essa viene calcolato l'hash SHA-256. L'hash viene utilizzato per generare la chiave privata ks e la chiave pubblica kp. Dalla chiave pubblica, utilizzando lo stesso SHA-256 con inversione, otteniamo l'indirizzo nella blockchain.

Se desideri inviare codici 2FA ogni volta da un nuovo account, il codice di creazione dell'account dovrà essere aggiunto al server:

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()
}

Nell'applicazione demo l'abbiamo semplificata: abbiamo creato un account nell'applicazione web e da esso abbiamo inviato i codici. Nella maggior parte dei casi, questo è anche più conveniente per l'utente: sa che il servizio invia codici 2FA da un account specifico e può nominarlo.

Procedi per proteggere la 2FA sulla blockchain

2 Generazione di codici 2FA

È necessario generare un codice 2FA per ogni accesso utente. Usiamo la biblioteca speakeasy, ma puoi sceglierne un altro.

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

Verifica della validità del codice 2FA inserito dall'utente:

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

3 Invio del codice 2FA

Per inviare un codice 2FA, puoi utilizzare l'API del nodo blockchain, la libreria API JS o la console. In questo esempio utilizziamo la console: questa è la Command Line Interface, un'utilità che semplifica l'interazione con la blockchain. Per inviare un messaggio con un codice 2FA è necessario utilizzare il comando send message consolare.

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

Un modo alternativo per inviare messaggi è utilizzare il metodo send nella libreria API JS.

4 Interfaccia utente

All'utente deve essere data la possibilità di inserire un codice 2FA, questo può essere fatto in diversi modi a seconda della piattaforma applicativa. Nel nostro esempio questo è Vue.

Procedi per proteggere la 2FA sulla blockchain

Il codice sorgente per l'applicazione demo di autenticazione a due fattori blockchain può essere visualizzato su GitHub. Nel file Leggimi è presente un collegamento a una demo live per provarlo.

Fonte: habr.com

Aggiungi un commento