Treacă la 2FA sigur pe blockchain

Mesajele SMS sunt cea mai populară metodă de autentificare în doi pași (2FA). Aceasta este utilizată de bănci, portofele electronice și cripto, cutii poștale și diverse servicii; numărul utilizatorilor metodei se apropie de 100%.

Această evoluție a situației mă face să mă simt indignat, deoarece această metodă nu este sigură. Transferurile de numere între SIM-uri au început încă din primele zile ale telefoniei mobile - așa se recuperează numărul în cazul pierderii SIM-ului. „Experții în furtul banilor digitali” au realizat că opțiunea de „rescriere a SIM-ului” poate fi folosită în scheme frauduloase. Căci cine controlează SIM-ul poate gestiona atât online banking-ul, cât și portofelele electronice, și chiar criptomonedele. Însă, obținerea numărului unei alte persoane poate fi realizată prin mită către angajații operatorului de telecomunicații, prin înșelăciune sau documente false.

Treacă la 2FA sigur pe blockchain

Au fost dezvăluite mii de cazuri de SIM swapping - așa numește această schemă de fraudă. Dimensiunile dezastrului sugerează că în curând lumea va renunța la 2FA prin SMS. Dar acest lucru nu se întâmplă - în cercetare spun că metoda 2FA nu este aleasă de utilizatori, ci de proprietarii serviciilor.

Propunem să utilizăm o metodă sigură de 2FA cu livrarea codurilor unice prin blockchain și vom explica cum să o conecteze proprietarul serviciului.

Se discută despre milioane

În 2019, fraudarea prin SIM swapping a crescut cu 63%, conform datelor poliției londoneze, iar „cumpărarea medie” a infractorului a fost de 4.000 GBP. Nu am găsit statistici în Rusia, dar bănuiesc că sunt și mai rele.

SIM swapping este utilizat pentru a fura conturi populare de Twitter, Instagram, Facebook, VK, conturi bancare, iar recent a ajuns și la criptomonede - raportează ziarul Times potrivit lui Joby Wicks, un antreprenor în Bitcoin. Cazurile celebre de furt de criptomonede prin SIM swapping au început să apară în presă din 2016; 2019 a fost adevărata vârf.

În mai, procuratura din SUA din districtul estic Michigan a adus acuzații nouă tineri cu vârste cuprinse între 19 și 26 de ani: aceștia fac parte, se presupune, dintr-o bandă de hackeri numită „The Community”. Bandei i se imputa șapte atacuri de swapping, rezultând în înstrăinarea de criptomonede în valoare de peste 2,4 milioane de dolari. Și în aprilie, un student din California, Joel Ortiz, a primit 10 ani de închisoare pentru SIM swapping; prada sa a fost de 7,5 milioane de dolari în criptomonede.

Treacă la 2FA sigur pe blockchain
Fotografia lui Joel Ortiz la o conferință de presă la universitate. După doi ani, el va fi arestat pentru înșelăciune cibernetică.

Principiul funcționării SIM swapping-ului

«Swapping» înseamnă schimb. În toate schemele de acest tip, infractorii își însușesc numărul de telefon al victimei, de obicei prin reemiterea unui card SIM, și îl folosesc pentru a reseta parola. Un SIM swapping tipic arată astfel în teorie:

  1. Recunoaștere. Infractorii află datele personale ale victimei: numele și telefonul. Acestea pot fi găsite în surse deschise (rețele sociale, prieteni) sau obținute de la un complice — un angajat al operatorului de telefonie mobilă.
  2. Blocare. Cardul SIM al victimei este dezactivat; pentru aceasta, este suficient să suni la suportul tehnic al furnizorului, să comunici numărul și să spui că telefonul a fost pierdut.
  3. Capturare, transferarea numărului pe SIM-ul propriu. De obicei, acest lucru se face și printr-un complice din compania de telecomunicații sau prin falsificarea documentelor.

În viața reală, lucrurile sunt și mai dure. Infractorii își aleg victima și apoi monitorizează zilnic locația telefonului — o solicitare pentru obținerea informațiilor că abonatul a intrat în roaming costă 1-2 cenți. De îndată ce deținătorul cardului SIM a plecat în străinătate, ei se înțeleg cu managerul din magazinul de telecomunicații pentru a obține un nou card SIM. Acesta costă în jur de 50 USD (am găsit informații — în diferite țări și la diferiți operatori, între 20 și 100 USD), totodată, managerul va fi concediat în cel mai rău caz — pentru aceasta nu există responsabilitate.

Acum toate SMS-urile vor fi primite de infractori, iar deținătorul telefonului nu va putea face nimic în privința asta — el se află în străinătate. Iar mai departe, răufăcătorii obțin acces la toate conturile victimei și, dacă doresc, schimbă parolele.

Șansele de a recupera bunurile furate

Băncile uneori vin în ajutorul victimelor și retrag transferurile din conturile lor. De aceea, este posibil să recuperezi bani fiat, chiar dacă infractorul nu este găsit. Dar în cazul portofelelor criptografice, este mai complicat — atât din punct de vedere tehnic , cât și din punct de vedere legislativ. Până acum, niciun schimb/portofel nu a plătit despăgubiri victimelor swapping-ului.Dacă victimele doresc să-și apere banii în instanță, acestea dau în judecată operatorul: el a creat condițiile pentru furtișagurile din cont. Așa a procedat

Michael Terpin , care a pierdut din cauza swapping-ului 224 milioane USD. Acum el dă în judecată compania de telecomunicații AT&T., care a pierdut din cauza swap-urilor 224 milioane de dolari. Acum dă în judecată compania de telecomunicații AT&T.

Treacă la 2FA sigur pe blockchain

Până în prezent, nicio țară nu are scheme funcționare pentru a proteja legal proprietarii de criptomonede. Nu este posibil să îți asiguri capitalul sau să primești o compensație pentru pierderile suferite. De aceea, prevenirea unui atac de tip swapping este mai simplă decât a lupta cu consecințele acestuia. Cel mai evident mod este de a folosi un „al doilea factor” mai sigur pentru 2FA.

SIM swapping nu este singura problemă a 2FA prin SMS.

Codurile de confirmare prin SMS sunt nesigure și din punct de vedere tehnic. Mesajele pot fi interceptate din cauza vulnerabilităților inevitabile din sistemul de semnalizare Signaling System 7 (SS7). 2FA prin SMS este oficial recunoscută ca fiind nesigură (Institutul Național de Standarde și Tehnologie din SUA vorbește despre acest lucru în Ghidul său pentru autentificarea digitală.).

Totuși, prezența 2FA îi oferă adesea utilizatorului un sentiment fals de siguranță, iar acesta alege o parolă mai simplă. Prin urmare, astfel de metode de autentificare nu îngreunează, ci facilitează accesul infractorului la cont.

De asemenea, adesea mesajele SMS vin cu o întârziere mare sau nu vin deloc.

Alte metode de 2FA.

Desigur, pe smartphone-uri și SMS-uri nu se încheie totul. Există și alte modalități de 2FA. De exemplu, codurile TAN unice: o metodă primitivă, dar funcțională – este încă utilizată în unele bănci. Există sisteme bazate pe date biometrice: amprente digitale, scanări ale retinei. O altă opțiune, care pare un compromis rezonabil între confort, fiabilitate și cost – aplicațiile speciale pentru 2FA: RSA Token, Google Authenticator. Și mai sunt chei fizice și alte metode.

În teorie, totul pare logic și fiabil. Dar, în practică, soluțiile moderne de 2FA au probleme, iar din această cauză realitatea diferă de așteptări.

Conform cercetării, folosirea 2FA este o neplăcere în principiu, iar popularitatea 2FA prin SMS este explicată prin „confortul mai redus în comparație cu alte metode” – obținerea codurilor unice este clară pentru utilizator.

Multe metode de 2FA sunt asociate de utilizatori cu teama de a pierde accesul. Un cheie fizică sau o listă de parole TAN pot fi pierdute sau pot fi furate. Personal, am avut o experiență negativă cu Google Authenticator. Primul meu smartphone cu această aplicație s-a stricat — puteți evalua eforturile mele de a recâștiga accesul la conturi. O altă problemă este trecerea la un dispozitiv nou. Google Authenticator nu oferă posibilitatea de export din motive de securitate (dacă cheile pot fi exportate, care este securitatea?). Odată, am transferat manual cheile, iar apoi am decis că este mai simplu să păstrez vechiul smartphone într-o cutie pe raft.

Metoda 2FA ar trebui să fie:

  • Securizată — accesul la cont ar trebui să fie permis doar ție, nu atacatorilor
  • De încredere — trebuie să ai acces la cont întotdeauna, când ai nevoie
  • Convenabilă și accesibilă — utilizarea 2FA ar trebui să fie clară și să dureze minim timp
  • IEftină

Considerăm că blockchainul este soluția potrivită.

Folosește 2FA pe blockchain

Pentru utilizator, 2FA pe blockchain arată la fel ca primirea de coduri unice prin SMS. Singura diferență este canalul de livrare. Metoda de obținere a codului 2FA depinde de ceea ce oferă blockchainul. În proiectul nostru (informațiile sunt disponibile în profilul meu), acesta este o aplicație web, Tor, iOS, Android, Linux, Windows, MacOS.

Serviciul generează un cod unic și îl trimite într-un mesaj pe blockchain. Apoi — ca de obicei: utilizatorul introduce codul primit în interfața serviciului și se autentifică.

Treacă la 2FA sigur pe blockchain

În articol Cum funcționează un messenger descentralizat pe blockchain Am scris că blockchainul asigură securitatea și confidențialitatea transmisiilor de mesaje. În ceea ce privește trimiterea codurilor 2FA, voi sublinia:

  • Un clic pentru a crea un cont — fără telefoane și adrese de email.
  • Toate mesajele cu coduri 2FA sunt criptate End-to-End curve25519xsalsa20poly1305.
  • Atacurile MITM sunt excluse — fiecare mesaj cu un cod 2FA este o tranzacție pe blockchain și este semnat cu Ed25519 EdDSA.
  • Mesajul cu codul 2FA ajunge în propriul său bloc. Secvența și timestampul blocurilor nu pot fi modificate, iar astfel și ordinea mesajelor.
  • Nu există o structură centrală care să verifice "autenticitatea" mesajului. Aceasta este realizată de un sistem distribuit de noduri bazat pe consens, care aparține utilizatorilor.
  • Imposibilitatea de a dezactiva — conturile nu pot fi blocate, iar mesajele nu pot fi șterse.
  • Acces la codurile 2FA de pe orice dispozitiv, oricând.
  • Confirmarea livrării unui mesaj cu cod 2FA. Serviciul care trimite parola unică știe cu siguranță că a fost livrat. Nu sunt disponibile butoane de „Trimite din nou”.

Pentru a compara cu alte metode 2FA, am creat un tabel:

Treacă la 2FA sigur pe blockchain

Un cont în mesageria blockchain pentru a primi coduri de utilizator este obținut în câteva secunde — pentru autentificare se folosește doar fraza de acces. Prin urmare, metodele de utilizare pot fi diferite: se poate folosi un singur cont pentru a primi coduri pentru toate serviciile sau se pot crea conturi separate pentru fiecare serviciu.

Există și un inconvenient — contul trebuie să aibă cel puțin o tranzacție. Pentru ca utilizatorul să primească un mesaj criptat cu un cod, trebuie să știe cheia sa publică, iar aceasta apare în blockchain doar după prima tranzacție. Am găsit o soluție: am oferit posibilitatea de a obține token-uri gratuite în portofel. Totuși, o soluție mai corectă ar fi să numim contul după cheia publică. (Pentru comparație, numărul nostru de cont U1467838112172792705 este derivat din cheia publică cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. Pentru mesagerie este mai convenabil și mai ușor de citit, dar pentru sistemul de trimitere a codurilor 2FA — o limitare). Cred că, în viitor, cineva va realiza o astfel de soluție și va transforma „Conveniența și accesibilitatea” în zona verde.

Costul trimiterii unui cod 2FA este foarte mic — 0.001 ADM, acum aceasta este echivalentul a 0.00001 USD. Din nou, se poate crea propriul blockchain și face prețul zero.

Cum să conectați 2FA pe blockchain la serviciul dumneavoastră

Sper că am reușit să stârnesc interesul câtorva cititori pentru a adăuga autorizarea blockchain pe serviciile lor.

Voi povesti cum să faceți acest lucru folosind ca exemplu mesageria noastră, iar prin analogie puteți utiliza și alte blockchain-uri. În aplicația demo 2FA folosim postgresql10 pentru a stoca informațiile despre conturi.

Etapele conectării:

  1. Creează un cont în blockchain din care vei trimite codurile 2FA. Vei obține o frază de acces, folosită ca cheie privată pentru criptarea mesajelor cu coduri și pentru semnarea tranzacțiilor.
  2. Adaugă pe serverul tău un script pentru generarea codurilor 2FA. Dacă deja folosești o altă metodă 2FA cu livrarea de parole unice, acest pas este deja finalizat.
  3. Adaugă pe serverul tău un script pentru trimiterea codurilor utilizatorului în mesageria blockchain.
  4. Creează o interfață utilizator pentru trimiterea și introducerea codului 2FA. Dacă deja folosești o altă metodă 2FA cu livrare de parole de unică folosință, acest pas este deja complet.

1 Crearea unui cont

Crearea unui cont în blockchain înseamnă generarea unei chei private, a unei chei publice și a unei adrese derivate din aceasta.

Treacă la 2FA sigur pe blockchain

Mai întâi se generează o frază secretă BIP39, din care se calculează hash-ul SHA-256. Hash-ul este folosit pentru a genera cheia privată ks și cheia publică kp. Din cheia publică, folosind același SHA-256 cu inversarea, obținem adresa în blockchain.

Dacă dorești să trimiți coduri 2FA de fiecare dată de pe un cont nou, vei trebui să adaugi codul pentru crearea contului pe 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()
}

În aplicația demo am simplificat — am creat un cont în aplicația web și trimitem coduri de pe acesta. În majoritatea cazurilor este mai convenabil pentru utilizator: el știe că serviciul trimite coduri 2FA de pe un anumit cont și îl poate numi.

Treacă la 2FA sigur pe blockchain

2 Generarea codurilor 2FA

Codul 2FA trebuie generat pentru fiecare autentificare a utilizatorului. Folosim biblioteca speakeasy, dar poți alege orice altă bibliotecă.

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

Verificarea validității codului 2FA introdus de utilizator:

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

3 Trimiterea codului 2FA

Pentru a trimite codul 2FA, poți utiliza API-ul nodului blockchain, biblioteca JS API sau consola. În acest exemplu folosim consola — o interfață de linie de comandă, un utilitar care simplifică interacțiunea cu blockchain-ul. Pentru a trimite un mesaj cu codul 2FA, trebuie utilizată comanda send message în 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);

O metodă alternativă de a trimite mesaje este utilizarea unei metode send în biblioteca API JS.

4 Interfața utilizatorului

Utilizatorul trebuie să aibă posibilitatea de a introduce codul 2FA, acest lucru poate fi realizat în diverse moduri, în funcție de platforma aplicației dumneavoastră. În exemplul nostru, este vorba despre Vue.

Treacă la 2FA sigur pe blockchain

Codul sursă al aplicației demo de autentificare cu doi factori pe blockchain poate fi vizualizat în GitHub. În Readme există un link către Live demo, pentru a încerca.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster