SMS съобщенията са един от най-популярните методи за двуфакторна автентикация (2FA). Те се използват от банки, електронни и криптовалутни портфейли, пощенски кутии и различни услуги; .
Тази ситуация ме възмущава, тъй като този метод не е безопасен. Прехвърлянето на номер от една SIM карта на друга започна още в началото на мобилната ера — така възстановяват номера при загуба на SIM картата. "Специалистите по кражба на цифрови пари" осъзнаха, че опцията "презапис на SIM картата" може да се използва в измамни схеми. Човекът, който контролира SIM картата, може да управлява чуждия онлайн банкинг, електронни портфейли и дори криптовалута. А номерът на друго лице може да бъде придобит чрез подкуп на служител на телекома, с помощта на измама или фалшиви документи.

Разкрити са хиляди епизоди на SIM-свопинг — така нарекоха тази схема на измама. Масштабите на бедствието показват, че скоро светът ще се откаже от 2FA чрез SMS. Но това не се случва — в казват, че методът 2FA не се избира от потребителите, а от собствениците на услуги.
Ние предлагаме да използвате безопасен метод 2FA с доставка на еднократни кодове чрез блокчейн и ще покажем на собствениците на услуги как да го свържат.
Става дума за милиони
През 2019 година измамите с SIM-свопинг нараснали с 63% според данни на лондонската полиция, а "средният размер" на измамите е 4,000 GBP. Нямам статистики от Русия, но предполагаем, че те са още по-лоши.
SIM-свопингът се използва за кражба на популярни акаунти в Twitter, Instagram, Facebook, VK, банкови акаунти, а напоследък достигнаха и до криптовалути — по думите на биткойн предприемача Джоби Уикс. Громките случаи на кражба на криптовалути чрез SIM-свопинг изплуват в пресата от 2016 година; на 2019 година беше истински пик.
През май прокуратурата на САЩ в източния окръг Мичиган на девет младежи на възраст от 19 до 26 години: те предположително са част от хакерската банда, наречена “The Community” („Общността“). На бандата се ставят на отговорност седем свопинг-атаки, в резултат на които хакерите присвоили криптовалута на стойност над $2,4 милиона. А през април студент от Калифорния, Джоел Ортиз, получи 10 години затвор за SIM-свопинг; неговата плячка стана $7.5 млн. в криптовалути.

Снимка на Джоел Ортиз от пресконференция в университета. След две години той ще бъде арестуван за кибермошеничество.
Принцип на работа на SIM-свопинга
«Свопинг» означава размяна. Във всички подобни схеми престъпниците присвояват телефонния номер на жертвата, обикновено чрез повторно издаване на SIM-карта, и го използват за нулиране на паролата. Типичният SIM-свопинг в теорията изглежда така:
- Разузнаване. Мошениците научават лични данни за жертвата: име и телефон. Те могат да бъдат намерени в открити източници (социални мрежи, приятели) или получени от съучастник – служител на мобилния оператор.
- Блокиране. SIM-картата на жертвата се деактивира; за това е достатъчно да се обадите в техническата поддръжка на оператора, да съобщите номера и да кажете, че телефонът е загубен.
- Захващане, прехвърляне на номера към собствената му сим-карта. Обикновено това също се прави чрез съучастник в телекомуникационната компания или с помощта на фалшифицирани документи.
В реалния живот всичко е още по-сурово. Престъпниците избират жертва, а след това ежедневно проследяват местоположението на телефона – едно запитване за информация, че абонатът е преминал в роуминг, струва 1-2 цента. В момента, в който собственикът на сим-картата замине в чужбина, те се договарят с мениджър в магазина за връщане на нова сим-карта. Цената е около 50 $ (намерих информация – в различни страни и при различни оператори от 20 до 100 $), като мениджърът в най-лошия случай ще бъде уволнен – за това няма отговорност.
Сега всички СМС съобщения ще получават злосторниците, а собственикът на телефона няма да може да направи нищо по въпроса – той е в чужбина. А след това злодеите получават достъп до всички акаунти на жертвата и при желание променят паролите.
Шансове за възстановяване на откраднатото
Банките понякога помагат на жертвите и отменят преводи от техните сметки. Затова е възможно да се върнат фиатните пари, дори ако престъпникът не бъде намерен. Но с криптовалутните портфейли е по-сложно – както технически, така и законодателно. До момента нито една борса/портфейл не е изплатила обезщетения на жертвите на свопинга.
Ако пострадалите искат да защитят парите си в съда, те обвиняват оператора: той е създал условия за кражбата на пари от сметката. Именно така постъпи , който загуби 224 милиона долара заради свопинга. В момента той съди телекомуникационната компания AT&T.

В момента нито една държава не разполага с работни схеми, за да законодателно защити собствениците на криптовалути. Невъзможно е да застраховате капитала си или да получите компенсация за неговата загуба. Затова предотвратяването на атаката на свопинг е по-лесно, отколкото да се борите с последствията от нея. Най-очевидният начин е да се използва по-надежден "втори фактор" за 2FA.
Сим-свопинг не е единственият проблем с 2FA чрез SMS
Кодовете за потвърждение в SMS не са безопасни и от техническа гледна точка. Съобщенията могат да бъдат прихванати поради необорими уязвимости в сигналната система Signaling System 7 (SS7). 2FA по SMS официално е призната за недостатъчно безопасна (Националният институт за стандарти и технологии на САЩ говори за това в своето ).
В същото време наличието на 2FA често внушава на потребителя чувство за фалшива безопасност, и той избира по-прост парола. Затова подобна аутентификация не затруднява, а улеснява достъпа на злонамерени лица до акаунта.
А освен това често SMS съобщенията пристигат с голямо закъснение или изобщо не пристигат.
Други начини за 2FA
Разбира се, на смартфоните и SMS не свършва всичко. Има и други начини за 2FA. Например, еднократните TAN-кодове: прост метод, но работещ — все още се използва в някои банки. Съществуват системи, които използват биометрични данни: отпечатъци от пръсти, сканирания на ретината. Още един вариант, който изглежда разумен компромис между удобство, надеждност и цена — специални приложения за 2FA: RSA Token, Google Authenticator. Освен това съществуват физически ключове и други методи.
На теория всичко изглежда логично и надеждно. Но на практика съвременните решения за 2FA имат проблеми, и заради тях реалността се различава от очакванията.
Според , използването на 2FA по принцип е неудобство, а популярността на 2FA по SMS се обяснява с "по-малкото неудобство в сравнение с другите методи" — получаването на еднократни кодове е разбираемо за потребителя.
Много потребители свързват методите за 2FA с тревогата, че достъпът може да бъде изгубен. Физически ключ или списък с TAN пароли може да бъде загубен или откраднат. Лично имам негативен опит с Google Authenticator. Първият смартфон с това приложение се счупи — оценете усилията ми да възстановя достъпа до акаунтите. Друг проблем е преходът към ново устройство. Google Authenticator няма опция за експортиране поради съображения за сигурност (ако ключовете могат да бъдат експортирани, каква сигурност е тук?). Веднъж прехвърлих ключовете ръчно, а после реших, че е по-лесно да оставя стария смартфон в кутия на рафта.
Методът 2FA трябва да бъде:
- Сигурен — достъпът до акаунта трябва да имате само вие, а не злонамерени лица
- Надежден — вие получавате достъп до акаунта винаги, когато е необходимо
- Удобен и достъпен — използването на 2FA е интуитивно и отнема минимално време
- Евтин
Смятаме, че блокчейнът е подходящо решение.
Използвайте 2FA на блокчейна
За потребителя 2FA на блокчейна изглежда като получаване на еднократни кодове чрез SMS. Разликата е само в канала на доставка. Начинът на получаване на 2FA кода зависи от това, което предлага блокчейнът. В нашия проект (информацията е в профила ми) това е уеб приложение, Tor, iOS, Android, Linux, Windows, MacOS.
Услугата генерира еднократен код и го изпраща в мессенджър на блокчейна. После — класически: потребителят въвежда получения код в интерфейса на услугата и се авторизира.

В статията съм написал, че блокчейнът осигурява сигурност и поверителност при предаването на съобщения. По въпроса за изпращането на 2FA кодове бих отличил:
- Едно кликване за създаване на акаунт — никакви телефони и имейли.
- Всички съобщения с 2FA кодове се криптират End-to-End curve25519xsalsa20poly1305.
- MITM атака е изключена — всяко съобщение с 2FA код е транзакция в блокчейна и се подписва с Ed25519 EdDSA.
- Съобщението с 2FA код попада в своя блок. Последователността и timestamp-ът на блоковете не могат да бъдат променяни, следователно и редът на съобщенията.
- Няма централна структура, която да извършва проверки за „достоверност“ на съобщенията. Това прави разпределена система от възли на база на консенсус, а тя принадлежи на потребителите.
- Невъзможност за деактивиране — акаунти не могат да бъдат блокирани, а съобщенията изтривани.
- Достъп до кодовете 2FA от всяко устройство по всяко време.
- Потвърждение за доставяне на съобщение с код 2FA. Сервисът, който изпраща еднократна парола, точно знае, че тя е доставена. Няма бутони 'Изпрати отново'.
За сравнение с някои други методи 2FA съставих таблица:

Потребителят получава акаунт в блокчейн-месинджера за получаване на кодове за секунди — за вход се използва само паролата. Затова начините за приложение могат да бъдат различни: може да се използва един акаунт за получаване на кодове за всички услуги, или за всяка услуга да се създаде отделен акаунт.
Има и неудобство — акаунтът трябва да има поне една транзакция. За да получи потребителят криптирано съобщение с код, трябва да знае публичния си ключ, а той се появява в блокчейна само с първата транзакция. Ние намерихме решение: осигурихме възможност за получаване на безплатни токени в портфейла. Въпреки това, по-правилното решение е да именуваме акаунта с публичния ключ. (За сравнение, нашият номер на акаунта U1467838112172792705 е производен на публичния ключ cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. За месинджера това е по-удобно и четимо, но за системата за изпращане на 2FA-кодове — ограничение). Мисля, че в бъдеще някой ще направи такова решение и ще прехвърли 'Удобство и достъпност' в зелената зона.
Цената за изпращане на 2FA-код е реално ниска — 0.001 ADM, в момента това е 0.00001 USD. Отново, може да се създаде собствен блокчейн и да се направи цената нулева.
Как да свържете 2FA на блокчейна с вашия сервис
Надявам се, че успях да заинтересувам няколко читатели да добавят блокчейн-ауторизация на своите услуги.
Ще разкажа как да го направите на примера на нашия месинджер, а по аналогия можете да използвате и друг блокчейн. В демо-приложението 2FA използваме postgresql10 за съхранение на информация за акаунтите.
Стъпки за свързване:
- Създайте акаунт в блокчейна, от който ще изпращате кодовете 2FA. Ще получите парола, която се използва като частен ключ за криптиране на съобщенията с кодове и за подписване на транзакции.
- Добавете на вашия сървър скрипт за генериране на кодове 2FA. Ако вече използвате някой друг метод 2FA с доставка на еднократни пароли, тази стъпка вече е изпълнена.
- Добавете на вашия сървър скрипт за изпращане на кодове на потребителя в блокчейн месинджър.
- Създайте потребителски интерфейс за изпращане и въвеждане на кода 2FA. Ако вече използвате друг метод 2FA с доставка на еднократни пароли, тази стъпка вече е завършена.
1 Създаване на акаунт
Създаването на акаунт в блокчейн включва генериране на частен ключ, публичен ключ и производен адрес на акаунта.

Първо се генерира пасфраза BIP39, от която се изчислява SHA-256 хеш. Хешът се използва за генериране на частен ключ ks и публичен ключ kp. От публичния ключ, чрез инверсия на същия SHA-256, получаваме адрес в блокчейна.
Ако искате да изпращате 2FA кодове всеки път от нов акаунт, кодът за създаване на акаунт трябва да бъде добавен на сървъра:
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()
}В демо приложението опростихме — създадохме един акаунт в уеб приложението и изпращаме кодове от него. В повечето случаи това е по-удобно и за потребителя: той знае, че услугата изпраща 2FA кодове от конкретен акаунт и може да го именува.

2 Генерация на 2FA кодове
Код 2FA трябва да бъде генериран за всяко влизане на потребителя. Използваме библиотеката , но можете да изберете всяка друга.
const hotp = speakeasy.hotp({
counter,
secret: account.seSecretAscii,
});
Проверка на валидността на 2FA кода, въведен от потребителя:
se2faVerified = speakeasy.hotp.verify({
counter: this.seCounter,
secret: this.seSecretAscii,
token: hotp,
});
3 Изпращане на 2FA код
За изпращане на 2FA кода можете да използвате API на узла в блокчейна, библиотеката JS API или конзолата. В този пример използваме конзолата — Command Line Interface, инструмент, който улеснява взаимодействието с блокчейна. За да изпратите съобщение с 2FA кода, трябва да използвате командата send message в конзолата.
const util = require('util');
const exec = util.promisify(require('child_process').exec);
…
const command = `adm send message ${adamantAddress} "2FA код: ${hotp}"`;
let { error, stdout, stderr } = await exec(command);
Алтернативен начин за изпращане на съобщения — използвайте метода send в JS API библиотеката.
4 Интерфейс на потребителя
На потребителя трябва да се предостави възможност да въведе 2FA кода, което може да бъде направено по различни начини, в зависимост от платформата на вашето приложение. В нашия пример това е Vue.

Изходният код на демонстрационното приложение за двуфакторна автентикация в блокчейн може да се види в . В Readme има линк към Live demo, за да опитате.
Източник: habr.com
