SMS žinutės yra populiariausias dviejų veiksnių autentifikavimo (2FA) metodas. Ją naudoja bankai, elektroninės ir kriptovaliutos piniginės, pašto dėžutės ir visos paslaugos; .
Esu pasipiktinęs dėl šio scenarijaus, nes šis metodas yra nesaugus. Numerio perskirstymas iš vienos SIM kortelės į kitą prasidėjo mobiliojo ryšio eros pradžioje – taip numeris atkuriamas pametus SIM kortelę. „Skaitmeninių pinigų vagysčių specialistai“ suprato, kad galimybė „perrašyti SIM kortelę“ gali būti naudojama sukčiavimo schemose. Juk tas, kuris valdo SIM kortelę, gali valdyti kitų žmonių internetinę bankininkystę, elektronines pinigines ir net kriptovaliutą. Ir jūs galite užvaldyti kito asmens numerį papirkdami telekomunikacijų darbuotoją, naudodami apgaulę ar suklastotus dokumentus.

Buvo atskleista tūkstančiai SIM keitimo epizodų, taip vadinama sukčiavimo schema. Nelaimės mastas rodo, kad pasaulis netrukus atsisakys 2FA SMS žinutėmis. Bet tai neįvyksta – in sako, kad 2FA metodą renkasi ne vartotojai, o paslaugų savininkai.
Siūlome naudoti saugų 2FA metodą su vienkartinių kodų pristatymu per blokų grandinę, ir mes jums pasakysime, kaip paslaugos savininkas gali jį prijungti.
Skaičiavimas siekia milijonus
Londono policijos duomenimis, 2019 m. sukčiavimas su SIM keitimu išaugo 63%, o užpuoliko „vidutinė sąskaita“ buvo 4,000 GBP. Rusijoje statistikos neradau, bet manau, kad ji dar blogesnė.
SIM keitimas naudojamas norint pavogti populiarias „Twitter“, „Instagram“, „Facebook“, VK paskyras, banko sąskaitas ir neseniai net kriptovaliutas - Pasak Bitcoin verslininko Joby Weeks. Rezonansiniai atvejai, kai kriptovaliutos vagystės naudojant SIM keitimą, spaudoje pasirodo nuo 2016 m. 2019-ieji pasiekė tikrą viršūnę.
Gegužės mėnesį JAV Mičigano Rytų apygardos prokuratūra devyni jaunuoliai nuo 19 iki 26 metų: manoma, kad jie priklauso įsilaužėlių gaujai, pavadintai „Bendruomenė“. Gaujai pateikti kaltinimai dėl septynių apsikeitimo atakų, dėl kurių įsilaužėliai pavogė kriptovaliutų už daugiau nei 2,4 mln. O balandį Kalifornijos studentas Joelis Ortizas gavo 10 metų kalėjimo už SIM keitimą; jo produkcija kriptovaliutomis siekė 7.5 mln.

Joelio Ortizo nuotrauka universiteto spaudos konferencijoje. Po dvejų metų jis bus sulaikytas už kibernetinį sukčiavimą.
Kaip veikia SIM keitimas
„Sukeisti“ reiškia mainus. Visose tokiose schemose nusikaltėliai perima aukos telefono numerį, dažniausiai pakartotinai išduodami SIM kortelę, ir naudoja jį slaptažodžiui nustatyti. Įprastas SIM keitimas teoriškai atrodo taip:
- Žvalgybos tarnyba. Sukčiai išsiaiškina aukos asmeninę informaciją: vardą ir telefono numerį. Jų galima rasti atviruose šaltiniuose (socialiniuose tinkluose, draugais) arba gauti iš bendrininko – korinio ryšio operatoriaus darbuotojo.
- Blokavimas. Aukos SIM kortelė išjungta; Norėdami tai padaryti, tiesiog paskambinkite teikėjo techninei pagalbai, nurodykite numerį ir pasakykite, kad telefonas buvo pamestas.
- Užfiksuokite, perkelkite numerį į SIM kortelę. Dažniausiai tai daroma ir per bendrininką telekomunikacijų įmonėje arba klastojus dokumentus.
Realiame gyvenime viskas yra dar sunkesnė. Užpuolikai atrenka auką ir kasdien seka telefono buvimo vietą – vienas prašymas gauti informaciją, kad abonentas perėjo į tarptinklinį ryšį, kainuoja 1-2 centus. Kai tik SIM kortelės savininkas išvyksta į užsienį, komunikacijos parduotuvėje derasi su vadybininku dėl naujos SIM kortelės išdavimo. Tai kainuoja apie 50 USD (radau informacijos - skirtingose šalyse ir pas skirtingus operatorius nuo 20 iki 100 USD), o blogiausiu atveju vadovas bus atleistas - atsakomybės už tai nėra.
Dabar visas SMS gaus užpuolikai, o telefono savininkas nieko negalės padaryti – jis yra užsienyje. Tada piktadariai gauna prieigą prie visų aukos paskyrų ir, jei pageidauja, pakeičia slaptažodžius.
Tikimybė grąžinti pavogtą turtą
Kartais bankai aukas apgyvendina pusiaukelėje ir išima pervedimus iš jų sąskaitų. Todėl grąžinti fiat pinigus galima net ir nesuradus nusikaltėlio. Tačiau su kriptovaliutų piniginėmis viskas yra sudėtingiau – ir techniškai, ir teisėkūros. Iki šiol nei viena keitykla/piniginė nėra išmokėjusi kompensacijų mainų aukoms.
Jei nukentėjusieji nori apginti savo pinigus teisme, kaltina operatorių: jis sukūrė sąlygas pinigų vagystei iš sąskaitos. Kaip tik taip ir padariau , kuris dėl apsikeitimo prarado 224 mln.

Kol kas nė viena valstybė neturi veikiančių schemų, kaip teisiškai apsaugoti kriptovaliutų savininkus. Neįmanoma apdrausti savo kapitalo ar gauti kompensaciją už jo praradimą. Todėl apsikeitimo atakai užkirsti kelią yra lengviau nei susidoroti su jos pasekmėmis. Akivaizdžiausias būdas yra naudoti patikimesnį „antrąjį faktorių“ 2FA.
SIM keitimas nėra vienintelė 2FA problema SMS žinutėmis
Patvirtinimo kodai SMS žinutėmis taip pat nesaugūs techniniu požiūriu. Pranešimus galima perimti dėl nepataisytų Signaling System 7 (SS7) spragų. 2FA per SMS oficialiai pripažintas nesaugiu (taip teigia JAV nacionalinis standartų ir technologijų institutas ).
Tuo pačiu metu 2FA buvimas dažnai suteikia vartotojui klaidingo saugumo jausmą, todėl jis pasirenka paprastesnį slaptažodį. Todėl toks autentifikavimas neapsunkina, bet palengvina užpuoliko prieigą prie paskyros.
Ir dažnai SMS atkeliauja labai vėluojant arba visai neatvyksta.
Kiti 2FA metodai
Žinoma, šviesa nesusiliejo į išmaniuosius telefonus ir SMS. Yra ir kitų 2FA metodų. Pavyzdžiui, vienkartiniai TAN kodai: primityvus metodas, bet veikia – vis dar naudojamas kai kuriuose bankuose. Yra sistemų, naudojančių biometrinius duomenis: pirštų atspaudus, tinklainės nuskaitymus. Kitas variantas, kuris atrodo kaip pagrįstas kompromisas patogumo, patikimumo ir kainos atžvilgiu, yra specialios 2FA programos: RSA Token, Google Authenticator. Taip pat yra fizinių raktų ir kitų būdų.
Teoriškai viskas atrodo logiška ir patikima. Tačiau praktikoje šiuolaikiniai 2FA sprendimai turi problemų, ir dėl jų realybė skiriasi nuo lūkesčių.
Pagal , 2FA naudojimas iš principo yra nepatogumas, o 2FA populiarumas SMS žinutėmis paaiškinamas „mažiau nepatogumų lyginant su kitais būdais“ – vienkartinių kodų gavimas vartotojui suprantamas.
Vartotojai daugelį 2FA metodų sieja su baime, kad bus prarasta prieiga. Fizinis raktas arba TAN slaptažodžių sąrašas gali būti pamestas arba pavogtas. Aš asmeniškai turėjau blogos patirties naudojant „Google Authenticator“. Mano pirmasis išmanusis telefonas su šia programa sugedo – įvertinkite mano pastangas atkurti prieigą prie savo paskyrų. Kita problema yra perjungimas į naują įrenginį. „Google Authenticator“ neturi eksportavimo parinkties dėl saugumo priežasčių (jei raktus galima eksportuoti, koks yra saugumas?). Kartą raktus nešiojau rankiniu būdu, o tada nusprendžiau, kad seną išmanųjį telefoną lengviau palikti dėžėje ant lentynos.
2FA metodas turėtų būti:
- Saugu – prieigą prie jūsų paskyros turėtumėte gauti tik jūs, o ne užpuolikai
- Patikimas – jūs gaunate prieigą prie savo paskyros, kai tik to reikia
- Patogu ir prieinama – 2FA naudojimas yra aiškus ir užtrunka minimaliai
- Pigu
Manome, kad blokų grandinė yra teisingas sprendimas.
Naudokite 2FA blokų grandinėje
Vartotojui 2FA blokų grandinėje yra tas pats, kas gauti vienkartinius kodus SMS žinute. Skirtumas tik pristatymo kanale. 2FA kodo gavimo būdas priklauso nuo blokų grandinės pasiūlymo. Mūsų projekte (informacija pateikta mano profilyje) tai apima žiniatinklio programėlę, „Tor“ ir „iOS“. Android, Linux, Windows, „MacOS“.
Paslauga sugeneruoja vienkartinį kodą ir siunčia jį blokų grandinėje esančiam pasiuntiniui. Tada sekite klasiką: vartotojas įveda gautą kodą paslaugų sąsajoje ir prisijungia.

Straipsnis Rašiau, kad blokų grandinė užtikrina pranešimų perdavimo saugumą ir privatumą. Dėl 2FA kodų siuntimo pabrėšiu:
- Vienu paspaudimu sukurti paskyrą – jokių telefonų ar el.
- Visi pranešimai su 2FA kodais yra užšifruoti nuo pabaigos iki pabaigos kreivė25519xsalsa20poly1305.
- MITM ataka neįtraukta – kiekvienas pranešimas su 2FA kodu yra sandoris blokų grandinėje ir yra pasirašytas Ed25519 EdDSA.
- Pranešimas su 2FA kodu patenka į savo bloką. Negalima taisyti blokų sekos ir laiko žymos, taigi ir pranešimų tvarkos.
- Nėra jokios centrinės struktūros, kuri tikrintų pranešimo „autentiškumą“. Tai atlieka paskirstyta mazgų sistema, pagrįsta bendru sutarimu, ir ji priklauso vartotojams.
- Negalima išjungti – negalima blokuoti paskyrų ir ištrinti žinučių.
- Pasiekite 2FA kodus iš bet kurio įrenginio bet kuriuo metu.
- Pranešimo pristatymo patvirtinimas 2FA kodu. Paslauga, siunčianti vienkartinį slaptažodį, tikrai žino, kad jis buvo pristatytas. Nėra mygtukų „Siųsti dar kartą“.
Norėdami palyginti su kai kuriais kitais 2FA metodais, sudariau lentelę:

Vartotojas gauna paskyrą blockchain Messenger, kad per sekundę gautų kodus – prisijungimui naudojama tik slaptafrazė. Todėl taikymo būdai gali būti skirtingi: galite naudoti vieną paskyrą visų paslaugų kodams gauti arba kiekvienai paslaugai galite sukurti atskirą paskyrą.
Taip pat yra nepatogumų – sąskaitoje turi būti bent viena operacija. Kad vartotojas gautų užšifruotą žinutę su kodu, reikia žinoti jo viešąjį raktą, kuris blokų grandinėje pasirodo tik su pirmąja operacija. Taip mums pavyko iš jos išsikapstyti: suteikėme galimybę į piniginę gauti nemokamus žetonus. Tačiau geresnis sprendimas yra pavadinti paskyrą viešuoju raktu. (Palyginimui turime sąskaitos numerį U1467838112172792705 yra viešojo rakto darinys cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. Messenger tai yra patogiau ir lengviau skaitoma, tačiau 2FA kodų siuntimo sistemai tai yra apribojimas). Manau, kad ateityje kažkas priims tokį sprendimą ir „Patogumą ir prieinamumą“ perkels į žaliąją zoną.
2FA kodo siuntimo kaina tikrai nedidelė – 0.001 ADM, dabar – 0.00001 USD. Vėlgi, galite padidinti savo blokų grandinę ir padaryti kainą nuline.
Kaip prijungti 2FA blokų grandinėje prie jūsų paslaugos
Tikiuosi, kad man pavyko sudominti keletą skaitytojų, kad jie prie savo paslaugų pridėtų „blockchain“ autorizaciją.
Aš jums pasakysiu, kaip tai padaryti naudojant mūsų „Messenger“ kaip pavyzdį, ir pagal analogiją galite naudoti kitą „blockchain“. 2FA demonstracinėje programėlėje paskyros informacijai saugoti naudojame postgresql10.
Prijungimo etapai:
- Sukurkite paskyrą blokų grandinėje, iš kurios išsiųsite 2FA kodus. Gausite slaptafrazę, kuri naudojama kaip privatus raktas žinutėms su kodais šifruoti ir sandoriams pasirašyti.
- Pridėkite scenarijų prie savo serverio, kad sukurtumėte 2FA kodus. Jei jau naudojate bet kurį kitą 2FA metodą su vienkartiniu slaptažodžio pristatymu, šį veiksmą jau atlikote.
- Pridėkite scenarijų prie savo serverio, kad išsiųstumėte kodus „blockchain Messenger“ vartotojui.
- Sukurkite vartotojo sąsają 2FA kodui siųsti ir įvesti. Jei jau naudojate bet kurį kitą 2FA metodą su vienkartiniu slaptažodžio pristatymu, šį veiksmą jau atlikote.
1 Paskyros sukūrimas
Paskyros sukūrimas blokų grandinėje reiškia privataus rakto, viešojo rakto ir išvestinio paskyros adreso generavimą.

Pirmiausia sugeneruojama BIP39 slaptafrazė ir pagal ją apskaičiuojama SHA-256 maiša. Maiša naudojama privačiam raktui ks ir viešajam raktui kp generuoti. Iš viešojo rakto, naudodami tą patį SHA-256 su inversija, gauname adresą blokų grandinėje.
Jei norite kiekvieną kartą siųsti 2FA kodus iš naujos paskyros, paskyros sukūrimo kodą reikės pridėti prie serverio:
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()
}Demonstracinėje programoje ją supaprastinome – žiniatinklio programoje sukūrėme vieną paskyrą ir iš jos siunčiame kodus. Daugeliu atvejų taip ir patogiau vartotojui: jis žino, kad paslauga siunčia 2FA kodus iš konkrečios paskyros ir gali ją pavadinti.

2 2FA kodų generavimas
Kiekvienam vartotojo prisijungimui turi būti sugeneruotas 2FA kodas. Naudojamės biblioteka , bet galite pasirinkti bet kurį kitą.
const hotp = speakeasy.hotp({
counter,
secret: account.seSecretAscii,
});
Patikrinkite vartotojo įvesto 2FA kodo galiojimą:
se2faVerified = speakeasy.hotp.verify({
counter: this.seCounter,
secret: this.seSecretAscii,
token: hotp,
});
3 Siunčiamas 2FA kodas
Norėdami pateikti 2FA kodą, galite naudoti blokų grandinės mazgo API, JS API biblioteką arba konsolę. Šiame pavyzdyje mes naudojame konsolę - tai yra komandų eilutės sąsaja, programa, supaprastinanti sąveiką su blokų grandine. Norėdami išsiųsti pranešimą su 2FA kodu, turite naudoti komandą send message pultai.
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);
Alternatyvus būdas siųsti pranešimus yra naudoti šį metodą send JS API bibliotekoje.
4 Vartotojo sąsaja
Vartotojui turi būti suteikta galimybė įvesti 2FA kodą. Tai galima padaryti įvairiais būdais, priklausomai nuo jūsų taikomosios programos platformos. Mūsų pavyzdyje tai yra Vue.

„Blockchain“ dviejų veiksnių autentifikavimo demonstracinės programos šaltinio kodą galite peržiūrėti adresu . „Readme“ yra nuoroda į tiesioginę demonstracinę versiją, kad galėtumėte ją išbandyti.
Šaltinis: www.habr.com
