Переходьте до безпечної 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

Додати коментар або відгук