СМС-паведамленні - папулярны спосаб двухфактарнай аўтэнтыфікацыі (2FA). Яе выкарыстоўваюць банкі, электронныя і крыпта-кашалькі, паштовыя скрыні і ўсялякія сэрвісы;
У мяне такі расклад падзей выклікае абурэнне, бо гэты метад небяспечны. Пераназначаць нумар з адной SIM-карты на іншую сталі яшчэ ў пачатку мабільнай эры - так аднаўляюць нумар пры страце сімкі. "Спецыялісты па адабранні лічбавых грошай" усвядомілі: опцыю "перазапісу сімкі" можна выкарыстоўваць у ашуканскіх схемах. Бо той, хто кантралюе сім-карту, можа кіраваць і чужым анлайн-банкінгам, і электроннымі кашалькамі, і нават криптовалютой. А завалодаць нумарам іншай асобы можна праз подкуп супрацоўніка тэлекома, з дапамогай падману ці падробленых дакументаў.
Раскрыты тысячы эпізодаў SIM-свопінгу - так назвалі гэтую схему махлярства. Маштабы бедства гавораць аб тым, што хутка свет адмовіцца ад 2FA па СМС. Але гэтага не адбываецца - у
Мы прапануем выкарыстоўваць бяспечны метад 2FA з дастаўкай аднаразовых кодаў праз блокчейн, і раскажам, як уладальніку сэрвісу яго падлучыць.
Рахунак ідзе на мільёны
У 2019 годзе махлярства SIM-свопінгам вырасла на 63% па дадзеных лонданскай паліцыі, а "сярэдні чэк" зламысніка – 4,000 GBP. Статыстыкі ў Расіі я не знайшоў, аднак мяркую, што яна яшчэ горшая.
SIM-свопінг выкарыстоўваецца для крадзяжу папулярных акаўнтаў Twitter, Instagram, Facebook, VK, банкаўскіх акаўнтаў, а нядаўна дабраліся і да криптовалют.
У траўні пракуратура ЗША ва ўсходняй акрузе Мічыгана
Фота Джоэла Ортыза на прэс-канферэнцыі ва ўніверсітэце. Праз два гады ён будзе затрыманы за кібермахлярства.
Прынцып працы SIM-свопінгу
"Свопінг" - значыць абмен. Ва ўсіх падобных схемах злачынцы прысвойваюць сабе тэлефонны нумар ахвяры, звычайна праз перавыпуск SIM-карты, і карыстаюцца ім для скіду пароля. Тыповы SIM-свопінг у тэорыі выглядае так:
- Разведка. Ашуканцы даведаюцца персанальныя дадзеныя ахвяры: імя і тэлефон. Іх можна знайсці ў адкрытых крыніцах (сацсеткі, сябры) або атрымаць ад супольніка - супрацоўніка сотавага аператара.
- Блакаванне. SIM-карта ахвяры дэактывуецца; для гэтага дастаткова патэлефанаваць у тэхпадтрымку правайдэра, паведаміць нумар і сказаць, што тэлефон быў страчаны.
- Захоп, перавод нумара на сваю сімку. Звычайна гэта таксама робіцца праз саўдзельніка ў тэлекам-кампаніі або з дапамогай падробкі дакументаў.
У рэальным жыцці ўсё яшчэ больш сурова. Зламыснікі выбіраюць ахвяру, а затым штодня адсочваюць месцазнаходжанне тэлефона - адзін запыт на атрыманне інфармацыі аб тым, што абанент перайшоў у роўмінг каштуе 1-2 цэнты. Як толькі ўладальнік сім-карты з'ехаў за мяжу, яны дамаўляюцца з мэнэджэрам у салоне сувязі на выдачу новай сім-карты. Варта гэта каля $50 (я знаходзіў інфармацыю - у розных краінах і ў розных аператараў ад $20 да $100), пры гэтым менеджэр у горшым выпадку будзе звольнены - за гэта няма адказнасці.
Цяпер усе СМС будуць атрымліваць зламыснікі, а ўладальнік тэлефона нічога не зможа з гэтым зрабіць - ён за мяжой. А далей злыдні атрымліваюць доступ да ўсіх акаўнтаў ахвяры і пры жаданні змяняюць паролі.
Шанцы вярнуць скрадзенае
Банкі часам ідуць насустрач ахвярам і адклікаюць пераводы з іх рахункаў. Таму вярнуць фіятныя грошы ўдаецца, нават калі злачынца не знойдзены. Але з криптовалютными кашалькамі ўсё складаней - і тэхнічна, і заканадаўча. Пакуль ні адна біржа/кашалёк не выплацілі кампенсацыі ахвярам свопінгу.
Калі пацярпелыя хочуць абараніць свае грошы ў судзе, то абвінавачваюць аператара: ён стварыў умовы для крадзяжу грошай з рахунку. Менавіта так зрабіў
Пакуль ні ў адной дзяржавы няма працоўных схем, каб заканадаўча абараніць уладальнікаў криптовалют. Застрахаваць свой капітал ці атрымаць кампенсацыю за яго страту немагчыма. Таму прадухіліць свопінг-напад прасцей, чым змагацца з яе наступствамі. Самы відавочны спосаб – выкарыстоўваць больш надзейны "другі фактар" для 2FA.
SIM-свопінг - не адзіная праблема 2FA праз СМС
Коды пацверджання ў СМС небяспечныя і з тэхнічнага пункта гледжання. Паведамленні можна перахапіць з-за неадхільных уразлівасцяў у сігнальнай сістэме Signaling System 7 (SS7). 2FA па SMS афіцыйна прызнана небяспечнай (Нацыянальны інстытут стандартаў і тэхналогій ЗША кажа пра гэта ў сваім
Пры гэтым наяўнасць 2FA часта выклікае карыстачу пачуццё ілжывай бяспекі, і ён выбірае прасцейшы пароль. Таму такая аўтэнтыфікацыя не абцяжарвае, а палягчае доступ зламысніка да акаўнта.
А яшчэ нярэдка СМС прыходзяць з вялікай затрымкай ці не прыходзяць зусім.
Іншыя спосабы 2FA
Зразумела, на смартфонах і СМС святло клінам не сышоўся. Ёсць і іншыя спосабы 2FA. Напрыклад, аднаразовыя TAN-коды: спосаб прымітыўны, але працоўны - ён да гэтага часу выкарыстоўваецца ў некаторых банках. Ёсць сістэмы з ужываннем біяметрычных дадзеных: адбіткаў пальцаў, сканаў сятчаткі. Яшчэ адзін варыянт, які здаецца разумным кампрамісам па выгодзе, надзейнасці і кошце – спецыяльныя прыкладанні для 2FA: RSA Token, Google Authenticator. А яшчэ ёсць фізічныя ключы ды іншыя метады.
У тэорыі ўсё выглядае лагічным і надзейным. Але на практыцы ў сучасных 2FA-рашэнняў ёсць праблемы, і з-за іх рэальнасць адрозніваецца ад чаканняў.
Згодна з
Многія спосабы 2FA карыстальнікі звязваюць са страхам, што доступ будзе страчаны. Фізічны ключ або спіс TAN-пароляў можна страціць ці іх могуць выкрасці. У мяне асабіста ёсць негатыўны досвед выкарыстання Google Authenticator. Першы смартфон з гэтым дадаткам у мяне зламаўся - ацаніце мае працы па аднаўленні доступу да акаўнтаў. Іншая праблема - пераход на новую прыладу. Google Authenticator не мае магчымасці экспарту з-за меркаванняў бяспекі (калі ключы можна экспартаваць, якая тут бяспека?). Адзін раз я пераносіў ключы ўручную, а далей вырашыў, што прасцей пакідаць стары смартфон у каробцы на паліцы.
Метад 2FA павінен быць:
- Бяспечным - атрымаць доступ да акаўнта павінны толькі вы, а не зламыснікі
- Надзейным - вы атрымліваеце доступ да акаўнта заўсёды, калі гэта трэба
- Зручным і даступным – выкарыстанне 2FA зразумела і займае мінімум часу
- Танным
Мы лічым, што блокчейн - падыходнае рашэнне.
Выкарыстоўвайце 2FA на блокчейне
Для карыстача 2FA на блокчейне выглядае гэтак жа, як і атрыманне аднаразовых кодаў па СМС. Адрозненне толькі ў канале дастаўкі. Спосаб атрымання 2FA-кода залежыць ад таго, што прапануе блокчейн. У нашым праекце (інфармацыя ёсць у маім профілі) гэта Web-дадатак, Tor, iOS, Android, Linux, Windows, MacOS.
Сэрвіс генеруе аднаразовы код і пасылае яго ў мэсанджар на блокчэйне. Далей - па класіцы: карыстач уводзіць атрыманы код у інтэрфейсе сэрвісу і аўтарызуецца.
У артыкуле
- Адзін клік для стварэння акаўнта - ніякіх тэлефонаў і электронных пошт.
- Усе паведамленні з кодамі 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 library.
4 Інтэрфейс карыстальніка
Карыстальніку трэба даць магчымасць уводу кода 2FA, гэта можна зрабіць рознымі спосабамі ў залежнасці ад платформы вашага дадатку. У нашым прыкладзе гэта Vue.
Зыходны код дэманстрацыйнага прыкладання двухфактарнай аўтарызацыі на блокчейне можна паглядзець у
Крыніца: habr.com