Pindah untuk mengamankan 2FA di blockchain

Pesan SMS adalah metode otentikasi dua faktor (2FA) yang paling populer. Ini digunakan oleh bank, dompet elektronik dan kripto, kotak surat dan semua jenis layanan; jumlah pengguna metode mendekati 100%.

Saya marah dengan skenario ini, karena metode ini tidak aman. Menugaskan ulang nomor dari satu kartu SIM ke kartu SIM lainnya dimulai pada awal era seluler - ini adalah cara nomor tersebut dipulihkan ketika kartu SIM hilang. “Spesialis pencurian uang digital” menyadari bahwa opsi “tulis ulang kartu SIM” dapat digunakan dalam skema penipuan. Lagi pula, orang yang mengontrol kartu SIM dapat mengontrol perbankan online, dompet elektronik, dan bahkan mata uang kripto orang lain. Dan Anda dapat mengambil alih nomor orang lain dengan menyuap pegawai telekomunikasi, menggunakan penipuan atau dokumen palsu.

Pindah untuk mengamankan 2FA di blockchain

Ribuan episode pertukaran SIM telah terungkap, demikian sebutan skema penipuan ini. Besarnya skala bencana menunjukkan bahwa dunia akan segera meninggalkan 2FA melalui SMS. Tapi ini tidak terjadi - masuk penelitian mereka mengatakan bahwa bukan pengguna yang memilih metode 2FA, tetapi pemilik layanan.

Kami mengusulkan penggunaan metode 2FA yang aman dengan pengiriman kode satu kali melalui blockchain, dan kami akan memberi tahu Anda bagaimana pemilik layanan dapat menghubungkannya.

Jumlahnya mencapai jutaan

Pada tahun 2019, penipuan pertukaran SIM meningkat sebesar 63% menurut polisi London, dan “tagihan rata-rata” penyerang adalah 4,000 GBP. Saya belum menemukan statistik apa pun di Rusia, tapi menurut saya statistiknya lebih buruk lagi.

Pertukaran SIM digunakan untuk mencuri akun Twitter, Instagram, Facebook, VK, rekening bank, dan bahkan mata uang kripto yang populer - Surat kabar The Times melaporkan menurut pengusaha Bitcoin Joby Weeks. Kasus pencurian mata uang kripto yang terkenal menggunakan pertukaran SIM telah bermunculan di media sejak tahun 2016; Tahun 2019 merupakan tahun puncak yang nyata.

Pada bulan Mei, Kantor Kejaksaan AS untuk Distrik Timur Michigan membawa tuduhan sembilan anak muda berusia antara 19 dan 26 tahun: mereka diyakini menjadi bagian dari geng peretas yang disebut “Komunitas”. Geng tersebut didakwa dengan tujuh serangan swap, yang mengakibatkan para peretas mencuri mata uang kripto senilai lebih dari $2,4 juta. Dan pada bulan April, mahasiswa California Joel Ortiz menerima hukuman 10 tahun penjara karena pertukaran SIM; produksinya adalah $7.5 juta dalam mata uang kripto.

Pindah untuk mengamankan 2FA di blockchain
Foto Joel Ortiz pada konferensi pers universitas. Dua tahun kemudian dia akan ditahan karena penipuan dunia maya.

Cara kerja pertukaran SIM

"Bertukar" berarti pertukaran. Dalam semua skema tersebut, penjahat mengambil alih nomor telepon korban, biasanya melalui penerbitan ulang kartu SIM, dan menggunakannya untuk mereset kata sandi. Secara teori, pertukaran SIM tipikal terlihat seperti ini:

  1. Badan intelijen. Penipu mengetahui informasi pribadi korban: nama dan nomor telepon. Mereka dapat ditemukan di sumber terbuka (jejaring sosial, teman) atau diterima dari kaki tangan - karyawan operator seluler.
  2. Pemblokiran. Kartu SIM korban dinonaktifkan; Untuk melakukan ini, cukup hubungi dukungan teknis penyedia, berikan nomornya dan katakan bahwa teleponnya hilang.
  3. Tangkap, transfer nomor ke kartu SIM Anda. Biasanya hal ini juga dilakukan melalui kaki tangan di perusahaan telekomunikasi atau melalui pemalsuan dokumen.

Dalam kehidupan nyata, keadaannya bahkan lebih parah. Penyerang memilih korban dan kemudian melacak lokasi telepon setiap hari - satu permintaan untuk menerima informasi bahwa pelanggan telah beralih ke roaming dikenakan biaya 1-2 sen. Begitu pemilik kartu SIM pergi ke luar negeri, mereka bernegosiasi dengan pengelola toko komunikasi untuk mengeluarkan kartu SIM baru. Biayanya sekitar $50 (saya menemukan informasi - di berbagai negara dan dengan operator berbeda dari $20 hingga $100), dan dalam kasus terburuk manajer akan dipecat - tidak ada tanggung jawab untuk ini.

Sekarang semua SMS akan diterima oleh penyerang, dan pemilik ponsel tidak akan dapat berbuat apa-apa - dia berada di luar negeri. Dan kemudian penjahat mendapatkan akses ke semua akun korban dan mengubah kata sandi jika diinginkan.

Peluang mengembalikan properti yang dicuri

Bank terkadang mengakomodasi korban di tengah jalan dan menarik transfer dari rekening mereka. Oleh karena itu, uang fiat dapat dikembalikan meskipun pelakunya tidak ditemukan. Tetapi dengan dompet cryptocurrency, segalanya menjadi lebih rumit - dan secara teknis, dan secara legislatif. Sejauh ini, belum ada satu pun bursa/dompet yang memberikan kompensasi kepada korban swap.

Jika korban ingin mempertahankan uangnya di pengadilan, mereka menyalahkan operator: dia menciptakan kondisi untuk pencurian uang dari rekening. Itulah tepatnya yang saya lakukan Michael Turpin, yang kehilangan $224 juta karena pertukaran. Dia sekarang menggugat perusahaan telekomunikasi AT&T.

Pindah untuk mengamankan 2FA di blockchain

Sejauh ini, tidak ada negara bagian yang memiliki skema untuk melindungi pemilik mata uang kripto secara hukum. Tidak mungkin mengasuransikan modal Anda atau menerima kompensasi atas kerugiannya. Oleh karena itu, mencegah serangan swap lebih mudah daripada mengatasi konsekuensinya. Cara yang paling jelas adalah dengan menggunakan "faktor kedua" yang lebih andal untuk 2FA.

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

Kode konfirmasi dalam SMS juga tidak aman dari segi teknis. Pesan dapat disadap karena kerentanan yang belum ditambal di Signaling System 7 (SS7). 2FA melalui SMS secara resmi diakui sebagai tidak aman (Institut Standar dan Teknologi Nasional AS menyatakan hal ini dalam laporannya Panduan Otentikasi Digital).

Pada saat yang sama, kehadiran 2FA sering kali memberikan rasa aman palsu kepada pengguna, dan ia memilih kata sandi yang lebih sederhana. Oleh karena itu, otentikasi seperti itu tidak mempersulit, tetapi memudahkan penyerang untuk mendapatkan akses ke akun tersebut.

Dan seringkali SMS datang dengan penundaan yang lama atau tidak sampai sama sekali.

Metode 2FA lainnya

Tentu saja, cahayanya tidak menyatu pada smartphone dan SMS. Ada metode 2FA lainnya. Misalnya, kode TAN satu kali: metode primitif, tetapi berhasil - masih digunakan di beberapa bank. Ada sistem yang menggunakan data biometrik: sidik jari, pemindaian retina. Opsi lain yang tampaknya merupakan kompromi yang masuk akal dalam hal kenyamanan, keandalan, dan harga adalah aplikasi khusus untuk 2FA: RSA Token, Google Authenticator. Ada juga kunci fisik dan metode lainnya.

Secara teori, semuanya terlihat logis dan dapat diandalkan. Namun dalam praktiknya, solusi 2FA modern mempunyai masalah, dan karenanya, kenyataan berbeda dari harapan.

Menurut penelitian, penggunaan 2FA pada prinsipnya merupakan ketidaknyamanan, dan popularitas 2FA melalui SMS dijelaskan oleh “lebih sedikit ketidaknyamanan dibandingkan metode lain” - menerima kode satu kali dapat dimengerti oleh pengguna.

Pengguna mengasosiasikan banyak metode 2FA dengan ketakutan bahwa akses akan hilang. Kunci fisik atau daftar kata sandi TAN dapat hilang atau dicuri. Saya pribadi punya pengalaman buruk dengan Google Authenticator. Ponsel cerdas pertama saya dengan aplikasi ini rusak - hargai upaya saya memulihkan akses ke akun saya. Masalah lainnya adalah beralih ke perangkat baru. Google Authenticator tidak memiliki opsi ekspor karena alasan keamanan (jika kunci dapat diekspor, keamanan apa yang ada?). Suatu ketika saya membawa kuncinya secara manual, dan kemudian saya memutuskan bahwa lebih mudah meninggalkan smartphone lama di dalam kotak di rak.

Metode 2FA seharusnya:

  • Aman - hanya Anda dan bukan penyerang yang boleh mengakses akun Anda
  • Andal - Anda mendapatkan akses ke akun Anda kapan pun Anda membutuhkannya
  • Nyaman dan mudah diakses - penggunaan 2FA jelas dan membutuhkan waktu minimal
  • Murah

Kami percaya bahwa blockchain adalah solusi yang tepat.

Gunakan 2FA di blockchain

Bagi pengguna, 2FA di blockchain terlihat sama seperti menerima kode satu kali melalui SMS. Satu-satunya perbedaan adalah saluran pengirimannya. Metode untuk mendapatkan kode 2FA bergantung pada apa yang ditawarkan blockchain. Dalam proyek kami (informasi ada di profil saya) ini adalah aplikasi Web, Tor, iOS, Android, Linux, Windows, MacOS.

Layanan ini menghasilkan kode satu kali dan mengirimkannya ke messenger di blockchain. Kemudian ikuti cara klasik: pengguna memasukkan kode yang diterima di antarmuka layanan dan masuk.

Pindah untuk mengamankan 2FA di blockchain

Artikel Bagaimana cara kerja utusan terdesentralisasi di blockchain? Saya menulis bahwa blockchain menjamin keamanan dan privasi transmisi pesan. Mengenai masalah pengiriman kode 2FA, saya akan menyoroti:

  • Satu klik untuk membuat akun - tanpa telepon atau email.
  • Semua pesan dengan kode 2FA dienkripsi kurva End-to-End25519xsalsa20poly1305.
  • Serangan MITM tidak termasuk - setiap pesan dengan kode 2FA adalah transaksi di blockchain dan ditandatangani oleh Ed25519 EdDSA.
  • Pesan dengan kode 2FA berakhir di bloknya sendiri. Urutan dan stempel waktu blok tidak dapat diperbaiki, begitu pula urutan pesannya.
  • Tidak ada struktur pusat yang memeriksa “keaslian” suatu pesan. Hal ini dilakukan oleh sistem node terdistribusi berdasarkan konsensus, dan dimiliki oleh pengguna.
  • Tidak dapat dinonaktifkan - akun tidak dapat diblokir dan pesan tidak dapat dihapus.
  • Akses kode 2FA dari perangkat apa pun kapan saja.
  • Konfirmasi pengiriman pesan dengan kode 2FA. Layanan yang mengirimkan kata sandi satu kali mengetahui dengan pasti bahwa kata sandi tersebut telah dikirimkan. Tidak ada tombol “Kirim lagi”.

Untuk membandingkan dengan beberapa metode 2FA lainnya, saya membuat tabel:

Pindah untuk mengamankan 2FA di blockchain

Pengguna menerima akun di blockchain messenger untuk menerima kode dalam hitungan detik - hanya frasa sandi yang digunakan untuk masuk. Oleh karena itu, metode penerapannya mungkin berbeda: Anda dapat menggunakan satu akun untuk menerima kode untuk semua layanan, atau Anda dapat membuat akun terpisah untuk setiap layanan.

Ada juga ketidaknyamanan - akun tersebut harus memiliki setidaknya satu transaksi. Agar pengguna dapat menerima pesan terenkripsi dengan kode, Anda perlu mengetahui kunci publiknya, dan kunci tersebut hanya muncul di blockchain pada transaksi pertama. Beginilah cara kami keluar dari situasi ini: kami memberi mereka kesempatan untuk menerima token gratis di dompet mereka. Namun, solusi yang lebih baik adalah memberi nama akun tersebut sebagai kunci publik. (Sebagai perbandingan, kami memiliki nomor rekening U1467838112172792705 merupakan turunan dari kunci publik cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. Untuk messenger ini lebih nyaman dan mudah dibaca, tetapi untuk sistem pengiriman kode 2FA ini adalah batasannya). Saya pikir di masa depan seseorang akan membuat keputusan seperti itu dan memindahkan “Kenyamanan dan Aksesibilitas” ke zona hijau.

Harga pengiriman kode 2FA sangat murah - 0.001 ADM, sekarang menjadi 0.00001 USD. Sekali lagi, Anda dapat meningkatkan blockchain Anda dan menjadikan harganya nol.

Bagaimana menghubungkan 2FA di blockchain ke layanan Anda

Saya harap saya dapat menarik minat beberapa pembaca untuk menambahkan otorisasi blockchain ke layanan mereka.

Saya akan memberi tahu Anda cara melakukan ini menggunakan messenger kami sebagai contoh, dan dengan analogi Anda dapat menggunakan blockchain lain. Di aplikasi demo 2FA kami menggunakan postgresql10 untuk menyimpan informasi akun.

Tahap koneksi:

  1. Buat akun di blockchain tempat Anda akan mengirimkan kode 2FA. Anda akan menerima frasa sandi, yang digunakan sebagai kunci pribadi untuk mengenkripsi pesan dengan kode dan untuk menandatangani transaksi.
  2. Tambahkan skrip ke server Anda untuk menghasilkan kode 2FA. Jika Anda sudah menggunakan metode 2FA lainnya dengan pengiriman kata sandi satu kali, Anda telah menyelesaikan langkah ini.
  3. Tambahkan skrip ke server Anda untuk mengirim kode ke pengguna di blockchain messenger.
  4. Buat antarmuka pengguna untuk mengirim dan memasukkan kode 2FA. Jika Anda sudah menggunakan metode 2FA lainnya dengan pengiriman kata sandi satu kali, Anda telah menyelesaikan langkah ini.

1 Pembuatan akun

Membuat akun di blockchain berarti menghasilkan kunci pribadi, kunci publik, dan alamat akun turunan.

Pindah untuk mengamankan 2FA di blockchain

Pertama, frasa sandi BIP39 dibuat, dan hash SHA-256 dihitung darinya. Hash digunakan untuk menghasilkan kunci privat ks dan kunci publik kp. Dari kunci publik, menggunakan SHA-256 yang sama dengan inversi, kami memperoleh alamat di blockchain.

Jika Anda ingin mengirim kode 2FA setiap kali dari akun baru, kode pembuatan akun perlu ditambahkan ke 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()
}

Dalam aplikasi demo, kami menyederhanakannya - kami membuat satu akun di aplikasi web, dan mengirimkan kode darinya. Dalam kebanyakan kasus, ini juga lebih nyaman bagi pengguna: dia mengetahui bahwa layanan mengirimkan kode 2FA dari akun tertentu dan dapat menamainya.

Pindah untuk mengamankan 2FA di blockchain

2 Generasi kode 2FA

Kode 2FA harus dibuat untuk setiap login pengguna. Kami menggunakan perpustakaan speakeasy, namun Anda dapat memilih yang lain.

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

Memeriksa keabsahan kode 2FA yang dimasukkan pengguna:

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

3 Mengirim kode 2FA

Untuk mengirimkan kode 2FA, Anda dapat menggunakan API node blockchain, perpustakaan JS API, atau konsol. Dalam contoh ini, kami menggunakan konsol - ini adalah Command Line Interface, sebuah utilitas yang menyederhanakan interaksi dengan blockchain. Untuk mengirim pesan dengan kode 2FA, Anda perlu menggunakan perintah 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 mengirim pesan adalah dengan menggunakan metode ini send di perpustakaan JS API.

4 Antarmuka pengguna

Pengguna perlu diberikan opsi untuk memasukkan kode 2FA, ini dapat dilakukan dengan berbagai cara tergantung pada platform aplikasi Anda. Dalam contoh kita ini adalah Vue.

Pindah untuk mengamankan 2FA di blockchain

Kode sumber untuk aplikasi demo otentikasi dua faktor blockchain dapat dilihat di GitHub. Ada tautan di Readme ke demo Langsung untuk mencobanya.

Sumber: www.habr.com

Tambah komentar