Bergerak untuk mendapatkan 2FA pada rantaian blok

Mesej SMS ialah kaedah pengesahan dua faktor (2FA) yang paling popular. Ia digunakan oleh bank, dompet elektronik dan crypto, peti mel dan semua jenis perkhidmatan; bilangan pengguna kaedah menghampiri 100%.

Saya marah dengan senario ini, kerana kaedah ini tidak selamat. Menetapkan semula nombor daripada satu kad SIM kepada yang lain bermula pada permulaan era mudah alih - ini adalah cara nombor itu dipulihkan apabila kad SIM hilang. "Pakar kecurian wang digital" menyedari bahawa pilihan "tulis semula kad SIM" boleh digunakan dalam skim penipuan. Lagipun, orang yang mengawal kad SIM boleh mengawal perbankan dalam talian, dompet elektronik, dan juga mata wang kripto orang lain. Dan anda boleh mengambil milikan nombor orang lain dengan merasuah pekerja telekomunikasi, menggunakan penipuan atau dokumen palsu.

Bergerak untuk mendapatkan 2FA pada rantaian blok

Beribu-ribu episod pertukaran SIM telah ditemui, kerana skim penipuan ini dipanggil. Skala bencana menunjukkan bahawa dunia akan segera meninggalkan 2FA melalui SMS. Tetapi ini tidak berlaku - dalam penyelidikan mereka mengatakan bahawa bukan pengguna yang memilih kaedah 2FA, tetapi pemilik perkhidmatan.

Kami mencadangkan menggunakan kaedah 2FA selamat dengan penghantaran kod sekali sahaja melalui rantaian blok, dan kami akan memberitahu anda cara pemilik perkhidmatan boleh menyambungkannya.

Jumlahnya menjadi berjuta-juta

Pada 2019, penipuan pertukaran SIM meningkat sebanyak 63% menurut polis London, dan "bil purata" penyerang ialah 4,000 GBP. Saya tidak menemui sebarang statistik di Rusia, tetapi saya menganggap bahawa ia lebih teruk.

Pertukaran SIM digunakan untuk mencuri akaun Twitter, Instagram, Facebook, VK, akaun bank, dan juga mata wang kripto yang popular - Akhbar Times melaporkan menurut usahawan Bitcoin Joby Weeks. Kes berprofil tinggi kecurian mata wang kripto menggunakan pertukaran SIM telah muncul di akhbar sejak 2016; 2019 menyaksikan kemuncak sebenar.

Pada bulan Mei, Pejabat Peguam A.S. untuk Daerah Timur Michigan membawa pertuduhan sembilan orang muda berumur antara 19 dan 26: mereka dipercayai sebahagian daripada kumpulan penggodam yang dipanggil "Komuniti". Kumpulan itu didakwa dengan tujuh serangan pertukaran, akibatnya penggodam mencuri mata wang kripto bernilai lebih $2,4 juta. Dan pada bulan April, pelajar California Joel Ortiz menerima 10 tahun penjara kerana pertukaran SIM; pengeluarannya ialah $7.5 juta dalam mata wang kripto.

Bergerak untuk mendapatkan 2FA pada rantaian blok
Foto Joel Ortiz pada sidang media universiti. Dua tahun kemudian dia akan ditahan kerana penipuan siber.

Cara pertukaran SIM berfungsi

"Pertukaran" bermaksud pertukaran. Dalam semua skim tersebut, penjenayah mengambil alih nombor telefon mangsa, biasanya melalui pengeluaran semula kad SIM, dan menggunakannya untuk menetapkan semula kata laluan. Pertukaran SIM biasa dalam teori kelihatan seperti ini:

  1. Perkhidmatan perisikan. Penipu mengetahui maklumat peribadi mangsa: nama dan nombor telefon. Mereka boleh didapati dalam sumber terbuka (rangkaian sosial, rakan) atau diterima daripada rakan sejenayah - pekerja pengendali mudah alih.
  2. Menyekat. Kad SIM mangsa dinyahaktifkan; Untuk melakukan ini, hanya hubungi sokongan teknikal pembekal, berikan nombor dan katakan bahawa telefon itu hilang.
  3. Tangkap, pindahkan nombor ke kad SIM anda. Biasanya ini juga dilakukan melalui rakan sejenayah dalam syarikat telekomunikasi atau melalui pemalsuan dokumen.

Dalam kehidupan sebenar, perkara lebih teruk. Penyerang memilih mangsa dan kemudian menjejaki lokasi telefon setiap hari - satu permintaan untuk menerima maklumat bahawa pelanggan telah beralih kepada perayauan berharga 1-2 sen. Sebaik sahaja pemilik kad SIM ke luar negara, mereka berunding dengan pengurus di kedai komunikasi untuk mengeluarkan kad SIM baharu. Ia berharga kira-kira $50 (saya menjumpai maklumat - di negara yang berbeza dan dengan operator berbeza dari $20 hingga $100), dan dalam kes paling teruk pengurus akan dipecat - tiada tanggungjawab untuk ini.

Sekarang semua SMS akan diterima oleh penyerang, dan pemilik telefon tidak akan dapat berbuat apa-apa mengenainya - dia berada di luar negara. Dan kemudian penjahat mendapat akses kepada semua akaun mangsa dan menukar kata laluan jika dikehendaki.

Peluang memulangkan harta yang dicuri

Bank kadangkala menampung mangsa separuh jalan dan mengeluarkan pindahan daripada akaun mereka. Oleh itu, adalah mungkin untuk mengembalikan wang fiat walaupun penjenayah tidak dijumpai. Tetapi dengan dompet cryptocurrency semuanya lebih rumit - dan secara teknikal, dan secara perundangan. Setakat ini, tiada satu pun pertukaran/dompet telah membayar pampasan kepada mangsa pertukaran.

Jika mangsa ingin mempertahankan wang mereka di mahkamah, mereka menyalahkan pengendali: dia mencipta syarat untuk kecurian wang dari akaun. Itulah yang saya lakukan Michael Turpin, yang kerugian $224 juta akibat pertukaran. Dia kini menyaman syarikat telekomunikasi AT&T.

Bergerak untuk mendapatkan 2FA pada rantaian blok

Setakat ini, tiada negeri mempunyai skim kerja untuk melindungi pemilik mata wang kripto secara sah. Adalah mustahil untuk menginsuranskan modal anda atau menerima pampasan atas kehilangannya. Oleh itu, mencegah serangan swap adalah lebih mudah daripada menangani akibatnya. Cara yang paling jelas ialah menggunakan "faktor kedua" yang lebih dipercayai untuk 2FA.

Pertukaran SIM bukan satu-satunya masalah dengan 2FA melalui SMS

Kod pengesahan dalam SMS juga tidak selamat dari sudut teknikal. Mesej boleh dipintas kerana kelemahan yang tidak ditambal dalam Sistem Isyarat 7 (SS7). 2FA melalui SMS secara rasmi diiktiraf sebagai tidak selamat (Institut Piawaian dan Teknologi Kebangsaan AS mengatakan ini dalam Panduan Pengesahan Digital).

Pada masa yang sama, kehadiran 2FA sering memberikan pengguna rasa keselamatan palsu, dan dia memilih kata laluan yang lebih mudah. Oleh itu, pengesahan sedemikian tidak menyukarkan, tetapi memudahkan penyerang mendapat akses kepada akaun tersebut.

Dan selalunya SMS tiba dengan kelewatan yang lama atau tidak sampai langsung.

Kaedah 2FA lain

Sudah tentu, cahaya tidak menumpu pada telefon pintar dan SMS. Terdapat kaedah lain 2FA. Sebagai contoh, kod TAN sekali: kaedah primitif, tetapi ia berfungsi - ia masih digunakan di sesetengah bank. Terdapat sistem menggunakan data biometrik: cap jari, imbasan retina. Pilihan lain yang kelihatan seperti kompromi yang munasabah dari segi kemudahan, kebolehpercayaan dan harga ialah aplikasi khas untuk 2FA: RSA Token, Google Authenticator. Terdapat juga kunci fizikal dan kaedah lain.

Secara teori, semuanya kelihatan logik dan boleh dipercayai. Tetapi dalam praktiknya, penyelesaian 2FA moden mempunyai masalah, dan kerana itu, realitinya berbeza daripada jangkaan.

Menurut penyelidikan, penggunaan 2FA adalah kesulitan pada dasarnya, dan populariti 2FA melalui SMS dijelaskan oleh "kurang kesulitan berbanding kaedah lain" - menerima kod sekali sahaja boleh difahami oleh pengguna.

Pengguna mengaitkan banyak kaedah 2FA dengan kebimbangan bahawa akses akan hilang. Kunci fizikal atau senarai kata laluan TAN boleh hilang atau dicuri. Saya secara peribadi mempunyai pengalaman buruk dengan Google Authenticator. Telefon pintar pertama saya dengan aplikasi ini rosak - hargai usaha saya dalam memulihkan akses kepada akaun saya. Masalah lain ialah beralih kepada peranti baharu. Google Authenticator tidak mempunyai pilihan eksport atas sebab keselamatan (jika kunci boleh dieksport, apakah keselamatan yang ada?). Sebaik sahaja saya membawa kunci secara manual, dan kemudian saya memutuskan bahawa lebih mudah untuk meninggalkan telefon pintar lama dalam kotak di atas rak.

Kaedah 2FA hendaklah:

  • Selamat - hanya anda dan bukan penyerang harus mendapat akses ke akaun anda
  • Boleh dipercayai - anda mendapat akses kepada akaun anda pada bila-bila masa anda memerlukannya
  • Mudah dan boleh diakses - menggunakan 2FA adalah jelas dan mengambil masa yang minimum
  • murah

Kami percaya bahawa blockchain adalah penyelesaian yang tepat.

Gunakan 2FA pada blockchain

Bagi pengguna, 2FA pada blockchain kelihatan sama seperti menerima kod sekali sahaja melalui SMS. Satu-satunya perbezaan adalah saluran penghantaran. Kaedah untuk mendapatkan kod 2FA bergantung pada apa yang ditawarkan oleh blockchain. Dalam projek kami (maklumat ada dalam profil saya) ini ialah aplikasi Web, Tor, iOS, Android, Linux, Windows, MacOS.

Perkhidmatan ini menghasilkan kod sekali sahaja dan menghantarnya kepada messenger pada blockchain. Kemudian ikuti klasik: pengguna memasukkan kod yang diterima dalam antara muka perkhidmatan dan log masuk.

Bergerak untuk mendapatkan 2FA pada rantaian blok

Dalam artikel itu Bagaimanakah utusan terdesentralisasi berfungsi pada blockchain? Saya menulis bahawa blockchain memastikan keselamatan dan privasi penghantaran mesej. Mengenai isu penghantaran kod 2FA, saya akan menyerlahkan:

  • Satu klik untuk membuat akaun - tiada telefon atau e-mel.
  • Semua mesej dengan kod 2FA disulitkan keluk Hujung ke Hujung25519xsalsa20poly1305.
  • Serangan MITM dikecualikan - setiap mesej dengan kod 2FA adalah transaksi pada rantaian blok dan ditandatangani oleh Ed25519 EdDSA.
  • Mesej dengan kod 2FA berakhir di bloknya sendiri. Urutan dan cap masa blok tidak boleh dibetulkan, dan oleh itu susunan mesej.
  • Tiada struktur pusat yang memeriksa "ketulenan" mesej. Ini dilakukan oleh sistem pengedaran nod berdasarkan konsensus, dan ia dimiliki oleh pengguna.
  • Tidak boleh dilumpuhkan - akaun tidak boleh disekat dan mesej tidak boleh dipadamkan.
  • Akses kod 2FA dari mana-mana peranti pada bila-bila masa.
  • Pengesahan penghantaran mesej dengan kod 2FA. Perkhidmatan yang menghantar kata laluan sekali sahaja mengetahui dengan pasti bahawa ia telah dihantar. Tiada butang "Hantar lagi".

Untuk membandingkan dengan beberapa kaedah 2FA lain, saya membuat jadual:

Bergerak untuk mendapatkan 2FA pada rantaian blok

Pengguna menerima akaun dalam messenger blockchain untuk menerima kod dalam satu saat - hanya frasa laluan digunakan untuk log masuk. Oleh itu, kaedah aplikasi mungkin berbeza: anda boleh menggunakan satu akaun untuk menerima kod untuk semua perkhidmatan, atau anda boleh membuat akaun berasingan untuk setiap perkhidmatan.

Terdapat juga kesulitan - akaun mesti mempunyai sekurang-kurangnya satu transaksi. Untuk membolehkan pengguna menerima mesej yang disulitkan dengan kod, anda perlu mengetahui kunci awamnya, dan ia muncul dalam blockchain hanya dengan transaksi pertama. Ini adalah cara kami berjaya keluar daripadanya: kami memberi mereka peluang untuk menerima token percuma dalam dompet mereka. Walau bagaimanapun, penyelesaian yang lebih baik ialah menamakan akaun itu sebagai kunci awam. (Sebagai perbandingan, kami mempunyai nombor akaun U1467838112172792705 ialah terbitan kunci awam cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. Untuk messenger ini lebih mudah dan boleh dibaca, tetapi untuk sistem untuk menghantar kod 2FA ia adalah had). Saya fikir pada masa hadapan seseorang akan membuat keputusan sedemikian dan memindahkan "Kemudahan dan Kebolehcapaian" ke zon hijau.

Harga penghantaran kod 2FA sangat rendah - 0.001 ADM, kini 0.00001 USD. Sekali lagi, anda boleh menaikkan blockchain anda dan menjadikan harga sifar.

Bagaimana untuk menyambungkan 2FA pada blockchain ke perkhidmatan anda

Saya harap saya dapat menarik minat beberapa pembaca untuk menambah kebenaran blockchain pada perkhidmatan mereka.

Saya akan memberitahu anda bagaimana untuk melakukan ini menggunakan messenger kami sebagai contoh, dan dengan analogi anda boleh menggunakan blockchain lain. Dalam apl demo 2FA kami menggunakan postgresql10 untuk menyimpan maklumat akaun.

Peringkat penyambungan:

  1. Cipta akaun pada blokchain dari mana anda akan menghantar kod 2FA. Anda akan menerima frasa laluan, yang digunakan sebagai kunci peribadi untuk menyulitkan mesej dengan kod dan untuk menandatangani transaksi.
  2. Tambahkan skrip pada pelayan anda untuk menjana kod 2FA. Jika anda sudah menggunakan mana-mana kaedah 2FA lain dengan penghantaran kata laluan sekali, anda telah melengkapkan langkah ini.
  3. Tambahkan skrip pada pelayan anda untuk menghantar kod kepada pengguna dalam messenger blockchain.
  4. Buat antara muka pengguna untuk menghantar dan memasukkan kod 2FA. Jika anda sudah menggunakan mana-mana kaedah 2FA lain dengan penghantaran kata laluan sekali, anda telah melengkapkan langkah ini.

1 Pembuatan akaun

Mencipta akaun dalam blockchain bermakna menjana kunci persendirian, kunci awam, dan alamat akaun terbitan.

Bergerak untuk mendapatkan 2FA pada rantaian blok

Pertama, frasa laluan BIP39 dijana dan cincang SHA-256 dikira daripadanya. Cincang digunakan untuk menjana kunci persendirian ks dan kunci awam kp. Daripada kunci awam, menggunakan SHA-256 yang sama dengan penyongsangan, kami memperoleh alamat dalam rantaian blok.

Jika anda ingin menghantar kod 2FA setiap kali daripada akaun baharu, kod penciptaan akaun perlu ditambahkan pada pelayan:

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

Dalam aplikasi demo, kami memudahkannya - kami mencipta satu akaun dalam aplikasi web, dan menghantar kod daripadanya. Dalam kebanyakan kes, ini juga lebih mudah untuk pengguna: dia tahu bahawa perkhidmatan menghantar kod 2FA daripada akaun tertentu dan boleh menamakannya.

Bergerak untuk mendapatkan 2FA pada rantaian blok

2 Menjana kod 2FA

Kod 2FA mesti dihasilkan untuk setiap log masuk pengguna. Kami menggunakan perpustakaan speakeasy, tetapi anda boleh memilih mana-mana yang lain.

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

Menyemak kesahihan kod 2FA yang dimasukkan oleh pengguna:

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

3 Menghantar kod 2FA

Untuk menyerahkan kod 2FA, anda boleh menggunakan API nod blockchain, perpustakaan API JS atau konsol. Dalam contoh ini, kami menggunakan konsol - ini ialah Antara Muka Baris Perintah, utiliti yang memudahkan interaksi dengan rantaian blok. Untuk menghantar mesej dengan kod 2FA, anda perlu menggunakan arahan send message konsol.

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

Cara alternatif untuk menghantar mesej adalah dengan menggunakan kaedah tersebut send dalam perpustakaan API JS.

4 Antara muka pengguna

Pengguna perlu diberi pilihan untuk memasukkan kod 2FA, ini boleh dilakukan dengan cara yang berbeza bergantung pada platform aplikasi anda. Dalam contoh kami ini ialah Vue.

Bergerak untuk mendapatkan 2FA pada rantaian blok

Kod sumber untuk aplikasi demo pengesahan dua faktor blok boleh dilihat di GitHub. Terdapat pautan dalam Readme kepada demo Langsung untuk mencubanya.

Sumber: www.habr.com

Tambah komen