Pergi 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 ini mendekati 100% .

Saya memiliki kejadian seperti itu keterlaluan, karena metode ini tidak aman. Penugasan kembali nomor dari satu kartu SIM ke yang lain dimulai pada awal era ponsel - ini adalah bagaimana nomor dikembalikan ketika SIM hilang. “Spesialis Penyapihan Uang Digital” menyadari: opsi “menimpa kartu SIM” dapat digunakan dalam skema penipuan. Lagi pula, orang yang mengontrol kartu SIM dapat mengelola perbankan online orang lain, e-wallet, dan bahkan cryptocurrency. Dan Anda dapat mengambil alih nomor orang lain dengan menyuap karyawan telekomunikasi menggunakan penipuan atau dokumen palsu.



Ribuan episode swap SIM telah terungkap - inilah yang disebut skema penipuan ini. Skala bencana menunjukkan bahwa dunia akan segera meninggalkan 2FA melalui SMS. Tapi ini tidak terjadi - studi mengatakan bahwa bukan pengguna yang memilih metode 2FA, tetapi pemilik layanan.

Kami menyarankan untuk menggunakan metode 2FA aman dengan pengiriman kode satu kali melalui blockchain, dan kami akan memberi tahu Anda cara menghubungkannya ke pemilik layanan.

Tagihannya menjadi jutaan


Pada tahun 2019, penipuan pertukaran SIM meningkat 63% menurut polisi London, dan "rata-rata cek" dari penyerang adalah 4.000 GBP. Saya tidak menemukan statistik di Rusia, tetapi saya berasumsi bahwa ini bahkan lebih buruk.

Pertukaran SIM digunakan untuk mencuri Twitter, Instagram, Facebook, akun VK populer, rekening bank, dan baru-baru ini mencapai cryptocurrency, lapor surat kabar Times dari pengusaha bitcoin, Joby Weeks. Kasus-kasus pencurian cryptocurrency dengan bantuan pertukaran SIM telah muncul di media sejak 2016; pada 2019 datang puncak yang nyata.

Pada bulan Mei, jaksa penuntut AS di distrik timur Michigan menuduh sembilan orang muda berusia antara 19 dan 26: mereka diduga anggota geng peretas bernama The Community. Geng tersebut didakwa dengan tujuh serangan swap, akibatnya peretas yang menggunakan cryptocurrency bernilai lebih dari $ 2,4 juta. Dan pada bulan April, seorang siswa dari California, Joel Ortiz, menerima 10 tahun penjara karena bertukar SIM; Cryptocurrency $ 7,5 juta menjadi mangsanya.


Foto oleh Joel Ortiz pada konferensi pers universitas. Dua tahun kemudian, dia akan ditahan karena penipuan cyber.

Prinsip pertukaran SIM


Swap berarti pertukaran. Dalam semua skema semacam itu, penjahat menetapkan nomor telepon korban, biasanya dengan menerbitkan kembali kartu SIM, dan menggunakannya untuk mereset kata sandi. Suatu pertukaran SIM tipikal dalam teori terlihat seperti ini:

  1. Kecerdasan Penipu mencari tahu data pribadi korban: nama dan telepon. Mereka dapat ditemukan di sumber terbuka (jejaring sosial, teman) atau diperoleh dari kaki tangan - karyawan operator seluler.
  2. Memblokir. Kartu SIM Korban dinonaktifkan; Untuk melakukan ini, cukup hubungi dukungan teknis penyedia, laporkan nomornya dan katakan bahwa telepon telah hilang.
  3. Abadikan, transfer nomor ke kartu SIM Anda. Biasanya ini juga dilakukan melalui kaki tangan di perusahaan telekomunikasi atau dengan memalsukan dokumen.

Dalam kehidupan nyata itu masih lebih parah. Penyerang memilih korban, dan kemudian setiap hari memantau lokasi telepon - satu permintaan informasi bahwa pelanggan telah beralih ke biaya jelajah 1-2 sen. Begitu pemilik kartu SIM pergi ke luar negeri, mereka setuju dengan manajer di salon komunikasi untuk mengeluarkan kartu SIM baru. Harganya sekitar $ 50 (saya menemukan informasi - di berbagai negara dan dari operator yang berbeda dari $ 20 hingga $ 100), sementara manajer akan dipecat dalam kasus terburuk - tidak ada tanggung jawab untuk ini.

Sekarang semua penyusup akan menerima semua SMS, dan pemilik ponsel tidak akan bisa berbuat apa-apa - dia ada di luar negeri. Dan kemudian penjahat mendapatkan akses ke semua akun korban dan, jika diinginkan, ubah kata sandi.

Peluang untuk mengembalikan barang curian


Bank terkadang pergi ke arah para korban dan menarik transfer dari rekening mereka. Oleh karena itu, dimungkinkan untuk mengembalikan uang fiat, meskipun pelanggar tidak ditemukan. Tetapi dengan dompet cryptocurrency, semuanya lebih rumit - baik secara teknis maupun hukum. Sejauh ini, tidak ada pertukaran / dompet telah membayar kompensasi untuk menukar korban.

Jika korban ingin mempertahankan uang mereka di pengadilan, maka mereka menuduh operator: ia menciptakan kondisi untuk pencurian uang dari akun. Ini persis seperti yang dilakukan Michael Turpin , yang kehilangan $ 224 juta karena swap. Sekarang dia menggugat perusahaan telekomunikasi AT&T.



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

SIM swap bukan satu-satunya masalah 2FA melalui SMS


Kode konfirmasi dalam SMS juga tidak aman dari sudut pandang teknis. Pesan dapat dicegat karena kerentanan fatal di Signaling System 7 (SS7). 2FA melalui SMS secara resmi diakui tidak aman (Institut Nasional Standar dan Teknologi AS membicarakan hal ini dalam Panduan Otentikasi Digitalnya ).

Selain itu, kehadiran 2FA sering menginspirasi pengguna dengan rasa aman palsu, dan ia memilih kata sandi yang lebih sederhana. Oleh karena itu, otentikasi tersebut tidak menyulitkan, tetapi memfasilitasi akses penyerang ke akun.

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

Metode 2FA lainnya


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

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

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

Banyak pengguna metode 2FA mengasosiasikan dengan ketakutan bahwa akses akan hilang. Kunci fisik atau daftar kata sandi TAN dapat hilang atau dicuri. Saya pribadi memiliki pengalaman negatif menggunakan Google Authenticator. Ponsel cerdas pertama saya dengan aplikasi ini rusak - evaluasi upaya saya untuk memulihkan akses ke akun. Masalah lain adalah transisi ke perangkat baru. Google Authenticator tidak dapat mengekspor karena masalah keamanan (jika kunci dapat diekspor, jenis keamanan apa yang ada?). Suatu kali saya mentransfer kunci secara manual, dan kemudian memutuskan bahwa lebih mudah meninggalkan smartphone lama di dalam kotak di rak.

Metode 2FA harus:

  • Aman - hanya Anda yang harus mendapatkan akses ke akun Anda, bukan penyerang
  • Andal - Anda mendapatkan akses ke akun Anda kapan pun Anda membutuhkannya
  • Nyaman dan terjangkau - menggunakan 2FA jelas dan membutuhkan waktu minimum
  • Murah

Kami percaya bahwa blockchain adalah solusi yang tepat.

Gunakan 2FA di blockchain


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

Layanan menghasilkan kode satu kali dan mengirimkannya ke messenger di blockchain. Selanjutnya, sesuai dengan klasik: pengguna memasukkan kode yang diterima di antarmuka layanan dan masuk.



Dalam artikel Bagaimana messenger yang didesentralisasi bekerja di blockchain, saya menulis bahwa blockchain memastikan keamanan dan privasi pengiriman 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 dikecualikan - setiap pesan dengan kode 2FA adalah transaksi pada blockchain dan ditandatangani oleh Ed25519 EdDSA.
  • Pesan dengan kode 2FA masuk dalam bloknya. Urutan dan stempel waktu blok tidak dapat diperbaiki, dan karena itu urutan pesan.
  • Tidak ada struktur utama yang memeriksa “keaslian” pesan. Ini dilakukan oleh sistem node terdistribusi berbasis konsensus, dan itu milik pengguna.
  • Ketidakmampuan untuk menonaktifkan - akun tidak dapat diblokir, dan pesan dapat dihapus.
  • Akses kode 2FA dari perangkat apa saja kapan saja.
  • Pesan konfirmasi pengiriman dengan kode 2FA. Layanan yang mengirim kata sandi satu kali tahu dengan pasti kata sandi itu telah terkirim. Tidak ada tombol "Kirim Lagi".

Untuk perbandingan dengan beberapa metode 2FA lainnya, saya telah menyusun tabel:



Pengguna menerima akun di messenger blockchain untuk menerima kode dalam frasa sandi kedua saja yang digunakan untuk memasukkan. Oleh karena itu, metode aplikasi dapat berbeda: Anda dapat menggunakan satu akun untuk mendapatkan kode untuk semua layanan, atau Anda dapat membuat akun terpisah untuk setiap layanan.

Ada juga kerugian - akun harus memiliki setidaknya satu transaksi. Agar pengguna menerima pesan terenkripsi dengan kode, Anda harus mengetahui kunci publiknya, dan ia muncul di blockchain hanya dengan transaksi pertama. Kami keluar dengan cara ini: kami memberi kesempatan untuk menerima token gratis di dompet. Namun, solusi yang lebih tepat adalah memberi nama akun kunci publik. (Sebagai perbandingan, nomor akun kami U1467838112172792705 adalah turunan dari kunci publik cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada . Untuk pengirim pesan, ini lebih mudah dan mudah dibaca, tetapi untuk sistem pengiriman kode 2FA). Saya pikir di masa depan seseorang akan membuat keputusan dan mentransfer "Kenyamanan dan Aksesibilitas" ke zona hijau.

Biaya pengiriman kode 2FA sangat rendah - 0,001 ADM, sekarang 0,00001 USD. Sekali lagi, Anda dapat meningkatkan blockchain Anda dan membuat harga nol.

Bagaimana menghubungkan 2FA di blockchain ke layanan Anda


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

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

Langkah-langkah koneksi:

  1. Buat akun di blockchain dari mana Anda akan mengirim 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, langkah ini telah selesai.
  3. Tambahkan skrip ke server Anda untuk mengirim kode ke pengguna di messenger blockchain.
  4. Buat antarmuka pengguna untuk mengirim dan memasukkan kode 2FA. Jika Anda sudah menggunakan metode 2FA lainnya dengan pengiriman kata sandi satu kali, langkah ini telah selesai.

1 Buat akun

Membuat akun di blockchain adalah pembuatan kunci pribadi, kunci publik, dan alamat akun yang berasal darinya.



Pertama, kata sandi BIP39 dihasilkan, dari mana hash SHA-256 dipertimbangkan. Hash digunakan untuk menghasilkan kunci privat ks dan kunci publik kp. Dari kunci publik dengan SHA-256 yang sama dengan inversi, kami mendapatkan alamat di blockchain.

Jika Anda ingin mengirim kode 2FA setiap kali dari akun baru, kode untuk membuat 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 - membuat satu akun di aplikasi web, dan mengirim kode darinya. Dalam kebanyakan kasus, ini lebih nyaman bagi pengguna: ia tahu bahwa layanan mengirim kode 2FA dari akun tertentu, dan dapat menamainya.



2 Generasi Kode 2FA

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

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

Validasi kode 2FA pengguna yang dimasukkan oleh pengguna:

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

3 Kirim Kode 2FA

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

4 antarmuka pengguna

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



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

Source: https://habr.com/ru/post/id476090/


All Articles