Ilipat upang ma-secure ang 2FA sa blockchain

Ang mga mensaheng SMS ay ang pinakasikat na paraan ng two-factor authentication (2FA). Ito ay ginagamit ng mga bangko, electronic at crypto wallet, mailbox at lahat ng uri ng serbisyo; ang bilang ng mga gumagamit ng pamamaraan ay lumalapit sa 100%.

Nagagalit ako sa senaryo na ito, dahil hindi ligtas ang pamamaraang ito. Ang muling pagtatalaga ng isang numero mula sa isang SIM card patungo sa isa pa ay nagsimula sa simula ng panahon ng mobile - ito ay kung paano ibinabalik ang numero kapag nawala ang isang SIM card. Napagtanto ng "mga espesyalista sa pagnanakaw ng digital na pera" na ang opsyon na "rewrite SIM card" ay maaaring gamitin sa mga mapanlinlang na pamamaraan. Pagkatapos ng lahat, ang kumokontrol sa SIM card ay maaaring kontrolin ang online banking, electronic wallet, at kahit cryptocurrency ng ibang tao. At maaari mong kunin ang numero ng ibang tao sa pamamagitan ng panunuhol sa isang empleyado ng telecom, gamit ang panlilinlang o pekeng mga dokumento.

Ilipat upang ma-secure ang 2FA sa blockchain

Libu-libong mga yugto ng pagpapalit ng SIM ang natuklasan, kung tawagin ang pamamaraang ito ng pandaraya. Ang laki ng sakuna ay nagmumungkahi na malapit nang iwanan ng mundo ang 2FA sa pamamagitan ng SMS. Ngunit hindi ito nangyayari - sa pananaliksik sinasabi nila na hindi mga gumagamit ang pumili ng paraan ng 2FA, ngunit ang mga may-ari ng serbisyo.

Iminumungkahi namin ang paggamit ng ligtas na paraan ng 2FA na may paghahatid ng isang beses na mga code sa pamamagitan ng blockchain, at sasabihin namin sa iyo kung paano ito maikokonekta ng may-ari ng serbisyo.

Ang bilang ay umaabot sa milyon-milyon

Noong 2019, tumaas ng 63% ang pandaraya sa SIM swap ayon sa London police, at ang β€œaverage bill” ng isang attacker ay 4,000 GBP. Wala akong nahanap na anumang istatistika sa Russia, ngunit ipinapalagay ko na mas masahol pa ang mga ito.

Ginagamit ang pagpapalit ng SIM upang magnakaw ng mga sikat na Twitter, Instagram, Facebook, VK account, bank account, at kamakailan kahit na mga cryptocurrencies - Ang pahayagan ng Times ay nag-uulat ayon sa Bitcoin entrepreneur Joby Weeks. Ang mga high-profile na kaso ng pagnanakaw ng cryptocurrency gamit ang SIM swapping ay lumalabas sa press mula noong 2016; Ang 2019 ay nakakita ng isang tunay na rurok.

Noong Mayo, ang U.S. Attorney's Office para sa Eastern District ng Michigan nagdala ng mga singil siyam na kabataan sa pagitan ng edad na 19 at 26: pinaniniwalaang bahagi sila ng isang hacker gang na tinatawag na "The Community". Ang gang ay sinisingil ng pitong swap attack, bilang resulta kung saan ang mga hacker ay nagnakaw ng cryptocurrency na nagkakahalaga ng higit sa $2,4 milyon. At noong Abril, ang estudyante ng California na si Joel Ortiz ay nakatanggap ng 10 taon sa bilangguan para sa pagpapalit ng SIM; ang kanyang produksyon ay $7.5 milyon sa mga cryptocurrencies.

Ilipat upang ma-secure ang 2FA sa blockchain
Larawan ni Joel Ortiz sa isang press conference sa unibersidad. Makalipas ang dalawang taon, ikukulong siya para sa cyber fraud.

Paano gumagana ang SIM swap

Ang ibig sabihin ng "pagpapalit" ay palitan. Sa lahat ng gayong pamamaraan, kinukuha ng mga kriminal ang numero ng telepono ng biktima, kadalasan sa pamamagitan ng muling pag-isyu ng SIM card, at ginagamit ito upang i-reset ang password. Ang isang tipikal na SIM swap sa teorya ay ganito ang hitsura:

  1. Serbisyo ng katalinuhan. Malalaman ng mga manloloko ang personal na impormasyon ng biktima: pangalan at numero ng telepono. Maaari silang matagpuan sa mga bukas na mapagkukunan (mga social network, mga kaibigan) o natanggap mula sa isang kasabwat - isang empleyado ng isang mobile operator.
  2. Hinaharang. Na-deactivate ang SIM card ng biktima; Upang gawin ito, tawagan lamang ang teknikal na suporta ng provider, ibigay ang numero at sabihin na nawala ang telepono.
  3. Kunin, ilipat ang numero sa iyong SIM card. Kadalasan ito ay ginagawa din sa pamamagitan ng isang kasabwat sa kumpanya ng telecom o sa pamamagitan ng pamemeke ng mga dokumento.

Sa totoong buhay, mas malala ang mga bagay. Pumili ang mga attacker ng biktima at pagkatapos ay sinusubaybayan ang lokasyon ng telepono araw-araw - ang isang kahilingan para makatanggap ng impormasyon na ang subscriber ay lumipat sa roaming ay nagkakahalaga ng 1-2 cents. Sa sandaling makapunta sa ibang bansa ang may-ari ng SIM card, nakipag-ayos sila sa manager sa tindahan ng komunikasyon upang mag-isyu ng bagong SIM card. Nagkakahalaga ito ng humigit-kumulang $50 (Nakahanap ako ng impormasyon - sa iba't ibang bansa at may iba't ibang mga operator mula $20 hanggang $100), at sa pinakamasamang kaso ang manager ay tatanggalin sa trabaho - walang pananagutan para dito.

Ngayon ang lahat ng SMS ay matatanggap ng mga umaatake, at ang may-ari ng telepono ay walang magagawa tungkol dito - siya ay nasa ibang bansa. At pagkatapos ang mga kontrabida ay nakakakuha ng access sa lahat ng mga account ng biktima at nagbabago ng mga password kung ninanais.

Mga pagkakataong maibalik ang ninakaw na ari-arian

Kung minsan, tinatanggap ng mga bangko ang mga biktima sa kalagitnaan at nag-withdraw ng mga paglilipat mula sa kanilang mga account. Samakatuwid, posible na ibalik ang fiat money kahit na hindi natagpuan ang kriminal. Ngunit sa mga wallet ng cryptocurrency ang lahat ay mas kumplikado - at teknikal, at pambatasan. Sa ngayon, wala ni isang exchange/wallet ang nagbabayad ng kabayaran sa mga biktima ng swapping.

Kung gusto ng mga biktima na ipagtanggol ang kanilang pera sa korte, sinisisi nila ang operator: nilikha niya ang mga kondisyon para sa pagnanakaw ng pera mula sa account. Ganyan talaga ang ginawa ko Michael Turpin, na nawalan ng $224 milyon dahil sa pagpapalit. Kinakasuhan na niya ngayon ang kumpanya ng telekomunikasyon na AT&T.

Ilipat upang ma-secure ang 2FA sa blockchain

Sa ngayon, walang estado ang may gumaganang mga scheme para legal na protektahan ang mga may-ari ng cryptocurrency. Imposibleng masiguro ang iyong kapital o makatanggap ng kabayaran para sa pagkawala nito. Samakatuwid, ang pagpigil sa isang swap attack ay mas madali kaysa sa pagharap sa mga kahihinatnan nito. Ang pinaka-halatang paraan ay ang paggamit ng mas maaasahang "pangalawang salik" para sa 2FA.

Ang pagpapalit ng SIM ay hindi lamang ang problema sa 2FA sa pamamagitan ng SMS

Ang mga code ng kumpirmasyon sa SMS ay hindi rin ligtas mula sa teknikal na pananaw. Maaaring ma-intercept ang mga mensahe dahil sa hindi na-patch na mga kahinaan sa Signaling System 7 (SS7). Ang 2FA sa SMS ay opisyal na kinikilala bilang hindi secure (sinasabi ito ng US National Institute of Standards and Technology sa Gabay sa Digital Authentication).

Kasabay nito, ang pagkakaroon ng 2FA ay madalas na nagbibigay sa gumagamit ng isang pakiramdam ng maling seguridad, at pinipili niya ang isang mas simpleng password. Samakatuwid, ang naturang pagpapatunay ay hindi nagpapahirap, ngunit ginagawang mas madali para sa isang umaatake na makakuha ng access sa account.

At kadalasan ang SMS ay dumarating nang may mahabang pagkaantala o hindi talaga dumarating.

Iba pang mga pamamaraan ng 2FA

Siyempre, ang ilaw ay hindi nagtatagpo sa mga smartphone at SMS. Mayroong iba pang mga pamamaraan ng 2FA. Halimbawa, isang beses na TAN code: isang primitive na paraan, ngunit ito ay gumagana - ito ay ginagamit pa rin sa ilang mga bangko. May mga system na gumagamit ng biometric data: fingerprints, retinal scans. Ang isa pang opsyon na tila isang makatwirang kompromiso sa mga tuntunin ng kaginhawahan, pagiging maaasahan at presyo ay mga espesyal na aplikasyon para sa 2FA: RSA Token, Google Authenticator. Mayroon ding mga pisikal na susi at iba pang mga pamamaraan.

Sa teorya, ang lahat ay mukhang lohikal at maaasahan. Ngunit sa pagsasagawa, ang mga modernong solusyon sa 2FA ay may mga problema, at dahil sa kanila, ang katotohanan ay naiiba sa mga inaasahan.

Ayon sa pagsaliksik, ang paggamit ng 2FA ay isang abala sa prinsipyo, at ang katanyagan ng 2FA sa pamamagitan ng SMS ay ipinaliwanag sa pamamagitan ng "mas kaunting abala kumpara sa iba pang mga pamamaraan" - ang pagtanggap ng isang beses na mga code ay naiintindihan ng gumagamit.

Iniuugnay ng mga user ang maraming pamamaraan ng 2FA sa takot na mawawala ang access. Ang pisikal na key o listahan ng mga password ng TAN ay maaaring mawala o manakaw. Ako mismo ay nagkaroon ng hindi magandang karanasan sa Google Authenticator. Ang aking unang smartphone na may application na ito ay nasira - pinahahalagahan ang aking mga pagsisikap sa pagpapanumbalik ng access sa aking mga account. Ang isa pang problema ay ang paglipat sa isang bagong device. Walang opsyon sa pag-export ang Google Authenticator dahil sa mga kadahilanang panseguridad (kung maaaring i-export ang mga key, anong seguridad ang mayroon?). Sa sandaling dinala ko nang manu-mano ang mga susi, at pagkatapos ay nagpasya akong mas madaling iwanan ang lumang smartphone sa isang kahon sa isang istante.

Ang paraan ng 2FA ay dapat na:

  • Secure - ikaw lang at hindi ang mga attacker ang dapat magkaroon ng access sa iyong account
  • Maaasahan - makakakuha ka ng access sa iyong account sa tuwing kailangan mo ito
  • Maginhawa at naa-access - ang paggamit ng 2FA ay malinaw at tumatagal ng kaunting oras
  • mura

Naniniwala kami na ang blockchain ang tamang solusyon.

Gumamit ng 2FA sa blockchain

Para sa gumagamit, ang 2FA sa blockchain ay mukhang katulad ng pagtanggap ng isang beses na mga code sa pamamagitan ng SMS. Ang pinagkaiba lang ay ang delivery channel. Ang paraan para sa pagkuha ng 2FA code ay depende sa kung ano ang inaalok ng blockchain. Sa aming proyekto (ang impormasyon ay nasa aking profile) ito ay isang Web application, Tor, iOS, Android, Linux, Windows, MacOS.

Ang serbisyo ay bumubuo ng isang beses na code at ipinapadala ito sa messenger sa blockchain. Pagkatapos ay sundin ang mga klasiko: ipinasok ng user ang natanggap na code sa interface ng serbisyo at nag-log in.

Ilipat upang ma-secure ang 2FA sa blockchain

Sa artikulo Paano gumagana ang isang desentralisadong messenger sa blockchain? Isinulat ko na tinitiyak ng blockchain ang seguridad at privacy ng pagpapadala ng mensahe. Sa isyu ng pagpapadala ng mga 2FA code, i-highlight ko ang:

  • Isang pag-click upang lumikha ng isang account - walang mga telepono o email.
  • Ang lahat ng mensahe na may 2FA code ay naka-encrypt na End-to-End curve25519xsalsa20poly1305.
  • Ang pag-atake ng MITM ay hindi kasama - bawat mensahe na may 2FA code ay isang transaksyon sa blockchain at nilagdaan ng Ed25519 EdDSA.
  • Ang mensahe na may 2FA code ay napupunta sa sarili nitong bloke. Ang pagkakasunud-sunod at timestamp ng mga bloke ay hindi maaaring itama, at samakatuwid ay ang pagkakasunud-sunod ng mga mensahe.
  • Walang sentral na istraktura na nagsusuri sa "authenticity" ng isang mensahe. Ginagawa ito ng isang distributed system ng mga node batay sa consensus, at ito ay pag-aari ng mga user.
  • Hindi maaaring hindi paganahin - hindi ma-block ang mga account at hindi matatanggal ang mga mensahe.
  • I-access ang mga 2FA code mula sa anumang device anumang oras.
  • Kumpirmasyon ng paghahatid ng mensahe gamit ang 2FA code. Ang serbisyong nagpapadala ng isang beses na password ay siguradong alam na ito ay naihatid na. Walang mga pindutang "Ipadala muli".

Upang ihambing sa ilang iba pang mga pamamaraan ng 2FA, gumawa ako ng isang talahanayan:

Ilipat upang ma-secure ang 2FA sa blockchain

Ang gumagamit ay tumatanggap ng isang account sa blockchain messenger upang makatanggap ng mga code sa isang segundo - isang passphrase lamang ang ginagamit upang mag-log in. Samakatuwid, ang mga paraan ng aplikasyon ay maaaring iba: maaari kang gumamit ng isang account upang makatanggap ng mga code para sa lahat ng mga serbisyo, o maaari kang lumikha ng isang hiwalay na account para sa bawat serbisyo.

Mayroon ding abala - ang account ay dapat magkaroon ng kahit isang transaksyon. Upang ang user ay makatanggap ng isang naka-encrypt na mensahe na may code, kailangan mong malaman ang kanyang pampublikong susi, at ito ay lilitaw sa blockchain lamang sa unang transaksyon. Ito ay kung paano namin nagawang makawala dito: binigyan namin sila ng pagkakataong makatanggap ng mga libreng token sa kanilang wallet. Gayunpaman, ang isang mas mahusay na solusyon ay ang pangalanan ang account bilang isang pampublikong susi. (Para sa paghahambing, mayroon kaming numero ng account U1467838112172792705 ay isang derivative ng public key cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. Para sa messenger ito ay mas maginhawa at nababasa, ngunit para sa system para sa pagpapadala ng 2FA code ito ay isang limitasyon). Sa tingin ko, sa hinaharap, may isang taong gagawa ng ganoong desisyon at ilipat ang "Kaginhawahan at Pagiging Accessibility" sa berdeng sona.

Ang presyo ng pagpapadala ng 2FA code ay talagang mababa - 0.001 ADM, ngayon ito ay 0.00001 USD. Muli, maaari mong itaas ang iyong blockchain at gawing zero ang presyo.

Paano ikonekta ang 2FA sa blockchain sa iyong serbisyo

Umaasa ako na nagawa kong maakit ang ilang mga mambabasa na magdagdag ng awtorisasyon ng blockchain sa kanilang mga serbisyo.

Sasabihin ko sa iyo kung paano gawin ito gamit ang aming messenger bilang isang halimbawa, at sa pamamagitan ng pagkakatulad maaari kang gumamit ng isa pang blockchain. Sa 2FA demo app ginagamit namin ang postgresql10 upang mag-imbak ng impormasyon ng account.

Mga yugto ng koneksyon:

  1. Gumawa ng account sa blockchain kung saan magpapadala ka ng 2FA codes. Makakatanggap ka ng passphrase, na ginagamit bilang pribadong key para i-encrypt ang mga mensahe gamit ang mga code at para mag-sign ng mga transaksyon.
  2. Magdagdag ng script sa iyong server para bumuo ng 2FA code. Kung gumagamit ka na ng anumang iba pang paraan ng 2FA na may isang beses na paghahatid ng password, nakumpleto mo na ang hakbang na ito.
  3. Magdagdag ng script sa iyong server para magpadala ng mga code sa user sa messenger ng blockchain.
  4. Gumawa ng user interface para sa pagpapadala at pagpasok ng 2FA code. Kung gumagamit ka na ng anumang iba pang paraan ng 2FA na may isang beses na paghahatid ng password, nakumpleto mo na ang hakbang na ito.

1 Paggawa ng account

Ang paglikha ng isang account sa blockchain ay nangangahulugan ng pagbuo ng isang pribadong key, isang pampublikong susi, at isang nagmula na address ng account.

Ilipat upang ma-secure ang 2FA sa blockchain

Una, ang BIP39 passphrase ay nabuo, at ang SHA-256 hash ay kinakalkula mula dito. Ginagamit ang hash para buuin ang private key ks at public key kp. Mula sa pampublikong key, gamit ang parehong SHA-256 na may inversion, nakuha namin ang address sa blockchain.

Kung gusto mong magpadala ng 2FA code sa bawat oras mula sa isang bagong account, ang code sa paggawa ng account ay kailangang idagdag sa 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()
}

Sa demo application, pinasimple namin ito - gumawa kami ng isang account sa web application, at nagpadala ng mga code mula dito. Sa karamihan ng mga kaso, ito ay mas maginhawa para sa gumagamit: alam niya na ang serbisyo ay nagpapadala ng mga 2FA code mula sa isang partikular na account at maaaring pangalanan ito.

Ilipat upang ma-secure ang 2FA sa blockchain

2 Pagbuo ng 2FA code

Dapat na bumuo ng 2FA code para sa bawat login ng user. Ginagamit namin ang library speakeasy, ngunit maaari kang pumili ng isa pa.

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

Sinusuri ang bisa ng 2FA code na ipinasok ng user:

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

3 Pagpapadala ng 2FA code

Para magsumite ng 2FA code, maaari mong gamitin ang blockchain node API, JS API library, o ang console. Sa halimbawang ito, ginagamit namin ang console - ito ang Command Line Interface, isang utility na pinapasimple ang pakikipag-ugnayan sa blockchain. Upang magpadala ng mensahe na may 2FA code, kailangan mong gamitin ang command send message mga 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);

Ang isang alternatibong paraan upang magpadala ng mga mensahe ay ang paggamit ng pamamaraan send sa library ng JS API.

4 User interface

Ang user ay kailangang bigyan ng opsyon na magpasok ng 2FA code, ito ay maaaring gawin sa iba't ibang paraan depende sa iyong application platform. Sa aming halimbawa ito ay Vue.

Ilipat upang ma-secure ang 2FA sa blockchain

Ang source code para sa blockchain two-factor authentication demo application ay maaaring matingnan sa GitHub. Mayroong isang link sa Readme sa isang Live na demo upang subukan ito.

Pinagmulan: www.habr.com

Magdagdag ng komento