Tin nhắn SMS là phương pháp xác thực hai yếu tố (2FA) phổ biến nhất. Nó được sử dụng bởi các ngân hàng, ví điện tử và tiền điện tử, hộp thư và tất cả các loại dịch vụ; .
Tôi phẫn nộ trước tình huống này, vì phương pháp này không an toàn. Việc gán lại một số từ thẻ SIM này sang thẻ SIM khác bắt đầu từ đầu kỷ nguyên di động - đây là cách số đó được khôi phục khi thẻ SIM bị mất. “Chuyên gia trộm tiền kỹ thuật số” nhận ra rằng tùy chọn “viết lại thẻ SIM” có thể được sử dụng trong các âm mưu lừa đảo. Suy cho cùng, người kiểm soát thẻ SIM có thể kiểm soát hoạt động ngân hàng trực tuyến, ví điện tử và thậm chí cả tiền điện tử của người khác. Và bạn có thể chiếm hữu số của người khác thông qua việc hối lộ nhân viên viễn thông, sử dụng tài liệu lừa đảo hoặc giả mạo.

Hàng nghìn đợt hoán đổi SIM đã bị phát hiện, như tên gọi của âm mưu lừa đảo này. Quy mô của thảm họa cho thấy thế giới sẽ sớm từ bỏ 2FA qua SMS. Nhưng điều này không xảy ra - trong họ nói rằng không phải người dùng chọn phương pháp 2FA mà là chủ sở hữu dịch vụ.
Chúng tôi đề xuất sử dụng phương pháp 2FA an toàn với việc phân phối mã một lần qua chuỗi khối và chúng tôi sẽ cho bạn biết cách chủ sở hữu dịch vụ có thể kết nối nó.
Số lượng lên tới hàng triệu
Theo cảnh sát London, vào năm 2019, gian lận hoán đổi SIM đã tăng 63% và “hóa đơn trung bình” của kẻ tấn công là 4,000 GBP. Tôi chưa tìm thấy bất kỳ số liệu thống kê nào ở Nga, nhưng tôi cho rằng chúng thậm chí còn tệ hơn.
Hoán đổi SIM được sử dụng để đánh cắp các tài khoản Twitter, Instagram, Facebook, VK, tài khoản ngân hàng phổ biến và gần đây là cả tiền điện tử - theo doanh nhân Bitcoin Joby Weeks. Các trường hợp trộm tiền điện tử nổi tiếng bằng cách hoán đổi SIM đã xuất hiện trên báo chí kể từ năm 2016; Năm 2019 chứng kiến một đỉnh cao thực sự.
Vào tháng 5, Văn phòng Luật sư Hoa Kỳ tại Quận Đông Michigan chín thanh niên trong độ tuổi từ 19 đến 26: họ được cho là thành viên của một nhóm hacker có tên “The Community”. Băng nhóm này bị buộc tội bảy cuộc tấn công hoán đổi, hậu quả là tin tặc đã đánh cắp tiền điện tử trị giá hơn 2,4 triệu USD. Và vào tháng 10, sinh viên California Joel Ortiz nhận 7.5 năm tù vì tội tráo đổi SIM; sản lượng của anh ấy là XNUMX triệu đô la tiền điện tử.

Ảnh của Joel Ortiz tại một cuộc họp báo của trường đại học. Hai năm sau anh ta sẽ bị giam giữ vì tội lừa đảo trên mạng.
Cách thức trao đổi SIM hoạt động
“Hoán đổi” có nghĩa là trao đổi. Trong tất cả các âm mưu như vậy, bọn tội phạm chiếm lấy số điện thoại của nạn nhân, thường thông qua việc cấp lại thẻ SIM và sử dụng nó để đặt lại mật khẩu. Về lý thuyết, một trao đổi SIM điển hình trông như thế này:
- Bộ điều tra. Kẻ lừa đảo tìm hiểu thông tin cá nhân của nạn nhân: tên và số điện thoại. Chúng có thể được tìm thấy trong các nguồn mở (mạng xã hội, bạn bè) hoặc nhận được từ đồng phạm - nhân viên của một nhà mạng di động.
- Chặn. Thẻ SIM của nạn nhân bị vô hiệu hóa; Để thực hiện việc này, chỉ cần gọi cho bộ phận hỗ trợ kỹ thuật của nhà cung cấp, cung cấp số điện thoại và thông báo rằng điện thoại đã bị mất.
- Chụp, chuyển số vào thẻ SIM của bạn. Thông thường việc này cũng được thực hiện thông qua đồng phạm trong công ty viễn thông hoặc thông qua việc giả mạo tài liệu.
Trong cuộc sống thực, mọi chuyện thậm chí còn nghiêm trọng hơn. Những kẻ tấn công chọn nạn nhân và sau đó theo dõi vị trí của điện thoại hàng ngày - một yêu cầu nhận thông tin mà thuê bao đã chuyển sang chuyển vùng có giá 1-2 xu. Ngay khi chủ thẻ SIM ra nước ngoài, họ sẽ đàm phán với người quản lý tại cửa hàng truyền thông để cấp thẻ SIM mới. Nó có giá khoảng 50 đô la (tôi tìm thấy thông tin - ở các quốc gia khác nhau và với các nhà khai thác khác nhau từ 20 đô la đến 100 đô la), và trong trường hợp xấu nhất, người quản lý sẽ bị sa thải - không có trách nhiệm nào về việc này.
Giờ đây, tất cả tin nhắn SMS sẽ bị kẻ tấn công nhận được và chủ sở hữu của chiếc điện thoại sẽ không thể làm gì được - anh ta đang ở nước ngoài. Sau đó, kẻ xấu có quyền truy cập vào tất cả tài khoản của nạn nhân và thay đổi mật khẩu nếu muốn.
Cơ hội lấy lại tài sản bị đánh cắp
Các ngân hàng đôi khi hỗ trợ nạn nhân một nửa và rút tiền chuyển khoản khỏi tài khoản của họ. Vì vậy, có thể trả lại tiền định danh ngay cả khi không tìm thấy tội phạm. Nhưng với ví tiền điện tử thì mọi thứ phức tạp hơn - và về mặt kỹ thuật, và về mặt lập pháp. Cho đến nay, chưa có một sàn giao dịch/ví nào trả tiền bồi thường cho nạn nhân của việc hoán đổi.
Nếu nạn nhân muốn bảo vệ tiền của mình trước tòa, họ đổ lỗi cho người điều hành: anh ta đã tạo điều kiện để trộm tiền từ tài khoản. Đó chính xác là những gì tôi đã làm , người đã mất 224 triệu USD do hoán đổi. Ông hiện đang kiện công ty viễn thông AT&T.

Cho đến nay, không có tiểu bang nào có kế hoạch hoạt động để bảo vệ hợp pháp chủ sở hữu tiền điện tử. Không thể bảo hiểm vốn của bạn hoặc nhận tiền bồi thường cho khoản lỗ của nó. Vì vậy, việc ngăn chặn một cuộc tấn công hoán đổi dễ dàng hơn việc giải quyết hậu quả của nó. Cách rõ ràng nhất là sử dụng "yếu tố thứ hai" đáng tin cậy hơn cho 2FA.
Trao đổi SIM không phải là vấn đề duy nhất với 2FA qua SMS
Mã xác nhận trong SMS cũng không an toàn về mặt kỹ thuật. Tin nhắn có thể bị chặn do các lỗ hổng chưa được vá trong Hệ thống tín hiệu 7 (SS7). 2FA qua SMS được chính thức công nhận là không an toàn (Viện Tiêu chuẩn và Công nghệ Quốc gia Hoa Kỳ cho biết điều này trong ).
Đồng thời, sự hiện diện của 2FA thường mang lại cho người dùng cảm giác an toàn sai lầm và anh ta chọn một mật khẩu đơn giản hơn. Do đó, việc xác thực như vậy không gây khó khăn mà còn giúp kẻ tấn công chiếm quyền truy cập vào tài khoản dễ dàng hơn.
Và thường SMS đến với độ trễ lâu hoặc không hề đến.
Các phương pháp 2FA khác
Tất nhiên, ánh sáng không hội tụ trên điện thoại thông minh và SMS. Có các phương pháp 2FA khác. Ví dụ: mã TAN dùng một lần: một phương pháp nguyên thủy, nhưng nó hoạt động - nó vẫn được sử dụng ở một số ngân hàng. Có những hệ thống sử dụng dữ liệu sinh trắc học: dấu vân tay, quét võng mạc. Một lựa chọn khác có vẻ như là một sự thỏa hiệp hợp lý về sự tiện lợi, độ tin cậy và giá cả là các ứng dụng đặc biệt dành cho 2FA: RSA Token, Google Authenticator. Ngoài ra còn có phím vật lý và các phương pháp khác.
Về lý thuyết, mọi thứ có vẻ hợp lý và đáng tin cậy. Nhưng trên thực tế, các giải pháp 2FA hiện đại có vấn đề và do đó, thực tế khác với mong đợi.
Theo , việc sử dụng 2FA về nguyên tắc là bất tiện và sự phổ biến của 2FA qua SMS được giải thích là do “ít bất tiện hơn so với các phương pháp khác” - việc nhận mã một lần là điều dễ hiểu đối với người dùng.
Người dùng liên tưởng nhiều phương pháp 2FA với nỗi lo sợ rằng quyền truy cập sẽ bị mất. Khóa vật lý hoặc danh sách mật khẩu TAN có thể bị mất hoặc bị đánh cắp. Cá nhân tôi đã có trải nghiệm tồi tệ với Google Authenticator. Điện thoại thông minh đầu tiên của tôi có ứng dụng này bị hỏng - đánh giá cao nỗ lực của tôi trong việc khôi phục quyền truy cập vào tài khoản của mình. Một vấn đề khác là chuyển sang một thiết bị mới. Google Authenticator không có tùy chọn xuất vì lý do bảo mật (nếu khóa có thể xuất được thì có bảo mật gì?). Có lần tôi mang chìa khóa theo cách thủ công và sau đó tôi quyết định rằng việc để chiếc điện thoại thông minh cũ trong hộp trên kệ sẽ dễ dàng hơn.
Phương pháp 2FA phải là:
- Bảo mật - chỉ bạn chứ không phải kẻ tấn công mới có quyền truy cập vào tài khoản của bạn
- Đáng tin cậy - bạn có quyền truy cập vào tài khoản của mình bất cứ khi nào bạn cần
- Thuận tiện và dễ tiếp cận - sử dụng 2FA rất rõ ràng và tốn ít thời gian nhất
- Rẻ
Chúng tôi tin rằng blockchain là giải pháp phù hợp.
Sử dụng 2FA trên blockchain
Đối với người dùng, 2FA trên blockchain trông giống như nhận mã một lần qua SMS. Sự khác biệt duy nhất là kênh phân phối. Phương pháp lấy mã 2FA phụ thuộc vào những gì blockchain cung cấp. Trong dự án của chúng tôi (thông tin có trong hồ sơ của tôi) đây là một ứng dụng Web, Tor, iOS, Android, Linux, Windows, MacOS.
Dịch vụ này tạo mã một lần và gửi nó đến trình nhắn tin trên blockchain. Sau đó làm theo cách cổ điển: người dùng nhập mã nhận được vào giao diện dịch vụ và đăng nhập.

Trong bài viết Tôi đã viết rằng blockchain đảm bảo tính bảo mật và quyền riêng tư của việc truyền tin nhắn. Về vấn đề gửi mã 2FA mình sẽ nhấn mạnh:
- Một cú nhấp chuột để tạo tài khoản - không cần điện thoại hoặc email.
- Tất cả các tin nhắn có mã 2FA đều được mã hóa End-to-End Curve25519xsalsa20poly1305.
- Cuộc tấn công MITM bị loại trừ - mọi tin nhắn có mã 2FA đều là một giao dịch trên blockchain và được ký bởi Ed25519 EdDSA.
- Tin nhắn có mã 2FA sẽ kết thúc trong khối riêng của nó. Trình tự và dấu thời gian của các khối không thể sửa được và do đó không thể sửa được thứ tự của các tin nhắn.
- Không có cấu trúc trung tâm nào kiểm tra “tính xác thực” của tin nhắn. Điều này được thực hiện bởi một hệ thống nút phân tán dựa trên sự đồng thuận và nó thuộc sở hữu của người dùng.
- Không thể bị vô hiệu hóa - không thể chặn tài khoản và không thể xóa tin nhắn.
- Truy cập mã 2FA từ mọi thiết bị vào bất kỳ lúc nào.
- Xác nhận gửi tin nhắn bằng mã 2FA. Dịch vụ gửi mật khẩu một lần biết chắc chắn rằng nó đã được gửi. Không có nút “Gửi lại”.
Để so sánh với một số phương pháp 2FA khác, tôi lập bảng:

Người dùng nhận được một tài khoản trong trình nhắn tin blockchain để nhận mã trong giây lát - chỉ sử dụng cụm mật khẩu để đăng nhập. Do đó, cách thức áp dụng có thể khác nhau: bạn có thể sử dụng một tài khoản để nhận mã cho tất cả các dịch vụ hoặc có thể tạo một tài khoản riêng cho từng dịch vụ.
Ngoài ra còn có một điều bất tiện - tài khoản phải có ít nhất một giao dịch. Để người dùng nhận được tin nhắn được mã hóa bằng mã, bạn cần biết khóa công khai của người đó và nó chỉ xuất hiện trong chuỗi khối với giao dịch đầu tiên. Đây là cách chúng tôi đã thoát khỏi tình trạng này: chúng tôi đã cho họ cơ hội nhận được token miễn phí trong ví của họ. Tuy nhiên, giải pháp tốt hơn là đặt tên tài khoản là khóa chung. (Để so sánh ta có số tài khoản U1467838112172792705 là một dẫn xuất của khóa công khai cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. Đối với trình nhắn tin, điều này thuận tiện và dễ đọc hơn, nhưng đối với hệ thống gửi mã 2FA thì đó là một hạn chế). Tôi nghĩ rằng trong tương lai sẽ có người đưa ra quyết định như vậy và chuyển “Sự thuận tiện và khả năng tiếp cận” sang vùng xanh.
Giá gửi mã 2FA thực sự thấp - 0.001 ADM, hiện tại là 0.00001 USD. Một lần nữa, bạn có thể nâng cao blockchain của mình và đưa ra mức giá bằng XNUMX.
Cách kết nối 2FA trên blockchain với dịch vụ của bạn
Tôi hy vọng tôi có thể thu hút một số độc giả thêm tính năng ủy quyền blockchain vào dịch vụ của họ.
Tôi sẽ cho bạn biết cách thực hiện việc này bằng cách sử dụng ứng dụng nhắn tin của chúng tôi làm ví dụ và bằng cách tương tự, bạn có thể sử dụng một blockchain khác. Trong ứng dụng demo 2FA, chúng tôi sử dụng postgresql10 để lưu trữ thông tin tài khoản.
Các giai đoạn kết nối:
- Tạo một tài khoản trên blockchain mà từ đó bạn sẽ gửi mã 2FA. Bạn sẽ nhận được một cụm mật khẩu, được sử dụng làm khóa riêng để mã hóa tin nhắn bằng mã và ký giao dịch.
- Thêm tập lệnh vào máy chủ của bạn để tạo mã 2FA. Nếu bạn đang sử dụng bất kỳ phương pháp 2FA nào khác với việc gửi mật khẩu một lần thì bạn đã hoàn thành bước này.
- Thêm tập lệnh vào máy chủ của bạn để gửi mã cho người dùng trong trình nhắn tin blockchain.
- Tạo giao diện người dùng để gửi và nhập mã 2FA. Nếu bạn đang sử dụng bất kỳ phương pháp 2FA nào khác với việc gửi mật khẩu một lần thì bạn đã hoàn thành bước này.
1 Tạo tài khoản
Tạo một tài khoản trong blockchain có nghĩa là tạo khóa riêng, khóa chung và địa chỉ tài khoản phái sinh.

Đầu tiên, cụm mật khẩu BIP39 được tạo và hàm băm SHA-256 được tính từ cụm mật khẩu đó. Hàm băm được sử dụng để tạo khóa riêng ks và khóa chung kp. Từ khóa chung, sử dụng cùng SHA-256 có đảo ngược, chúng tôi có được địa chỉ trong chuỗi khối.
Nếu bạn muốn gửi mã 2FA mỗi lần từ một tài khoản mới, mã tạo tài khoản sẽ cần được thêm vào máy chủ:
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()
}Trong ứng dụng demo, chúng tôi đã đơn giản hóa nó - chúng tôi đã tạo một tài khoản trong ứng dụng web và gửi mã từ tài khoản đó. Trong hầu hết các trường hợp, điều này cũng thuận tiện hơn cho người dùng: anh ta biết rằng dịch vụ sẽ gửi mã 2FA từ một tài khoản cụ thể và có thể đặt tên cho nó.

2 Tạo mã 2FA
Mã 2FA phải được tạo cho mỗi lần đăng nhập của người dùng. Chúng tôi sử dụng thư viện , nhưng bạn có thể chọn bất kỳ cái nào khác.
const hotp = speakeasy.hotp({
counter,
secret: account.seSecretAscii,
});
Kiểm tra tính hợp lệ của mã 2FA do người dùng nhập:
se2faVerified = speakeasy.hotp.verify({
counter: this.seCounter,
secret: this.seSecretAscii,
token: hotp,
});
3 Gửi mã 2FA
Để gửi mã 2FA, bạn có thể sử dụng API nút blockchain, thư viện API JS hoặc bảng điều khiển. Trong ví dụ này, chúng tôi sử dụng bảng điều khiển - đây là Giao diện dòng lệnh, một tiện ích giúp đơn giản hóa việc tương tác với blockchain. Để gửi tin nhắn có mã 2FA, bạn cần sử dụng lệnh send message bảng điều khiển.
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);
Một cách khác để gửi tin nhắn là sử dụng phương thức send trong thư viện API JS.
4 Giao diện người dùng
Người dùng cần được cung cấp tùy chọn nhập mã 2FA, việc này có thể được thực hiện theo nhiều cách khác nhau tùy thuộc vào nền tảng ứng dụng của bạn. Trong ví dụ của chúng tôi đây là Vue.

Mã nguồn của ứng dụng demo xác thực hai yếu tố blockchain có thể được xem tại . Có một liên kết trong bản demo Readme to a Live để dùng thử.
Nguồn: www.habr.com
