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;
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.
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
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 -
A maggio, l'ufficio del procuratore degli Stati Uniti per il distretto orientale del Michigan
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:
- 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.
- 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.
- 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
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
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
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.
l'articolo
- 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:
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:
- 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.
- 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.
- Aggiungi uno script al tuo server per inviare codici all'utente nel messenger blockchain.
- 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.
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.
2 Generazione di codici 2FA
È necessario generare un codice 2FA per ogni accesso utente. Usiamo la biblioteca
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.
Il codice sorgente per l'applicazione demo di autenticazione a due fattori blockchain può essere visualizzato su
Fonte: habr.com