I messaggi SMS sono un modo molto popolare di autenticazione a due fattori (2FA). Vengono utilizzati da banche, portafogli elettronici e cripto, caselle di posta e vari servizi; .
Questa situazione mi provoca indignazione, poiché questo metodo non è sicuro. La riattribuzione del numero da una SIM all'altra è iniziata già nei primi giorni della telefonia mobile — è il modo in cui si recupera il numero in caso di smarrimento della SIM. I “professionisti della sottrazione di denaro digitale” hanno capito: l'opzione di 'ri-scrittura della SIM' può essere utilizzata in schemi fraudolenti. Infatti, chi controlla la SIM può gestire anche il conto bancario online di qualcun altro, portafogli elettronici e persino criptovalute. Inoltre, è possibile appropriarsi del numero di un'altra persona attraverso la corruzione di un dipendente delle telecomunicazioni, tramite inganno o documenti falsi.

Migliaia di episodi di SIM swapping sono stati rivelati — questo è il nome dato a questo schema fraudolento. L'entità del disastro indica che presto il mondo rinuncerà alla 2FA tramite SMS. Ma questo non sta accadendo — in riferiscono che a scegliere il metodo di 2FA non sono gli utenti, ma i proprietari dei servizi.
Offriamo un metodo sicuro di 2FA utilizzando la consegna di codici monouso tramite blockchain e spiegheremo come il proprietario del servizio può attivarlo.
Il conto è milionario
Nel 2019, le frodi da SIM swapping sono aumentate del 63% secondo la polizia di Londra, e il "costo medio" per i criminali è di 4.000 GBP. Non ho trovato statistiche in Russia, ma presumo siano ancora peggiori.
Il SIM swapping viene utilizzato per rubare account popolari su Twitter, Instagram, Facebook, VK, conti bancari, e recentemente anche criptovalute — secondo quanto riferito dall'imprenditore bitcoin Joby Wicks. I casi eclatanti di furto di criptovalute tramite SIM swapping sono emersi nella stampa dal 2016; il 2019 ha visto un vero picco.
Nel maggio 2019, la procura degli Stati Uniti nel distretto orientale del Michigan a nove giovani tra i 19 e i 26 anni: si sospetta che facciano parte di una banda di hacker chiamata “The Community” («Comunità»). Alla banda vengono attribuite sette attacchi di swapping, durante i quali gli hacker hanno sottratto criptovalute per un valore di oltre 2,4 milioni di dollari. A aprile, uno studente della California, Joel Ortiz, ha ricevuto 10 anni di carcere per swapping SIM; il suo bottino ammontava a 7,5 milioni di dollari in criptovalute.

Foto di Joel Ortiz durante una conferenza stampa all'università. Dopo due anni sarà arrestato per frode informatica.
Principio di funzionamento dello swapping SIM
«Swapping» significa scambio. In tutti questi schemi i criminali si appropriano del numero di telefono della vittima, di solito attraverso la sostituzione della scheda SIM, e lo usano per reimpostare la password. Un tipico swapping SIM in teoria funziona così:
- Ricognizione. I truffatori ottengono i dati personali della vittima: nome e numero di telefono. Questi possono essere trovati in fonti pubbliche (social media, amici) o ottenuti da un complice - un dipendente dell'operatore telefonico.
- Disattivazione. La scheda SIM della vittima viene disattivata; basta chiamare il servizio clienti del provider, fornire il numero e dire che il telefono è stato smarrito.
- Cattura, trasferimento del numero sulla propria SIM. Di solito avviene tramite un intermediario nella compagnia telefonica oppure con la falsificazione di documenti.
Nella vita reale la situazione è ancora più dura. I criminali scelgono una vittima e poi tracciano quotidianamente la posizione del telefono: una richiesta per ottenere informazioni su un abbonato passato al roaming costa 1-2 centesimi. Non appena il proprietario della SIM si reca all'estero, si accordano con un manager nel negozio di telefonia per ottenere una nuova SIM. Questo costa circa $50 (ho trovato informazioni che variano da $20 a $100 in diversi paesi e operatori), mentre il manager nel peggiore dei casi verrà licenziato — non ci sono responsabilità per questo.
Ora tutti gli SMS arriveranno ai criminali, e il proprietario del telefono non potrà fare nulla al riguardo — sarà all'estero. In seguito, i malfattori avranno accesso a tutti gli account della vittima e, se lo desiderano, potranno cambiare le password.
Probabilità di recuperare il rubato
Le banche talvolta vengono incontro alle vittime e annullano i trasferimenti dai loro conti. Quindi è possibile recuperare denaro fiat, anche se il criminale non viene trovato. Ma con i portafogli di criptovalute è tutto più complicato — e tecnicamente, e legalmente. Finora nessun exchange/portafoglio ha risarcito le vittime dello swapping.
Se le vittime vogliono difendere i propri soldi in tribunale, accusano l'operatore: ha creato le condizioni per il furto di denaro dal conto. Proprio come ha fatto , che ha perso $224 milioni a causa dello swapping. Attualmente sta facendo causa alla compagnia telefonica AT&T.

Finora nessuno stato ha schemi operativi per proteggere legalmente i possessori di criptovalute. Assicurare il proprio capitale o ottenere un risarcimento per la sua perdita non è possibile. Pertanto, prevenire un attacco di swapping è più facile che affrontarne le conseguenze. Il modo più ovvio è utilizzare un "secondo fattore" più sicuro per la 2FA.
Il SIM swapping non è l'unico problema della 2FA tramite SMS
I codici di verifica via SMS non sono sicuri e 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 lo afferma nel suo ).
La presenza del 2FA spesso genera un falso senso di sicurezza negli utenti, portandoli a scegliere password più semplici. Questo rende l'autenticazione meno sicura e facilita l'accesso degli attaccanti agli account.
Inoltre, spesso gli SMS arrivano con notevole ritardo o non arrivano affatto.
Altri metodi di 2FA
Naturalmente, sui dispositivi mobili e tramite SMS non si esauriscono le opzioni. Esistono anche altri metodi di 2FA. Ad esempio, i codici TAN monouso: un metodo semplice ma efficace, utilizzato ancora in alcune banche. Alcuni sistemi impiegano dati biometrici, come impronte digitali o scansioni della retina. Un'altra opzione, che sembra un compromesso ragionevole tra comodità, sicurezza e prezzo, sono le app per il 2FA, come RSA Token e Google Authenticator. Ci sono anche chiavi fisiche e altri metodi.
In teoria, tutto appare logico e sicuro. Tuttavia, nella realtà, le soluzioni 2FA moderne presentano problemi, e per questo motivo la situazione attuale differisce dalle aspettative.
Secondo , l'uso del 2FA è di per sé scomodo, e la popolarità del 2FA via SMS è spiegata dal “minore inconveniente rispetto ad altri metodi” — ricevere codici usa e getta è comprensibile per l'utente.
Molti metodi di 2FA sono associati dagli utenti alla paura di perdere l'accesso. Una chiave fisica o un elenco di codici TAN possono essere smarriti o rubati. Personalmente, ho avuto esperienze negative con Google Authenticator. Il mio primo smartphone con questa applicazione si è rotto — pensate ai miei sforzi per recuperare l'accesso agli account. Un altro problema è il passaggio a un nuovo dispositivo. Google Authenticator non ha la possibilità di esportazione per motivi di sicurezza (se le chiavi possono essere esportate, dov'è la sicurezza in questo?). Una volta ho trasferito le chiavi manualmente, poi ho deciso che era più semplice tenere il vecchio smartphone in un cassetto.
Il metodo 2FA deve essere:
- Sicuro — l'accesso all'account deve avere solo tu, e non i malintenzionati
- Affidabile — accedi sempre all'account quando necessario
- Comodo e accessibile — l'uso del 2FA è comprensibile e richiede il minimo tempo
- Economico
Riteniamo che la blockchain sia una soluzione adatta.
Utilizza 2FA sulla blockchain
Per l'utente, il 2FA sulla blockchain appare uguale alla ricezione di codici temporanei via SMS. L'unica differenza è il canale di consegna. Il metodo di ricezione del codice 2FA dipende da ciò che offre la blockchain. Nel nostro progetto (le informazioni sono nel mio profilo) è un'app web, Tor, iOS, Android, Linux, Windows, MacOS.
Il servizio genera un codice temporaneo e lo invia a un messaggero sulla blockchain. Poi, secondo la 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, evidenzio:
- Un clic per creare un account - niente numeri di telefono e indirizzi email.
- Tutti i messaggi con i codici 2FA sono crittografati End-to-End curve25519xsalsa20poly1305.
- Le attacchi MITM sono esclusi - ogni messaggio con il codice 2FA è una transazione sulla blockchain e viene firmato con Ed25519 EdDSA.
- Il messaggio con il codice 2FA finisce nel suo blocco. La sequenza e il timestamp dei blocchi non possono essere modificati, quindi anche l'ordine dei messaggi.
- Non esiste una struttura centrale che verifica la "veridicità" del messaggio. Questo è compito di un sistema distribuito di nodi basato sul consenso, di proprietà degli utenti.
- Impossibilità di disattivazione - gli account non possono essere bloccati e i messaggi non possono essere eliminati.
- 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 monouso sa perfettamente che è stata consegnata. Nessun pulsante 'Invia di nuovo'.
Per un confronto con alcuni altri metodi di 2FA, ho preparato una tabella:

Un account in un messenger blockchain per ricevere i codici viene creato in un attimo — per accedere si utilizza solo la passphrase. Pertanto, le modalità di utilizzo possono essere diverse: si può usare un singolo account per ricevere i codici per tutti i servizi, oppure si può creare un account separato per ogni servizio.
C'è anche un inconveniente: l'account deve avere almeno una transazione. Perché l'utente riceva un messaggio crittografato con il codice, è necessario conoscere la sua chiave pubblica, che appare nella blockchain solo dopo la prima transazione. Abbiamo trovato una soluzione: abbiamo dato la possibilità di ricevere token gratuiti nel portafoglio. Tuttavia, una soluzione più corretta sarebbe nominare l'account con la chiave pubblica. (A titolo di confronto, il nostro numero di account U1467838112172792705 è un derivato della chiave pubblica cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. Per il messenger è più comodo e leggibile, ma per il sistema di invio dei codici 2FA è una limitazione). Penso che in futuro qualcuno svilupperà una soluzione del genere e porterà “Comodità e accessibilità” nella zona verde.
Il costo di invio del codice 2FA è realmente basso — 0.001 ADM, attualmente corrisponde a 0.00001 USD. Ancora una volta, è possibile avviare la propria blockchain e rendere il prezzo nullo.
Come collegare 2FA sulla blockchain al vostro servizio
Spero di aver interessato alcuni lettori a integrare l'autenticazione blockchain nei loro servizi.
Vi spiegherò come farlo prendendo come esempio il nostro messenger, e per analogia potete utilizzare un'altra blockchain. Nell'app demo 2FA utilizziamo postgresql10 per memorizzare informazioni sugli account.
Fasi di integrazione:
- Creare un account sulla blockchain da cui invierete i codici 2FA. Riceverete una passphrase, utilizzata come chiave privata per crittografare i messaggi con i codici e per firmare le transazioni.
- Aggiungere sul vostro server uno script per la generazione dei codici 2FA. Se state già utilizzando un altro metodo 2FA per l'invio di password monouso, questo passaggio è già completato.
- Aggiungi al tuo server uno script per inviare codici all'utente nel messenger blockchain.
- Crea un'interfaccia utente per inviare e inserire il codice 2FA. Se stai già utilizzando un altro metodo di 2FA con la consegna di password monouso, questo passaggio è già completato.
1 Creazione dell'account
La creazione di un account blockchain comporta la generazione di una chiave privata, una chiave pubblica e un indirizzo derivato da essa.

Per prima cosa viene generata una frase mnemonica 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, utilizzando lo stesso SHA-256 e l'inversione, otteniamo l'indirizzo nella blockchain.
Se desideri inviare codici 2FA ogni volta da un nuovo account, il codice per creare l'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 solo account nell'app web e inviamo i codici da esso. Nella maggior parte dei casi, questo è più conveniente per l'utente: sa che il servizio invia i codici 2FA da un account specifico e può nominarlo.

2 Generazione dei codici 2FA
È necessario generare un codice 2FA per ogni accesso dell'utente. Utilizziamo la libreria , ma puoi scegliere qualsiasi altra.
const hotp = speakeasy.hotp({
counter,
secret: account.seSecretAscii,
});
Verifica la 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, si può usare l'API del nodo blockchain, la libreria JS API o la console. In questo esempio utilizziamo la console: è un'interfaccia a riga di comando che semplifica l'interazione con il blockchain. Per inviare un messaggio con il codice 2FA, è necessaria la seguente 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 nella libreria JS API.
4 Interfaccia utente
L'utente deve avere la possibilità di inserire il codice 2FA, e questo può essere fatto in vari modi a seconda della piattaforma della tua applicazione. Nel nostro esempio utilizziamo Vue.

Il codice sorgente della demo dell'applicazione di autenticazione a due fattori basata su blockchain è disponibile in . Nel Readme trovi un link alla demo live per provarla.
Fonte: habr.com
