Преминете към безопасна 2FA на блокчейна

SMS съобщенията са един от най-популярните методи за двуфакторна автентикация (2FA). Те се използват от банки, електронни и криптовалутни портфейли, пощенски кутии и различни услуги; броят на потребителите на този метод приближава 100%.

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

Преминете към безопасна 2FA на блокчейна

Разкрити са хиляди епизоди на 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 млн. в криптовалути.

Преминете към безопасна 2FA на блокчейна
Снимка на Джоел Ортиз от пресконференция в университета. След две години той ще бъде арестуван за кибермошеничество.

Принцип на работа на SIM-свопинга

«Свопинг» означава размяна. Във всички подобни схеми престъпниците присвояват телефонния номер на жертвата, обикновено чрез повторно издаване на SIM-карта, и го използват за нулиране на паролата. Типичният SIM-свопинг в теорията изглежда така:

  1. Разузнаване. Мошениците научават лични данни за жертвата: име и телефон. Те могат да бъдат намерени в открити източници (социални мрежи, приятели) или получени от съучастник – служител на мобилния оператор.
  2. Блокиране. SIM-картата на жертвата се деактивира; за това е достатъчно да се обадите в техническата поддръжка на оператора, да съобщите номера и да кажете, че телефонът е загубен.
  3. Захващане, прехвърляне на номера към собствената му сим-карта. Обикновено това също се прави чрез съучастник в телекомуникационната компания или с помощта на фалшифицирани документи.

В реалния живот всичко е още по-сурово. Престъпниците избират жертва, а след това ежедневно проследяват местоположението на телефона – едно запитване за информация, че абонатът е преминал в роуминг, струва 1-2 цента. В момента, в който собственикът на сим-картата замине в чужбина, те се договарят с мениджър в магазина за връщане на нова сим-карта. Цената е около 50 $ (намерих информация – в различни страни и при различни оператори от 20 до 100 $), като мениджърът в най-лошия случай ще бъде уволнен – за това няма отговорност.

Сега всички СМС съобщения ще получават злосторниците, а собственикът на телефона няма да може да направи нищо по въпроса – той е в чужбина. А след това злодеите получават достъп до всички акаунти на жертвата и при желание променят паролите.

Шансове за възстановяване на откраднатото

Банките понякога помагат на жертвите и отменят преводи от техните сметки. Затова е възможно да се върнат фиатните пари, дори ако престъпникът не бъде намерен. Но с криптовалутните портфейли е по-сложно – както технически, така и законодателно. До момента нито една борса/портфейл не е изплатила обезщетения на жертвите на свопинга.

Ако пострадалите искат да защитят парите си в съда, те обвиняват оператора: той е създал условия за кражбата на пари от сметката. Именно така постъпи Майкъл Терпин, който загуби 224 милиона долара заради свопинга. В момента той съди телекомуникационната компания AT&T.

Преминете към безопасна 2FA на блокчейна

В момента нито една държава не разполага с работни схеми, за да законодателно защити собствениците на криптовалути. Невъзможно е да застраховате капитала си или да получите компенсация за неговата загуба. Затова предотвратяването на атаката на свопинг е по-лесно, отколкото да се борите с последствията от нея. Най-очевидният начин е да се използва по-надежден "втори фактор" за 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 кодове бих отличил:

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

За сравнение с някои други методи 2FA съставих таблица:

Преминете към безопасна 2FA на блокчейна

Потребителят получава акаунт в блокчейн-месинджера за получаване на кодове за секунди — за вход се използва само паролата. Затова начините за приложение могат да бъдат различни: може да се използва един акаунт за получаване на кодове за всички услуги, или за всяка услуга да се създаде отделен акаунт.

Има и неудобство — акаунтът трябва да има поне една транзакция. За да получи потребителят криптирано съобщение с код, трябва да знае публичния си ключ, а той се появява в блокчейна само с първата транзакция. Ние намерихме решение: осигурихме възможност за получаване на безплатни токени в портфейла. Въпреки това, по-правилното решение е да именуваме акаунта с публичния ключ. (За сравнение, нашият номер на акаунта U1467838112172792705 е производен на публичния ключ cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. За месинджера това е по-удобно и четимо, но за системата за изпращане на 2FA-кодове — ограничение). Мисля, че в бъдеще някой ще направи такова решение и ще прехвърли 'Удобство и достъпност' в зелената зона.

Цената за изпращане на 2FA-код е реално ниска — 0.001 ADM, в момента това е 0.00001 USD. Отново, може да се създаде собствен блокчейн и да се направи цената нулева.

Как да свържете 2FA на блокчейна с вашия сервис

Надявам се, че успях да заинтересувам няколко читатели да добавят блокчейн-ауторизация на своите услуги.

Ще разкажа как да го направите на примера на нашия месинджер, а по аналогия можете да използвате и друг блокчейн. В демо-приложението 2FA използваме postgresql10 за съхранение на информация за акаунтите.

Стъпки за свързване:

  1. Създайте акаунт в блокчейна, от който ще изпращате кодовете 2FA. Ще получите парола, която се използва като частен ключ за криптиране на съобщенията с кодове и за подписване на транзакции.
  2. Добавете на вашия сървър скрипт за генериране на кодове 2FA. Ако вече използвате някой друг метод 2FA с доставка на еднократни пароли, тази стъпка вече е изпълнена.
  3. Добавете на вашия сървър скрипт за изпращане на кодове на потребителя в блокчейн месинджър.
  4. Създайте потребителски интерфейс за изпращане и въвеждане на кода 2FA. Ако вече използвате друг метод 2FA с доставка на еднократни пароли, тази стъпка вече е завършена.

1 Създаване на акаунт

Създаването на акаунт в блокчейн включва генериране на частен ключ, публичен ключ и производен адрес на акаунта.

Преминете към безопасна 2FA на блокчейна

Първо се генерира пасфраза 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 кодове от конкретен акаунт и може да го именува.

Преминете към безопасна 2FA на блокчейна

2 Генерация на 2FA кодове

Код 2FA трябва да бъде генериран за всяко влизане на потребителя. Използваме библиотеката speakeasy, но можете да изберете всяка друга.

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.

Преминете към безопасна 2FA на блокчейна

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

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster