Flytt for å sikre 2FA på blokkjeden

SMS-meldinger er den mest populære metoden for tofaktorautentisering (2FA). Den brukes av banker, elektroniske og krypto-lommebøker, postkasser og alle slags tjenester; antall metodebrukere nærmer seg 100 %.

Jeg er indignert over dette scenariet, fordi denne metoden er utrygg. Overføring av et nummer fra ett SIM-kort til et annet begynte i begynnelsen av mobiltiden - dette er hvordan nummeret gjenopprettes når et SIM-kort går tapt. "Digitale pengetyverispesialister" innså at alternativet "omskriv SIM-kort" kan brukes i uredelige ordninger. Tross alt kan den som kontrollerer SIM-kortet kontrollere andres nettbank, elektroniske lommebøker og til og med kryptovaluta. Og du kan ta en annen persons nummer i besittelse ved å bestikke en telekomansatt, bruke bedrag eller forfalskede dokumenter.

Flytt for å sikre 2FA på blokkjeden

Tusenvis av episoder med SIM-bytte har blitt avdekket, som denne svindelordningen kalles. Omfanget av katastrofen antyder at verden snart vil forlate 2FA via SMS. Men dette skjer ikke - i studie de sier at det ikke er brukere som velger 2FA-metoden, men tjenesteeiere.

Vi foreslår å bruke den sikre 2FA-metoden med levering av engangskoder via blokkjeden, og vi vil fortelle deg hvordan tjenesteeieren kan koble den til.

Antallet går i millioner

I 2019 økte svindel med SIM-bytte med 63 % ifølge London-politiet, og "gjennomsnittsregningen" til en angriper var 4,000 GBP. Jeg har ikke funnet noen statistikk i Russland, men jeg antar at de er enda verre.

SIM-bytte brukes til å stjele populære Twitter-, Instagram-, Facebook-, VK-kontoer, bankkontoer og nylig til og med kryptovalutaer - Det melder avisen Times ifølge Bitcoin-gründer Joby Weeks. Høyprofilerte tilfeller av kryptovaluta-tyveri ved bruk av SIM-bytte har dukket opp i pressen siden 2016; 2019 så en virkelig topp.

I mai, det amerikanske advokatkontoret for det østlige distriktet i Michigan reiste tiltale ni unge mennesker mellom 19 og 26 år: de antas å være en del av en hackergjeng kalt "The Community". Gjengen er siktet for syv bytteangrep, som et resultat av at hackerne stjal kryptovaluta verdt over 2,4 millioner dollar. Og i april fikk California-studenten Joel Ortiz 10 års fengsel for SIM-bytte; produksjonen hans var på 7.5 millioner dollar i kryptovalutaer.

Flytt for å sikre 2FA på blokkjeden
Bilde av Joel Ortiz på en pressekonferanse ved universitetet. To år senere vil han bli varetektsfengslet for nettsvindel.

Hvordan SIM-bytte fungerer

"Swap" betyr bytte. I alle slike ordninger tar kriminelle over offerets telefonnummer, vanligvis ved å utstede et SIM-kort på nytt, og bruker det til å tilbakestille passordet. En typisk SIM-bytte ser i teorien slik ut:

  1. Etterretningstjeneste. Svindlere finner ut offerets personlige opplysninger: navn og telefonnummer. De kan finnes i åpne kilder (sosiale nettverk, venner) eller mottas fra en medskyldig - en ansatt hos en mobiloperatør.
  2. Blokkering. Offerets SIM-kort er deaktivert; For å gjøre dette, ring bare leverandørens tekniske støtte, oppgi nummeret og si at telefonen var tapt.
  3. Ta opp, overfør nummeret til SIM-kortet ditt. Vanligvis gjøres dette også gjennom en medskyldig i teleselskapet eller gjennom dokumentforfalskning.

I det virkelige liv er ting enda mer alvorlig. Angripere velger et offer og sporer deretter plasseringen til telefonen daglig – én forespørsel om å motta informasjon om at abonnenten har gått over til roaming koster 1-2 cent. Så snart eieren av SIM-kortet har reist til utlandet, forhandler de med lederen i kommunikasjonsbutikken om å utstede et nytt SIM-kort. Det koster ca $50 (jeg fant informasjon - i forskjellige land og med forskjellige operatører fra $20 til $100), og i verste fall vil manageren få sparken - det er ikke noe ansvar for dette.

Nå vil all SMS mottas av angripere, og eieren av telefonen vil ikke kunne gjøre noe med det - han er i utlandet. Og så får skurkene tilgang til alle offerets kontoer og endrer passord hvis ønskelig.

Sjanser for å returnere stjålet eiendom

Banker tar noen ganger imot ofre halvveis og trekker overføringer fra kontoene deres. Derfor er det mulig å returnere fiat-penger selv om forbryteren ikke blir funnet. Men med cryptocurrency-lommebøker er alt mer komplisert - og teknisk sett, og lovmessig. Så langt har ikke en eneste børs/lommebok betalt erstatning til ofre for bytte.

Hvis ofre ønsker å forsvare pengene sine i retten, skylder de på operatøren: han skapte betingelsene for tyveri av penger fra kontoen. Det var akkurat det jeg gjorde Michael Turpin, som tapte 224 millioner dollar på grunn av bytte. Han saksøker nå telekommunikasjonsselskapet AT&T.

Flytt for å sikre 2FA på blokkjeden

Så langt har ingen stat fungerende ordninger for å lovlig beskytte eiere av kryptovaluta. Det er umulig å forsikre kapitalen din eller få erstatning for tapet. Derfor er det enklere å forhindre et bytteangrep enn å håndtere konsekvensene. Den mest åpenbare måten er å bruke en mer pålitelig "andre faktor" for 2FA.

SIM-bytte er ikke det eneste problemet med 2FA via SMS

Bekreftelseskoder i SMS er også utrygge fra et teknisk synspunkt. Meldinger kan bli fanget opp på grunn av uopprettede sårbarheter i Signaling System 7 (SS7). 2FA over SMS er offisielt anerkjent som usikker (US National Institute of Standards and Technology sier dette i sin Digital autentiseringsveiledning).

Samtidig gir tilstedeværelsen av 2FA ofte brukeren en følelse av falsk sikkerhet, og han velger et enklere passord. Derfor gjør slik autentisering det ikke vanskelig, men gjør det lettere for en angriper å få tilgang til kontoen.

Og ofte kommer SMS med lang forsinkelse eller kommer ikke i det hele tatt.

Andre 2FA-metoder

Selvfølgelig konvergerte ikke lyset på smarttelefoner og SMS. Det finnes andre metoder for 2FA. For eksempel engangs TAN-koder: en primitiv metode, men den fungerer - den brukes fortsatt i noen banker. Det er systemer som bruker biometriske data: fingeravtrykk, netthinneskanning. Et annet alternativ som virker som et rimelig kompromiss når det gjelder bekvemmelighet, pålitelighet og pris er spesialapplikasjoner for 2FA: RSA Token, Google Authenticator. Det finnes også fysiske nøkler og andre metoder.

I teorien ser alt logisk og pålitelig ut. Men i praksis har moderne 2FA-løsninger problemer, og på grunn av dem skiller virkeligheten seg fra forventningene.

Ifølge Lete, bruken av 2FA er i prinsippet en ulempe, og populariteten til 2FA via SMS forklares med "mindre ulempe sammenlignet med andre metoder" - mottak av engangskoder er forståelig for brukeren.

Brukere forbinder mange 2FA-metoder med frykten for at tilgangen går tapt. Den fysiske nøkkelen eller listen over TAN-passord kan gå tapt eller stjeles. Jeg personlig har hatt dårlige erfaringer med Google Authenticator. Min første smarttelefon med denne applikasjonen gikk i stykker - setter pris på innsatsen min for å gjenopprette tilgangen til kontoene mine. Et annet problem er å bytte til en ny enhet. Google Authenticator har ikke et eksportalternativ på grunn av sikkerhetsårsaker (hvis nøkler kan eksporteres, hvilken sikkerhet er det?). En gang bar jeg nøklene manuelt, og da bestemte jeg meg for at det var lettere å la den gamle smarttelefonen ligge i en boks på en hylle.

2FA-metoden bør være:

  • Sikkert – bare du og ikke angripere skal få tilgang til kontoen din
  • Pålitelig – du får tilgang til kontoen din når du trenger det
  • Praktisk og tilgjengelig - bruk av 2FA er oversiktlig og tar minimalt med tid
  • Billig

Vi tror at blockchain er den rette løsningen.

Bruk 2FA på blokkjeden

For brukeren ser 2FA på blokkjeden ut som å motta engangskoder via SMS. Den eneste forskjellen er leveringskanalen. Metoden for å få en 2FA-kode avhenger av hva blokkjeden tilbyr. I prosjektet vårt (informasjon er i profilen min) er dette en nettapplikasjon, Tor, iOS, Android, Linux, Windows, MacOS.

Tjenesten genererer en engangskode og sender den til messengeren på blokkjeden. Følg deretter klassikerne: brukeren skriver inn den mottatte koden i tjenestegrensesnittet og logger på.

Flytt for å sikre 2FA på blokkjeden

Artikkelen Hvordan fungerer en desentralisert messenger på blokkjeden? Jeg skrev at blockchain sikrer sikkerheten og personvernet ved meldingsoverføring. Når det gjelder sending av 2FA-koder, vil jeg fremheve:

  • Ett klikk for å opprette en konto - ingen telefoner eller e-poster.
  • Alle meldinger med 2FA-koder er kryptert End-to-End curve25519xsalsa20poly1305.
  • MITM-angrep er ekskludert - hver melding med 2FA-koden er en transaksjon på blokkjeden og er signert av Ed25519 EdDSA.
  • Meldingen med 2FA-koden havner i sin egen blokk. Sekvensen og tidsstemplingen til blokker kan ikke korrigeres, og derfor rekkefølgen på meldinger.
  • Det er ingen sentral struktur som kontrollerer "ektheten" til en melding. Dette gjøres av et distribuert system av noder basert på konsensus, og det eies av brukerne.
  • Kan ikke deaktiveres - kontoer kan ikke blokkeres og meldinger kan ikke slettes.
  • Få tilgang til 2FA-koder fra hvilken som helst enhet når som helst.
  • Bekreftelse på meldingslevering med 2FA-kode. Tjenesten som sender engangspassordet vet med sikkerhet at det er levert. Ingen "Send igjen"-knapper.

For å sammenligne med noen andre 2FA-metoder laget jeg en tabell:

Flytt for å sikre 2FA på blokkjeden

Brukeren mottar en konto i blockchain-messengeren for å motta koder på et sekund - kun en passordfrase brukes til å logge på. Derfor kan applikasjonsmetodene være forskjellige: du kan bruke én konto for å motta koder for alle tjenester, eller du kan opprette en egen konto for hver tjeneste.

Det er også en ulempe - kontoen må ha minst én transaksjon. For at brukeren skal motta en kryptert melding med en kode, må du kjenne den offentlige nøkkelen hans, og den vises i blokkjeden bare med den første transaksjonen. Slik klarte vi å komme oss ut av det: Vi ga dem muligheten til å motta gratis tokens i lommeboken. En bedre løsning er imidlertid å gi kontoen navnet en offentlig nøkkel. (Til sammenligning har vi et kontonummer U1467838112172792705 er et derivat av den offentlige nøkkelen cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. For messenger er dette mer praktisk og lesbart, men for systemet for å sende 2FA-koder er det en begrensning). Jeg tror at noen i fremtiden vil ta en slik beslutning og flytte "Bekvemmelighet og tilgjengelighet" til den grønne sonen.

Prisen for å sende en 2FA-kode er veldig lav - 0.001 ADM, nå er den 0.00001 USD. Igjen kan du heve blokkjeden din og gjøre prisen null.

Hvordan koble 2FA på blokkjeden til tjenesten din

Jeg håper jeg var i stand til å interessere noen få lesere til å legge til blokkjedeautorisasjon til tjenestene deres.

Jeg vil fortelle deg hvordan du gjør dette ved å bruke vår messenger som et eksempel, og analogt kan du bruke en annen blokkjede. I 2FA-demo-appen bruker vi postgresql10 til å lagre kontoinformasjon.

Tilkoblingsstadier:

  1. Opprett en konto på blokkjeden som du vil sende 2FA-koder fra. Du vil motta en passordfrase, som brukes som en privat nøkkel for å kryptere meldinger med koder og for å signere transaksjoner.
  2. Legg til et skript på serveren din for å generere 2FA-koder. Hvis du allerede bruker en annen 2FA-metode med engangspassordlevering, har du allerede fullført dette trinnet.
  3. Legg til et skript på serveren din for å sende koder til brukeren i blockchain-messengeren.
  4. Lag et brukergrensesnitt for å sende og legge inn en 2FA-kode. Hvis du allerede bruker en annen 2FA-metode med engangspassordlevering, har du allerede fullført dette trinnet.

1 Kontoopprettelse

Å opprette en konto i blokkjeden betyr å generere en privat nøkkel, en offentlig nøkkel og en avledet kontoadresse.

Flytt for å sikre 2FA på blokkjeden

Først genereres BIP39-passordet, og SHA-256-hashen beregnes ut fra det. Hashen brukes til å generere den private nøkkelen ks og den offentlige nøkkelen kp. Fra den offentlige nøkkelen, ved å bruke samme SHA-256 med inversjon, får vi adressen i blokkjeden.

Hvis du vil sende 2FA-koder hver gang fra en ny konto, må kontoopprettingskoden legges til serveren:

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

I demoapplikasjonen forenklet vi det - vi opprettet én konto i webapplikasjonen, og sender koder fra den. I de fleste tilfeller er dette også mer praktisk for brukeren: han vet at tjenesten sender 2FA-koder fra en spesifikk konto og kan navngi den.

Flytt for å sikre 2FA på blokkjeden

2 Generering av 2FA-koder

En 2FA-kode må genereres for hver brukerpålogging. Vi bruker biblioteket speakeasy, men du kan velge hvilken som helst annen.

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

Kontrollerer gyldigheten av 2FA-koden som er angitt av brukeren:

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

3 Sender 2FA-kode

For å sende inn en 2FA-kode kan du bruke blockchain node API, JS API-biblioteket eller konsollen. I dette eksemplet bruker vi konsollen - dette er kommandolinjegrensesnittet, et verktøy som forenkler interaksjon med blokkjeden. For å sende en melding med en 2FA-kode, må du bruke kommandoen send message konsoller.

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

En alternativ måte å sende meldinger på er å bruke metoden send i JS API-biblioteket.

4 Brukergrensesnitt

Brukeren må få muligheten til å legge inn en 2FA-kode, dette kan gjøres på forskjellige måter avhengig av applikasjonsplattformen din. I vårt eksempel er dette Vue.

Flytt for å sikre 2FA på blokkjeden

Kildekoden for blockchain to-faktor autentisering demo-applikasjonen kan sees på GitHub. Det er en lenke i Readme til en Live-demo for å prøve den ut.

Kilde: www.habr.com

Legg til en kommentar