Wiadomości SMS to najpopularniejsza metoda uwierzytelniania dwuskładnikowego (2FA). Wykorzystują go banki, portfele elektroniczne i kryptograficzne, skrzynki pocztowe i wszelkiego rodzaju usługi;
Jestem oburzony takim scenariuszem, bo ta metoda jest niebezpieczna. Przenoszenie numeru z jednej karty SIM na drugą rozpoczęło się na początku ery mobilnej - w ten sposób numer jest przywracany w przypadku utraty karty SIM. „Specjaliści od kradzieży pieniędzy cyfrowych” zdali sobie sprawę, że opcja „przepisz kartę SIM” może zostać wykorzystana w oszukańczych planach. Przecież ten, kto kontroluje kartę SIM, może kontrolować cudzą bankowość internetową, portfele elektroniczne, a nawet kryptowalutę. A numer innej osoby można przejąć w drodze przekupstwa pracownika telekomunikacyjnego, podstępu lub podrobienia dokumentów.
Odkryto tysiące przypadków wymiany karty SIM, jak nazywa się ten schemat oszustwa. Skala katastrofy sugeruje, że świat wkrótce odejdzie od 2FA poprzez SMS. Ale tak się nie dzieje - w
Proponujemy skorzystanie z bezpiecznej metody 2FA z dostarczaniem kodów jednorazowych poprzez blockchain, a my podpowiemy w jaki sposób właściciel usługi może ją podłączyć.
Liczba idzie w miliony
Według londyńskiej policji w 2019 r. liczba oszustw związanych z zamianą kart SIM wzrosła o 63%, a „średni rachunek” atakującego wyniósł 4,000 funtów. W Rosji nie znalazłem żadnych statystyk, ale zakładam, że są jeszcze gorsze.
Zamiana kart SIM służy do kradzieży popularnych kont na Twitterze, Instagramie, Facebooku, kontach VK, kontach bankowych, a ostatnio nawet kryptowalutach -
W maju Biuro Prokuratora Amerykańskiego dla Wschodniego Okręgu Michigan
Zdjęcie Joela Ortiza na uniwersyteckiej konferencji prasowej. Dwa lata później zostanie zatrzymany za oszustwa internetowe.
Jak działa wymiana karty SIM
„Zamiana” oznacza wymianę. We wszystkich tego typu schematach przestępcy przejmują numer telefonu ofiary, zwykle poprzez ponowne wydanie karty SIM, i wykorzystują go do resetowania hasła. Typowa wymiana karty SIM w teorii wygląda następująco:
- Agencja Wywiadowcza. Oszuści zdobywają dane osobowe ofiary: imię i nazwisko oraz numer telefonu. Można je znaleźć w otwartych źródłach (sieci społecznościowe, znajomi) lub otrzymać od wspólnika - pracownika operatora komórkowego.
- Bloking. Karta SIM ofiary jest dezaktywowana; Aby to zrobić, wystarczy zadzwonić do pomocy technicznej dostawcy, podać numer i powiedzieć, że telefon zaginął.
- Przechwyć, przenieś numer na kartę SIM. Zwykle odbywa się to również za pośrednictwem wspólnika firmy telekomunikacyjnej lub poprzez fałszowanie dokumentów.
W prawdziwym życiu sytuacja jest jeszcze poważniejsza. Atakujący codziennie wybierają ofiarę, a następnie śledzą lokalizację telefonu – jedno żądanie otrzymania informacji, że abonent przeszedł na roaming, kosztuje 1-2 centy. Gdy tylko właściciel karty SIM wyjedzie za granicę, negocjuje z menadżerem w sklepie komunikacyjnym wydanie nowej karty SIM. Kosztuje to około 50 dolarów (znalazłem informacje – w różnych krajach i u różnych operatorów od 20 do 100 dolarów), a w najgorszym przypadku menadżer zostanie zwolniony – nie ma za to żadnej odpowiedzialności.
Teraz wszystkie SMS-y zostaną odebrane przez atakujących, a właściciel telefonu nie będzie mógł nic z tym zrobić – przebywa za granicą. Następnie złoczyńcy uzyskują dostęp do wszystkich kont ofiary i w razie potrzeby zmieniają hasła.
Szanse na odzyskanie skradzionego mienia
Banki czasami łagodzą ofiary w połowie i wycofują przelewy ze swoich rachunków. Dlatego możliwy jest zwrot pieniędzy fiducjarnych nawet w przypadku nie odnalezienia przestępcy. Ale w przypadku portfeli kryptowalutowych wszystko jest bardziej skomplikowane – i techniczniei legislacyjne. Jak dotąd żadna giełda/portfel nie wypłaciła odszkodowania ofiarom swapów.
Jeśli ofiary chcą bronić swoich pieniędzy w sądzie, obwiniają operatora: stworzył warunki do kradzieży pieniędzy z konta. Dokładnie to zrobiłem
Jak dotąd żadne państwo nie ma działających programów prawnych chroniących właścicieli kryptowalut. Nie da się ubezpieczyć kapitału ani otrzymać rekompensaty za jego utratę. Dlatego zapobieganie atakowi typu swap jest łatwiejsze niż radzenie sobie z jego konsekwencjami. Najbardziej oczywistym sposobem jest użycie bardziej niezawodnego „drugiego czynnika” dla 2FA.
Wymiana karty SIM to nie jedyny problem z 2FA przez SMS
Kody potwierdzające w wiadomościach SMS są również niebezpieczne z technicznego punktu widzenia. Wiadomości mogą zostać przechwycone z powodu niezałatanych luk w zabezpieczeniach systemu sygnalizacyjnego 7 (SS7). 2FA przez SMS jest oficjalnie uznawane za niebezpieczne (tak stwierdza amerykański Narodowy Instytut Standardów i Technologii w swoim dokumencie).
Jednocześnie obecność 2FA często daje użytkownikowi poczucie fałszywego bezpieczeństwa i wybiera prostsze hasło. Dlatego takie uwierzytelnienie nie utrudnia, ale ułatwia atakującemu uzyskanie dostępu do konta.
Często SMS-y docierają z dużym opóźnieniem lub w ogóle nie docierają.
Inne metody 2FA
Oczywiście światło nie zbiegło się w smartfonach i SMS-ach. Istnieją inne metody 2FA. Na przykład jednorazowe kody TAN: metoda prymitywna, ale działa - w niektórych bankach nadal jest stosowana. Istnieją systemy wykorzystujące dane biometryczne: odciski palców, skany siatkówki. Kolejną opcją, która wydaje się rozsądnym kompromisem pod względem wygody, niezawodności i ceny, są specjalne aplikacje dla 2FA: RSA Token, Google Authenticator. Istnieją również klucze fizyczne i inne metody.
W teorii wszystko wygląda logicznie i niezawodnie. Jednak w praktyce nowoczesne rozwiązania 2FA mają problemy i przez to rzeczywistość odbiega od oczekiwań.
Według
Użytkownicy wiele metod 2FA kojarzą z obawą utraty dostępu. Klucz fizyczny lub lista haseł TAN może zostać zgubiona lub skradziona. Osobiście mam złe doświadczenia z Google Authenticatorem. Zepsuł mi się pierwszy smartfon z tą aplikacją - doceńcie moje wysiłki w przywróceniu dostępu do moich kont. Kolejnym problemem jest przejście na nowe urządzenie. Google Authenticator nie ma opcji eksportu ze względów bezpieczeństwa (jeśli można wyeksportować klucze, jakie są zabezpieczenia?). Kiedyś niosłem klucze ręcznie, a potem stwierdziłem, że łatwiej będzie mi stary smartfon zostawić w pudełku na półce.
Metoda 2FA powinna być:
- Bezpieczne - tylko Ty, a nie atakujący, powinieneś uzyskać dostęp do Twojego konta
- Niezawodny – dostęp do swojego konta masz wtedy, kiedy tego potrzebujesz
- Wygodnie i przystępnie – korzystanie z 2FA jest przejrzyste i zajmuje minimum czasu
- Tani
Wierzymy, że blockchain jest właściwym rozwiązaniem.
Użyj 2FA na blockchainie
Dla użytkownika 2FA na blockchainie wygląda tak samo, jak otrzymywanie jednorazowych kodów poprzez SMS. Jedyną różnicą jest kanał dostawy. Sposób uzyskania kodu 2FA zależy od tego, co oferuje blockchain. W naszym projekcie (informacja jest w moim profilu) jest to aplikacja internetowa, Tor, iOS, Android, Linux, Windows, MacOS.
Usługa generuje jednorazowy kod i wysyła go do komunikatora na blockchainie. Następnie postępuj zgodnie z klasyką: użytkownik wpisuje otrzymany kod w interfejsie usługi i loguje się.
Artykuł
- Jedno kliknięcie, aby utworzyć konto - bez telefonów i e-maili.
- Wszystkie wiadomości z kodami 2FA są szyfrowane metodą End-to-End curve25519xsalsa20poly1305.
- Atak MITM jest wykluczony - każda wiadomość z kodem 2FA jest transakcją na blockchainie i jest podpisana przez Ed25519 EdDSA.
- Wiadomość z kodem 2FA trafia do osobnego bloku. Nie można skorygować kolejności i znacznika czasu bloków, a tym samym kolejności komunikatów.
- Nie ma centralnej struktury sprawdzającej „autentyczność” wiadomości. Odbywa się to poprzez rozproszony system węzłów oparty na konsensusie i jest własnością użytkowników.
- Nie można wyłączyć - nie można blokować kont ani usuwać wiadomości.
- Uzyskaj dostęp do kodów 2FA z dowolnego urządzenia w dowolnym momencie.
- Potwierdzenie dostarczenia wiadomości kodem 2FA. Serwis wysyłający hasło jednorazowe wie na pewno, że zostało ono dostarczone. Brak przycisków „Wyślij ponownie”.
Aby porównać z innymi metodami 2FA, stworzyłem tabelę:
Użytkownik otrzymuje konto w komunikatorze blockchain, aby w ciągu sekundy otrzymać kody – do logowania wykorzystywane jest jedynie hasło. Dlatego sposoby składania wniosków mogą być różne: możesz używać jednego konta do otrzymywania kodów na wszystkie usługi lub możesz utworzyć osobne konto dla każdej usługi.
Jest też niedogodność – na koncie musi znajdować się przynajmniej jedna transakcja. Aby użytkownik otrzymał zaszyfrowaną wiadomość z kodem, trzeba znać jego klucz publiczny, a pojawia się on w blockchainie dopiero przy pierwszej transakcji. W ten sposób udało nam się z tego wyjść: daliśmy im możliwość otrzymania darmowych tokenów do swojego portfela. Jednak lepszym rozwiązaniem jest nadanie kontu nazwy klucza publicznego. (Dla porównania mamy numer konta U1467838112172792705 jest pochodną klucza publicznego cc1ca549413b942029c4742a6e6ed69767c325f8d989f7e4b71ad82a164c2ada. Dla komunikatora jest to wygodniejsze i czytelniejsze, natomiast dla systemu wysyłania kodów 2FA jest to ograniczenie). Myślę, że w przyszłości ktoś podejmie taką decyzję i przeniesie „Wygodę i Dostępność” do zielonej strefy.
Cena przesłania kodu 2FA jest naprawdę niska - 0.001 ADM, obecnie wynosi 0.00001 USD. Ponownie możesz podnieść swój blockchain i obniżyć cenę do zera.
Jak podłączyć 2FA na blockchainie do swojej usługi
Mam nadzieję, że udało mi się zainteresować kilku czytelników możliwością dodania autoryzacji blockchain do swoich usług.
Opowiem Ci jak to zrobić na przykładzie naszego komunikatora i analogicznie możesz zastosować inny blockchain. W aplikacji demonstracyjnej 2FA używamy postgresql10 do przechowywania informacji o koncie.
Etapy połączenia:
- Utwórz konto na blockchainie, z którego będziesz wysyłać kody 2FA. Otrzymasz hasło, które służy jako klucz prywatny do szyfrowania wiadomości z kodami i podpisywania transakcji.
- Dodaj skrypt do swojego serwera, aby wygenerować kody 2FA. Jeśli korzystasz już z innej metody 2FA z jednorazowym dostarczaniem hasła, ten krok już wykonałeś.
- Dodaj skrypt do swojego serwera, aby wysyłać kody do użytkownika w komunikatorze blockchain.
- Utwórz interfejs użytkownika do wysyłania i wprowadzania kodu 2FA. Jeśli korzystasz już z innej metody 2FA z jednorazowym dostarczaniem hasła, ten krok już wykonałeś.
1 Założenie konta
Utworzenie konta w blockchainie oznacza wygenerowanie klucza prywatnego, klucza publicznego i pochodnego adresu konta.
Najpierw generowane jest hasło BIP39, z którego obliczany jest skrót SHA-256. Hash służy do generowania klucza prywatnego ks i klucza publicznego kp. Z klucza publicznego, używając tego samego SHA-256 z inwersją, uzyskujemy adres w blockchainie.
Jeżeli chcesz każdorazowo wysyłać kody 2FA z nowego konta, konieczne będzie dodanie kodu założenia konta na serwer:
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 demo uprościliśmy to - założyliśmy jedno konto w aplikacji webowej i z niego wysyłaliśmy kody. W większości przypadków jest to również wygodniejsze dla użytkownika: wie, że usługa wysyła kody 2FA z konkretnego konta i może je nazwać.
2 Generowanie kodów 2FA
Dla każdego logowania użytkownika należy wygenerować kod 2FA. Korzystamy z biblioteki
const hotp = speakeasy.hotp({
counter,
secret: account.seSecretAscii,
});
Sprawdzanie ważności wprowadzonego przez użytkownika kodu 2FA:
se2faVerified = speakeasy.hotp.verify({
counter: this.seCounter,
secret: this.seSecretAscii,
token: hotp,
});
3 Wysyłanie kodu 2FA
Aby przesłać kod 2FA, możesz skorzystać z interfejsu API węzła blockchain, biblioteki JS API lub konsoli. W tym przykładzie korzystamy z konsoli – jest to Command Line Interface, narzędzie ułatwiające interakcję z blockchainem. Aby wysłać wiadomość z kodem 2FA należy użyć komendy send message
konsole.
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);
Alternatywnym sposobem wysyłania wiadomości jest użycie metody send
w bibliotece API JS.
4 Interfejs użytkownika
Użytkownik musi mieć możliwość wprowadzenia kodu 2FA. Można to zrobić na różne sposoby, w zależności od platformy aplikacji. W naszym przykładzie jest to Vue.
Kod źródłowy aplikacji demonstracyjnej uwierzytelniania dwuskładnikowego typu blockchain można obejrzeć pod adresem
Źródło: www.habr.com