SMS to jest najpopularniejszy sposób na dwuskładnikowe uwierzytelnienie (2FA). Korzystają z niego banki, portfele elektroniczne i kryptowalutowe, skrzynki pocztowe oraz różne serwisy; .
Taki obrót spraw budzi moje oburzenie, ponieważ ta metoda jest niebezpieczna. Przenoszenie numeru z jednej karty SIM na drugą rozpoczęło się już na początku ery mobilnej - tak przywraca się numer po utracie karty SIM. "Specjaliści od kradzieży cyfrowych pieniędzy" zrozumieli, że opcję "przenoszenia SIM" można wykorzystać w schematach oszustw. Kto kontroluje kartę SIM, ten może zarządzać zarówno cudzym bankowością online, jak i portfelami elektronicznymi, a nawet kryptowalutami. A zdobycie numeru innej osoby można osiągnąć przez przekupstwo pracownika telekomunikacji, oszustwo lub fałszywe dokumenty.

Odkryto tysiące przypadków SIM swappingu - tak nazwano ten schemat oszustwa. Rozmiary katastrofy sugerują, że świat wkrótce zrezygnuje z 2FA przez SMS. Ale tak się nie dzieje - w mówi się, że metodę 2FA wybierają nie użytkownicy, a właściciele serwisów.
Proponujemy użycie bezpiecznej metody 2FA z dostarczaniem jednorazowych kodów przez blockchain, i opowiemy, jak właściciel serwisu może to wdrożyć.
Gry toczy się o miliony
W 2019 roku oszustwa związane z SIM swappingiem wzrosły o 63% według danych londyńskiej policji, a "średni zysk" oszusta wyniósł 4000 GBP. Statystyk w Rosji nie znalazłem, ale przypuszczam, że jest jeszcze gorzej.
SIM swapping jest wykorzystywany do kradzieży popularnych kont na Twitterze, Instagramie, Facebooku, VK, kont bankowych, a niedawno dotarli również do kryptowalut - według słów przedsiębiorcy bitcoinowego Jobiego Wiksa. Głośne sprawy kradzieży kryptowalut za pomocą SIM swappingu pojawiają się w prasie od 2016 roku; na 2019 rok przypadł prawdziwy szczyt.
W maju prokuratura USA w wschodnim okręgu Michigan dziewięciu młodym ludziom w wieku od 19 do 26 lat: rzekomo należą oni do hakerskiej grupy nazwanej "The Community". Grupie przypisano siedem ataków na swap, w wyniku których hakerzy przywłaszczyli kryptowalutę o wartości przekraczającej 2,4 miliona dolarów. A w kwietniu student z Kalifornii Joel Ortiz otrzymał 10 lat więzienia za SIM swapping; jego zdobyczą były kryptowaluty o wartości 7,5 mln dolarów.

Zdjęcie Joela Ortiza na konferencji prasowej na uniwersytecie. Dwa lata później zostanie aresztowany za oszustwa internetowe.
Zasada działania SIM swapingu
„Swap” oznacza wymianę. W takich schematach przestępcy przywłaszczają sobie numer telefonu ofiary, zazwyczaj przez ponowną wydanie karty SIM, i używają go do resetowania hasła. Typowy SIM swapping teoretycznie wygląda tak:
- Wywiad. Oszuści poznają dane osobowe ofiary: imię i numer telefonu. Można je znaleźć w publicznych źródłach (media społecznościowe, znajomi) lub otrzymać od wspólnika - pracownika operatora telefonii komórkowej.
- Blokada. Karta SIM ofiary zostaje dezaktywowana; wystarczy zadzwonić do obsługi klienta dostawcy, podać numer i powiedzieć, że telefon został zgubiony.
- Przechwycenie, przeniesienie numeru na swoją kartę SIM. Zazwyczaj również odbywa się to za pośrednictwem wspólnika w firmie telekomunikacyjnej lub za pomocą podrobionych dokumentów.
W rzeczywistości wszystko jest jeszcze trudniejsze. Złodzieje wybierają ofiarę, a następnie codziennie śledzą lokalizację telefonu - jeden wniosek o uzyskanie informacji, że abonent przeszedł w roaming, kosztuje 1-2 centy. Gdy właściciel karty SIM wyjeżdża za granicę, umawiają się z menedżerem w punkcie sprzedaży na wydanie nowej karty SIM. Kosztuje to około 50 USD (znalazłem informacje - w różnych krajach i u różnych operatorów od 20 do 100 USD), przy czym menedżer w najgorszym przypadku zostanie zwolniony - nie ponosi za to odpowiedzialności.
Teraz wszystkie SMS-y będą otrzymywać przestępcy, a właściciel telefonu nie będzie mógł nic z tym zrobić - jest za granicą. Następnie złodzieje uzyskują dostęp do wszystkich kont ofiary i w razie potrzeby zmieniają hasła.
Szanse na odzyskanie skradzionych środków
Banki czasami wychodzą naprzeciw ofiarom i anulują przelewy z ich kont. Dlatego możliwe jest odzyskanie pieniędzy fiat, nawet jeśli przestępca nie zostanie znaleziony. Ale w przypadku portfeli kryptowalutowych jest to bardziej skomplikowane - zarówno technicznie, jak i prawnie. Do tej pory żadna giełda/portfel nie wypłaciła odszkodowań ofiarom swapingu.
Jeśli poszkodowani chcą dochodzić swoich pieniędzy w sądzie, oskarżają operatora: stworzył warunki do kradzieży pieniędzy z konta. Tak właśnie postąpił , który stracił z powodu swapingu 224 mln USD. Obecnie sądzi się z firmą telekomunikacyjną AT&T.

Jak dotąd żaden kraj nie ma skutecznych mechanizmów, aby prawnie chronić właścicieli kryptowalut. Niemożliwe jest ubezpieczenie swojego kapitału lub uzyskanie odszkodowania za jego utratę. Dlatego łatwiej jest zapobiec atakowi swapingowemu, niż walczyć z jego konsekwencjami. Najbardziej oczywistym sposobem jest użycie bardziej niezawodnego „drugiego czynnika” dla 2FA.
SIM swapping nie jest jedynym problemem 2FA przez SMS.
Kody potwierdzające w SMS-ach są niebezpieczne i z technicznego punktu widzenia. Wiadomości można przechwycić z powodu nieusuwalnych luk w systemie sygnalizacji Signaling System 7 (SS7). 2FA przez SMS jest oficjalnie uznawana za niebezpieczną (Narodowy Instytut Standardów i Technologii USA mówi o tym w swoim ).
Przy tym obecność 2FA często wprowadza użytkownika w fałszywe poczucie bezpieczeństwa, co sprawia, że wybiera prostsze hasło. Dlatego taka autoryzacja nie utrudnia, a ułatwia dostęp cyberprzestępcy do konta.
Ponadto wiadomości SMS często przychodzą z dużym opóźnieniem lub w ogóle nie przychodzą.
Inne metody 2FA.
Oczywiście, telefony komórkowe i SMS-y nie są jedynymi sposobami. Istnieją również inne metody 2FA. Na przykład jednorazowe kody TAN: metoda prymitywna, ale działająca — wciąż jest stosowana w niektórych bankach. Są systemy korzystające z danych biometrycznych: odcisków palców, skanów tęczówki. Inna opcja, która wydaje się rozsądnym kompromisem pomiędzy wygodą, niezawodnością a kosztami — specjalne aplikacje do 2FA: RSA Token, Google Authenticator. Są również fizyczne klucze i inne metody.
Teoretycznie wszystko wydaje się logiczne i niezawodne. Jednak w praktyce nowoczesne rozwiązania 2FA mają problemy, przez co rzeczywistość różni się od oczekiwań.
Zgodnie z , korzystanie z 2FA jest ogólnie uciążliwe, a popularność 2FA przez SMS tłumaczy się „mniejszym niedogodnością w porównaniu do innych metod” — otrzymywanie jednorazowych kodów jest zrozumiałe dla użytkownika.
Wiele metod 2FA użytkownicy kojarzą z obawą o utratę dostępu. Fizyczny klucz lub lista kodów TAN może zostać zgubiona lub skradziona. Osobiście miałem negatywne doświadczenia z używaniem Google Authenticator. Mój pierwszy smartfon z tą aplikacją się zepsuł — oceńcie moje starania przy odzyskiwaniu dostępu do kont. Inny problem to przesiadka na nowe urządzenie. Google Authenticator nie ma możliwości eksportu z powodów bezpieczeństwa (jeśli klucze mogą być eksportowane, gdzie tu bezpieczeństwo?). Raz przeniosłem klucze ręcznie, a potem postanowiłem, że łatwiej będzie zostawić stary smartfon w pudełku na półce.
Metoda 2FA powinna być:
- Bezpieczna — dostęp do konta powinien mieć tylko użytkownik, a nie osoby nieuprawnione.
- Niezawodna — zawsze możesz uzyskać dostęp do konta, kiedy jest to potrzebne.
- Wygodna i przystępna — korzystanie z 2FA jest jasne i zajmuje minimum czasu.
- Tania.
Uważamy, że blockchain to odpowiednie rozwiązanie.
Używaj 2FA na blockchainie.
Dla użytkownika 2FA na blockchainie wygląda tak samo jak otrzymywanie jednorazowych kodów SMS. Różnica tkwi tylko w kanale dostawy. Sposób uzyskania kodu 2FA zależy od tego, co oferuje blockchain. W naszym projekcie (informacje są w moim profilu) to aplikacja internetowa, Tor, iOS, Android, Linux, Windows, MacOS.
Usługa generuje jednorazowy kod i wysyła go do komunikatora na blockchainie. Dalej — zgodnie z klasycznym schematem: użytkownik wprowadza otrzymany kod w interfejsie usługi i się autoryzuje.

W artykule Napisałem, że blockchain zapewnia bezpieczeństwo i prywatność przesyłania wiadomości. W kwestii wysyłania kodów 2FA wyróżnię:
- Jedno kliknięcie do założenia konta — żadnych telefonów czy adresów e-mail.
- Wszystkie wiadomości z kodami 2FA są szyfrowane End-to-End curve25519xsalsa20poly1305.
- Atak MITM jest wykluczony — każda wiadomość z kodem 2FA jest transakcją w blockchainie i jest podpisywana Ed25519 EdDSA.
- Wiadomość z kodem 2FA trafia do swojego bloku. Sekwencja i timestamp bloków nie mogą być zmienione, a więc i kolejność wiadomości.
- Nie ma centralnej struktury, która sprawdzałaby „autentyczność” wiadomości. To zadanie dla rozproszonego systemu węzłów na podstawie konsensusu, a należy on do użytkowników.
- Niemożność dezaktywacji — konta nie można zablokować, a wiadomości usunąć.
- Dostęp do kodów 2FA z każdego urządzenia w każdym momencie.
- Potwierdzenie dostarczenia wiadomości z kodem 2FA. Serwis wysyłający jednorazowy kod dokładnie wie, że został on dostarczony. Żadnych przycisków „Wyślij ponownie”.
Aby porównać z niektórymi innymi metodami 2FA, przygotowałem tabelę:

Użytkownik otrzymuje konto w blockchainowym komunikatorze do odbierania kodów niemal natychmiast — do logowania używana jest tylko fraza hasłowa. Dlatego i sposoby zastosowania mogą być różne: można używać jedno konto do odbierania kodów dla wszystkich usług, albo stworzyć osobne konto dla każdej usługi.
Jest też pewien niedogodność — konto musi mieć przynajmniej jedną transakcję. Aby użytkownik mógł otrzymać zaszyfrowaną wiadomość z kodem, trzeba znać jego klucz publiczny, który pojawia się w blockchainie dopiero przy pierwszej transakcji. My poradziliśmy sobie z tym, oferując możliwość otrzymania bezpłatnych tokenów w portfelu. Jednak bardziej właściwe rozwiązanie to nazwanie konta kluczem publicznym. (Dla porównania, nasz numer konta U1467838112172792705 jest pochodną klucza publicznego cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. Dla komunikatora jest to wygodniejsze i bardziej czytelne, jednak dla systemu wysyłania kodów 2FA to ograniczenie). Myślę, że w przyszłości ktoś stworzy takie rozwiązanie i przeniesie "Wygodę i dostępność" do zielonej strefy.
Koszt wysyłania kodu 2FA jest naprawdę niski — 0.001 ADM, obecnie to 0.00001 USD. Znowu można uruchomić własny blockchain i ustawić cenę na zero.
Jak podłączyć 2FA w blockchainie do swojej usługi
Mam nadzieję, że udało mi się zainteresować kilku czytelników, aby dodać autoryzację blockchainową do ich usług.
Opowiem, jak to zrobić na przykładzie naszego komunikatora, a analogicznie możesz użyć innego blockchaina. W aplikacji demonstracyjnej 2FA korzystamy z postgresql10 do przechowywania informacji o kontach.
Etapy podłączenia:
- Utworzyć konto w blockchainie, z którego będziesz wysyłać kody 2FA. Otrzymasz frazę hasłową, która jest używana jako klucz prywatny do szyfrowania wiadomości z kodami i do podpisywania transakcji.
- Dodać na swój serwer skrypt do generowania kodów 2FA. Jeśli już używasz jakiejkolwiek innej metody 2FA z dostarczaniem jednorazowych haseł, ten etap masz już zrealizowany.
- Dodać na swój serwer skrypt do wysyłania kodów do użytkownika w blockchainowym komunikatorze.
- Utworzyć interfejs użytkownika do wysyłania i wprowadzania kodu 2FA. Jeśli już używasz jakiejkolwiek innej metody 2FA z dostarczaniem jednorazowych haseł, ten etap masz już zrealizowany.
1 Tworzenie konta
Tworzenie konta w blockchainie polega na wygenerowaniu klucza prywatnego, klucza publicznego oraz adresu konta opartego na tych kluczach.

Najpierw generowany jest fraz BIP39, z której obliczany jest skrót SHA-256. Skrót ten służy do generacji klucza prywatnego ks oraz klucza publicznego kp. Z klucza publicznego tym samym SHA-256 z inwersją otrzymujemy adres w blockchainie.
Jeśli chcesz wysyłać kody 2FA zawsze z nowego konta, kod do utworzenia konta będzie trzeba dodać na serwerze:
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()
}W aplikacji demonstracyjnej uprościliśmy to — utworzyliśmy jedno konto w aplikacji internetowej i wysyłamy kody z niego. W większości przypadków jest to wygodniejsze dla użytkownika: wie on, że serwis wysyła kody 2FA z konkretnego konta i może je nazwać.

2 Generacja kodów 2FA
Kod 2FA należy generować dla każdego logowania użytkownika. Używamy biblioteki , ale możesz wybrać dowolną inną.
const hotp = speakeasy.hotp({
counter,
secret: account.seSecretAscii,
});
Weryfikacja poprawności kodu 2FA wprowadzonego przez użytkownika:
se2faVerified = speakeasy.hotp.verify({
counter: this.seCounter,
secret: this.seSecretAscii,
token: hotp,
});
3 Wysłanie kodu 2FA
Aby wysłać kod 2FA, można użyć API węzła blockchain, biblioteki JS API lub konsoli. W tym przykładzie używamy konsoli — to Interfejs Wiersza Poleceń, narzędzie, które ułatwia interakcję z blockchainem. Aby wysłać wiadomość z kodem 2FA, należy użyć polecenia send message konsoli.
const util = require('util');
const exec = util.promisify(require('child_process').exec);
…
const command = `adm send message ${adamantAddress} "Kod 2FA: ${hotp}"`;
let { error, stdout, stderr } = await exec(command);
Alternatywny sposób wysyłania wiadomości — użycie metody send w bibliotece JS API.
4 Interfejs użytkownika
Użytkownik powinien mieć możliwość wprowadzenia kodu 2FA, co można zrealizować na różne sposoby w zależności od platformy Twojej aplikacji. W naszym przykładzie jest to Vue.

Kod źródłowy demo aplikacji do dwuetapowej weryfikacji na blockchainie można zobaczyć w . W pliku Readme znajduje się link do Live demo, aby wypróbować.
Źródło: habr.com
