СМС-повідомлення – найпопулярніший спосіб двофакторної аутентифікації (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