I messaggi SMS sono il modo più popolare di autenticazione a due fattori (2FA). Li utilizzano banche, portafogli elettronici e criptovalute, caselle di posta e vari servizi; .
Questa situazione mi provoca indignazione, poiché questo metodo non è sicuro. La possibilità di trasferire un numero da una SIM a un'altra è stata introdotta all'inizio dell'era mobile, per ripristinare il numero in caso di perdita della scheda SIM. Gli “esperti del furto di denaro digitale” hanno capito che l'opzione di “ri-scrittura della SIM” può essere utilizzata in schemi fraudolenti. Infatti, chi controlla la scheda SIM può gestire il banking online di un altro utente, portafogli elettronici e persino criptovalute. E appropriarsi del numero di un'altra persona può avvenire tramite corruzione di un dipendente del telecom, inganni o documenti falsi.

Migliaia di episodi di SIM swapping sono stati rivelati: così è stato chiamato questo schema di frode. L'entità del problema indica che presto il mondo rinuncerà alla 2FA tramite SMS. Ma questo non sta accadendo – si riporta che non sono gli utenti a scegliere il metodo 2FA, ma i proprietari dei servizi.
Noi proponiamo di utilizzare un metodo sicuro di 2FA, inviando codici monouso tramite blockchain, e mostreremo come il proprietario del servizio può attivarlo.
Il conto è di milioni
Nel 2019, le frodi tramite SIM swapping sono aumentate del 63% secondo la polizia di Londra, e il “costo medio” di una frode è di 4.000 GBP. Non ho trovato statistiche per la Russia, ma suppongo siano anche peggiori.
Il SIM swapping viene utilizzato per rubare account popolari di Twitter, Instagram, Facebook, VK, conti bancari e recentemente ha colpito anche le criptovalute – secondo quanto riferito dall'imprenditore bitcoin Joby Wicks. I casi di furto di criptovalute attraverso SIM swapping sono emersi nella stampa dal 2016; nel 2019 si è registrato un vero picco.
A maggio, la procura degli Stati Uniti nel distretto orientale del Michigan a nove giovani di età compresa tra 19 e 26 anni: si presume facciano parte di una banda di hacker chiamata “The Community”. Alla banda sono imputati sette attacchi di swapping, in cui gli hacker hanno appropriato criptovalute per un valore superiore a 2,4 milioni di dollari. In aprile, uno studente californiano, Joel Ortiz, ha ricevuto 10 anni di carcere per SIM swapping; il suo bottino è stato di 7,5 milioni di dollari in criptovalute.

Foto di Joel Ortiz alla conferenza stampa all'università. Due anni dopo sarà arrestato per frode informatica.
Il principio del SIM swapping
«Swapping» significa scambio. In tutti questi schemi, i criminali si appropriano del numero di telefono della vittima, di solito tramite il riemissione della SIM, e lo usano per reimpostare la password. Un tipico SIM swapping in teoria appare così:
- Intelligence. I truffatori scoprono i dati personali della vittima: nome e numero di telefono. Questi possono essere trovati in fonti aperte (social network, amici) o ottenuti da un complice — un dipendente dell'operatore telefonico.
- Blocco. La SIM della vittima viene disattivata; per farlo è sufficiente chiamare l'assistenza clienti dell'operatore, fornire il numero e dire che il telefono è stato smarrito.
- Cattura, trasferimento del numero sulla propria SIM. Di solito questo viene fatto anche tramite un complice nell'azienda di telecomunicazioni o con documenti falsificati.
Nella vita reale è ancora più duro. I malintenzionati scelgono una vittima e poi monitorano ogni giorno la posizione del telefono: una richiesta per ottenere informazioni su quando l'abbonato è andato in roaming costa 1-2 centesimi. Non appena il proprietario della SIM si reca all'estero, si accordano con un manager presso il negozio di telefonia per ottenere una nuova SIM. Questo costa circa $50 (ho trovato informazioni - in diversi paesi e da diversi operatori da $20 a $100), mentre il manager nel peggiore dei casi sarà licenziato — per questo non c'è responsabilità.
Ora tutti gli SMS saranno ricevuti dai malintenzionati, e il proprietario del telefono non potrà fare nulla di fronte a questa situazione — è all'estero. E poi i criminali ottengono accesso a tutti gli account della vittima e, se lo desiderano, cambiano le password.
Le possibilità di recuperare il rubato
Le banche a volte si mostrano disponibili nei confronti delle vittime e richiamano i trasferimenti dai loro conti. Quindi è possibile recuperare denaro fiat, anche se il criminale non viene trovato. Ma con i portafogli di criptovaluta è più complicato — sia tecnicamenteche legalmente. Fino ad ora, nessun exchange/portafoglio ha rimborsato le vittime dello swapping.
Se le vittime vogliono difendere i loro soldi in tribunale, accusano l'operatore: ha creato le condizioni per il furto di denaro dal conto. Questo è esattamente quello che ha fatto , che ha perso a causa dello swapping $224 milioni. Ora sta citando in giudizio l'azienda di telecomunicazioni AT&T.

Attualmente, nessuno stato ha schemi operativi per proteggere legalmente i possessori di criptovalute. Non è possibile assicurare il proprio capitale o ricevere un risarcimento per la sua perdita. Pertanto, prevenire un attacco di swapping è più semplice che combatterne le conseguenze. Il modo più ovvio è utilizzare un "secondo fattore" più affidabile per la 2FA.
Il SIM swapping non è l'unico problema della 2FA tramite SMS
I codici di conferma via SMS non sono sicuri dal punto di vista tecnico. I messaggi possono essere intercettati a causa di vulnerabilità intrinseche nel sistema di segnalazione Signaling System 7 (SS7). La 2FA via SMS è ufficialmente riconosciuta come non sicura (il National Institute of Standards and Technology degli Stati Uniti ne parla nel suo ).
Tuttavia, avere una 2FA spesso dà all'utente una falsa sensazione di sicurezza, portandolo a scegliere una password più semplice. Quindi, questo tipo di autenticazione non ostacola, ma facilita l'accesso del malintenzionato all'account.
Inoltre, spesso gli SMS arrivano con un grande ritardo o non arrivano affatto.
Altri metodi di 2FA
Naturalmente, su smartphone e SMS il mondo non si ferma. Esistono anche altri modi per la 2FA. Ad esempio, i codici TAN usa e getta: è un metodo primitivo, ma funziona — è ancora utilizzato in alcune banche. Ci sono sistemi che utilizzano dati biometrici: impronte digitali, scansioni dell'iride. Un'altra opzione che sembra essere un compromesso ragionevole in termini di comodità, affidabilità e costi sono le applicazioni speciali per la 2FA: RSA Token, Google Authenticator. Ci sono anche chiavi fisiche e altri metodi.
In teoria, tutto sembra logico e sicuro. Ma nella pratica, le moderne soluzioni di 2FA presentano problemi, e per questo la realtà differisce dalle aspettative.
Secondo , l'uso della 2FA è in sé un inconveniente, e la popolarità della 2FA tramite SMS è spiegata da "un disagio minore rispetto ad altri metodi" — ottenere codici usa e getta è comprensibile per l'utente.
Molti utenti associano i metodi 2FA alla paura di perdere l'accesso. Una chiave fisica o un elenco di password TAN possono essere smarriti o rubati. Personalmente, ho avuto esperienze negative con Google Authenticator. Il mio primo smartphone con quest'app si è rotto: valutate il mio impegno nel ripristinare l'accesso agli account. Un altro problema è il passaggio a un nuovo dispositivo. Google Authenticator non offre la possibilità di esportare per motivi di sicurezza (se le chiavi possono essere esportate, quale sicurezza abbiamo?). Una volta ho trasferito le chiavi manualmente, poi ho deciso che era più semplice tenere il vecchio smartphone in una scatola sulla mensola.
Il metodo 2FA deve essere:
- Sicuro — l'accesso all'account deve essere riservato solo a te, non a malintenzionati
- Affidabile — puoi accedere all'account quando ne hai bisogno
- Comodo e accessibile — l'uso del 2FA è chiaro e richiede poco tempo
- Economico
Riteniamo che la blockchain sia una soluzione adeguata.
Utilizza il 2FA sulla blockchain
Per l'utente, il 2FA sulla blockchain appare come la ricezione di codici usa e getta tramite SMS. L'unica differenza è il canale di consegna. Il modo in cui si riceve il codice 2FA dipende da ciò che offre la blockchain. Nel nostro progetto (le informazioni sono nel mio profilo) si tratta di un'app Web, Tor, iOS, Android, Linux, Windows, MacOS.
Il servizio genera un codice usa e getta e lo invia a un messaggero sulla blockchain. Poi, come da prassi: l'utente inserisce il codice ricevuto nell'interfaccia del servizio e si autentica.

Nell'articolo Ho scritto che la blockchain garantisce la sicurezza e la privacy nella trasmissione dei messaggi. Riguardo all'invio dei codici 2FA, voglio sottolineare:
- Un clic per creare un account — niente telefoni o email.
- Tutti i messaggi con i codici 2FA sono crittografati End-to-End curve25519xsalsa20poly1305.
- Gli attacchi MITM sono esclusi — ogni messaggio con il codice 2FA è una transazione nella blockchain e viene firmato con Ed25519 EdDSA.
- Il messaggio con il codice 2FA entra nel proprio blocco. La sequenza e il timestamp dei blocchi non possono essere modificati, così come l'ordine dei messaggi.
- Non c'è una struttura centrale che verifica l'«autenticità» del messaggio. Questo è fatto da un sistema distribuito di nodi basato sul consenso, che appartiene agli utenti.
- Impossibilità di disabilitare — non è possibile bloccare gli account o eliminare i messaggi.
- Accesso ai codici 2FA da qualsiasi dispositivo in qualsiasi momento.
- Conferma della consegna del messaggio con il codice 2FA. Il servizio che invia la password usa e getta sa esattamente che è stata consegnata. Niente pulsanti 'Invia di nuovo'.
Per fare un confronto con alcuni altri metodi 2FA, ho creato una tabella:

L'account nel messenger blockchain per ricevere i codici viene creato in un attimo: per l'accesso viene utilizzata solo la passphrase. Pertanto, anche i modi di utilizzo possono essere diversi: si può utilizzare un singolo account per ricevere codici per tutti i servizi, oppure creare un account separato per ciascun servizio.
C'è anche un inconveniente: l'account deve avere almeno una transazione. Affinché l'utente riceva un messaggio crittografato con il codice, è necessario conoscere la sua chiave pubblica, la quale appare nella blockchain solo con la prima transazione. Noi abbiamo risolto il problema in questo modo: abbiamo permesso di ricevere nel portafoglio token gratuiti. Tuttavia, una soluzione più corretta sarebbe denominare l'account con la chiave pubblica. (A titolo di confronto, il nostro numero di account U1467838112172792705 è derivato dalla chiave pubblica cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. Per il messenger è più conveniente e leggibile, ma per il sistema di invio dei codici 2FA rappresenta un limite). Penso che in futuro qualcuno creerà una tale soluzione e porterà “Convenienza e accessibilità” nella zona verde.
Il costo di invio di un codice 2FA è davvero basso: 0.001 ADM, attualmente corrisponde a 0.00001 USD. Ancora una volta, è possibile creare la propria blockchain e rendere il costo nullo.
Come collegare 2FA alla blockchain per il tuo servizio
Spero di essere riuscito a suscitare l'interesse di alcuni lettori per aggiungere l'autenticazione blockchain ai loro servizi.
Spiegherò come farlo usando il nostro messenger come esempio, e analogamente potete usare un'altra blockchain. Nell'app demo 2FA utilizziamo postgresql10 per memorizzare le informazioni sugli account.
Fasi di collegamento:
- Creare un account nella blockchain da cui invierai i codici 2FA. Riceverai una passphrase che viene utilizzata come chiave privata per la crittografia dei messaggi con i codici e per firmare le transazioni.
- Aggiungere al tuo server uno script per generare i codici 2FA. Se già utilizzi un altro metodo 2FA con la consegna di password usa e getta, questo passaggio è già stato completato.
- Aggiungere al tuo server uno script per inviare i codici all'utente nel messenger blockchain.
- Creare un'interfaccia utente per l'invio e l'inserimento del codice 2FA. Se già utilizzi un altro metodo 2FA con la consegna di password usa e getta, questo passaggio è già stato completato.
1 Creazione dell'account
La creazione di un account nel blockchain consiste nella generazione di una chiave privata, una chiave pubblica e dell'indirizzo dell'account derivato.

Prima si genera una frase segreta BIP39, da cui si calcola l'hash SHA-256. L'hash viene utilizzato per generare la chiave privata ks e la chiave pubblica kp. Dalla chiave pubblica, tramite lo stesso SHA-256 in forma inversa, otteniamo l'indirizzo nel blockchain.
Se desideri inviare codici 2FA ogni volta da un nuovo account, il codice per la 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'app demo abbiamo semplificato: abbiamo creato un account nell'app web e inviamo i codici da quello. Nella maggior parte dei casi è più conveniente per l'utente: sa che il servizio invia i codici 2FA da un account specifico e può nominarlo.

2 Generazione di codici 2FA
Il codice 2FA deve essere generato per ogni accesso dell'utente. Utilizziamo la libreria , ma puoi scegliere qualsiasi altra libreria.
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 il codice 2FA, è possibile utilizzare l'API del nodo blockchain, la libreria JS API o la console. In questo esempio utilizziamo la console: è un'interfaccia a riga di comando, uno strumento che semplifica l'interazione con il blockchain. Per inviare un messaggio con il codice 2FA, devi usare il comando send message dalla console.
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 dalla libreria JS API.
4 Interfaccia utente
L'utente deve avere la possibilità di inserire un codice 2FA, e questo può essere fatto in vari modi a seconda della piattaforma della tua applicazione. Nel nostro esempio, si tratta di Vue.

Il codice sorgente dell'applicazione dimostrativa per l'autenticazione a due fattori sulla blockchain può essere visualizzato in . Nel Readme c'è un link alla Live demo per provare.
Fonte: habr.com
