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

В момента нито едно правителство няма работещи схеми, за да законодателно защити притежателите на криптовалути. Не е възможно да застраховате капитала си или да получите компенсация за загубата му. Поради това предотвратяването на свопинг-атаката е по-лесно, отколкото да се борите с нейните последствия. Най-очевидният начин е да използвате по-надежден „втори фактор“ за 2FA.
SIM свопингът не е единственият проблем с 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 кода зависи от това, което предлага блокчейнът. В нашия проект (информацията е в моя профил) това е Web приложение, 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 code: ${hotp}"`;
let { error, stdout, stderr } = await exec(command);
Алтернативен начин за изпращане на съобщения — да се използва метод send в JS API библиотеката.
4 Потребителски интерфейс
На потребителя трябва да се позволи да въведе кода на 2FA, което може да се направи по различни начини в зависимост от платформата на вашето приложение. В нашия пример това е Vue.

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