Пераходзіце да бяспечнай 2FA на блокчейне

СМС-паведамленні - папулярны спосаб двухфактарнай аўтэнтыфікацыі (2FA). Яе выкарыстоўваюць банкі, электронныя і крыпта-кашалькі, паштовыя скрыні і ўсялякія сэрвісы; колькасць карыстальнікаў метаду набліжаецца да 100%.

У мяне такі расклад падзей выклікае абурэнне, бо гэты метад небяспечны. Пераназначаць нумар з адной SIM-карты на іншую сталі яшчэ ў пачатку мабільнай эры - так аднаўляюць нумар пры страце сімкі. "Спецыялісты па адабранні лічбавых грошай" усвядомілі: опцыю "перазапісу сімкі" можна выкарыстоўваць у ашуканскіх схемах. Бо той, хто кантралюе сім-карту, можа кіраваць і чужым анлайн-банкінгам, і электроннымі кашалькамі, і нават криптовалютой. А завалодаць нумарам іншай асобы можна праз подкуп супрацоўніка тэлекома, з дапамогай падману ці падробленых дакументаў.

Пераходзіце да бяспечнай 2FA на блокчейне

Раскрыты тысячы эпізодаў SIM-свопінгу - так назвалі гэтую схему махлярства. Маштабы бедства гавораць аб тым, што хутка свет адмовіцца ад 2FA па СМС. Але гэтага не адбываецца - у даследаванні расказваюць, што выбіраюць метад 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.

SIM-свопінг - не адзіная праблема 2FA праз СМС

Коды пацверджання ў СМС небяспечныя і з тэхнічнага пункта гледжання. Паведамленні можна перахапіць з-за неадхільных уразлівасцяў у сігнальнай сістэме Signaling System 7 (SS7). 2FA па SMS афіцыйна прызнана небяспечнай (Нацыянальны інстытут стандартаў і тэхналогій ЗША кажа пра гэта ў сваім Кіраўніцтве па лічбавай аўтэнтыфікацыі).

Пры гэтым наяўнасць 2FA часта выклікае карыстачу пачуццё ілжывай бяспекі, і ён выбірае прасцейшы пароль. Таму такая аўтэнтыфікацыя не абцяжарвае, а палягчае доступ зламысніка да акаўнта.

А яшчэ нярэдка СМС прыходзяць з вялікай затрымкай ці не прыходзяць зусім.

Іншыя спосабы 2FA

Зразумела, на смартфонах і СМС святло клінам не сышоўся. Ёсць і іншыя спосабы 2FA. Напрыклад, аднаразовыя TAN-коды: спосаб прымітыўны, але працоўны - ён да гэтага часу выкарыстоўваецца ў некаторых банках. Ёсць сістэмы з ужываннем біяметрычных дадзеных: адбіткаў пальцаў, сканаў сятчаткі. Яшчэ адзін варыянт, які здаецца разумным кампрамісам па выгодзе, надзейнасці і кошце – спецыяльныя прыкладанні для 2FA: RSA Token, Google Authenticator. А яшчэ ёсць фізічныя ключы ды іншыя метады.

У тэорыі ўсё выглядае лагічным і надзейным. Але на практыцы ў сучасных 2FA-рашэнняў ёсць праблемы, і з-за іх рэальнасць адрозніваецца ад чаканняў.

Згодна з даследаванню, выкарыстанне 2FA з'яўляецца нязручнасцю ў прынцыпе, а папулярнасць 2FA па СМС тлумачаць "меншай нязручнасцю ў параўнанні з іншымі метадамі" – атрыманне аднаразовых кодаў зразумела для карыстальніка.

Многія спосабы 2FA карыстальнікі звязваюць са страхам, што доступ будзе страчаны. Фізічны ключ або спіс TAN-пароляў можна страціць ці іх могуць выкрасці. У мяне асабіста ёсць негатыўны досвед выкарыстання Google Authenticator. Першы смартфон з гэтым дадаткам у мяне зламаўся - ацаніце мае працы па аднаўленні доступу да акаўнтаў. Іншая праблема - пераход на новую прыладу. Google Authenticator не мае магчымасці экспарту з-за меркаванняў бяспекі (калі ключы можна экспартаваць, якая тут бяспека?). Адзін раз я пераносіў ключы ўручную, а далей вырашыў, што прасцей пакідаць стары смартфон у каробцы на паліцы.

Метад 2FA павінен быць:

  • Бяспечным - атрымаць доступ да акаўнта павінны толькі вы, а не зламыснікі
  • Надзейным - вы атрымліваеце доступ да акаўнта заўсёды, калі гэта трэба
  • Зручным і даступным – выкарыстанне 2FA зразумела і займае мінімум часу
  • Танным

Мы лічым, што блокчейн - падыходнае рашэнне.

Выкарыстоўвайце 2FA на блокчейне

Для карыстача 2FA на блокчейне выглядае гэтак жа, як і атрыманне аднаразовых кодаў па СМС. Адрозненне толькі ў канале дастаўкі. Спосаб атрымання 2FA-кода залежыць ад таго, што прапануе блокчейн. У нашым праекце (інфармацыя ёсць у маім профілі) гэта Web-дадатак, 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 трэба генераваць для кожнага ўваходу карыстальніка. Мы выкарыстоўваем бібліятэку бар, дзе незаконна гандлююць спіртнымі напоямі, Але вы можаце выбраць любую іншую.

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 library.

4 Інтэрфейс карыстальніка

Карыстальніку трэба даць магчымасць уводу кода 2FA, гэта можна зрабіць рознымі спосабамі ў залежнасці ад платформы вашага дадатку. У нашым прыкладзе гэта Vue.

Пераходзіце да бяспечнай 2FA на блокчейне

Зыходны код дэманстрацыйнага прыкладання двухфактарнай аўтарызацыі на блокчейне можна паглядзець у GitHub. У Readme ёсць спасылка на Live demo, каб паспрабаваць.

Крыніца: habr.com

Дадаць каментар