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.

Personalizzare i link condivisi su Facebook

Vi siete mai trovati a condividere un link su Facebook e voler cambiare un po’ la card di anteprima che viene mostrata assieme al post? Magari l’immagine potrebbe essere sostituita con una migliore, oppure Facebook non è riuscito a individuare correttamente il titolo della pagina e il risultato è venuto proprio male.

A me è successo parecchie volte e fino a ieri non sapevo come risolvere il problema. Finché si tratta di condividere un link su una pagina, Facebook consente di correggere titolo, descrizione e immagine. Ma se si prova a condividere un link sul proprio profilo allora non c’è un metodo del tutto esplicito per ritoccarne i dettagli.

Il link di condivisione e i parametri personalizzati

Leggendo un po’ in rete, si trovano informazioni sul cosiddetto sharer, ovvero un link che si può inserire nel proprio sito web creando un pulsante Condividi su Facebook. L’utilizzo base è molto semplice, va solo inserito l’URL:

https://www.facebook.com/sharer/sharer.php?u=http://lazza.me

Provate pure a cliccare il link e visualizzare la finestra di condivisione.

Tuttavia, qualche tempo fa si potevano inserire anche altri parametri personalizzati oltre a u, per cambiare alcuni aspetti dell’elemento condiviso:

  • p[title] → Titolo personalizzato
  • p[summary] → Descrizione personalizzata
  • p[images][0] → Immagine personalizzata

Per esempio, si poteva modificare l’esempio di prima per avere il titolo Prova e la descrizione Bella descrizione così:

https://www.facebook.com/sharer/sharer.php?u=http://lazza.me&p[title]=Prova&p[summary]=Bella+descrizione

L’articolo che ho linkato poco più su è stato pubblicato a luglio 2014 e il titolo La finestra di condivisione di Facebook non accetta più parametri personalizzati non prometteva nulla di buono.

Ho deciso di provare lo stesso a trovare una soluzione, tirando a indovinare i termini più probabili. Alla fine ho trovato dei nuovi parametri per sostituire quelli precedenti:

  • title → Titolo personalizzato
  • description → Descrizione personalizzata
  • picture → Immagine personalizzata

Il nostro esempio diventa quindi:

https://www.facebook.com/sharer/sharer.php?u=http://lazza.me&title=Prova&description=Bella+descrizione

Uno strumento per automatizzare tutto

Per dirla in modo garbato, costruirsi a mano i link in questo modo è un po’ uno stress, anche perché i parametri vanno codificati appropriatamente con il percent-encoding in quanto i caratteri speciali potrebbero causare problemi.

Ho creato un modulo facile facile che automatizza il tutto. Lo potete usare cliccando questo collegamento (potete anche trascinarlo nella barra dei segnalibri del vostro browser):

Share to Facebook with custom parameters

Per esempio, mettiamo il caso di voler condividere questo articolo di Ars Technica che parla della tecnologia Flatpak di Fedora e di come potrebbe diventare “concorrente” del formato Snap di Ubuntu. Il link condiviso normalmente su Facebook verrebbe così:

condivisione_fb_prima
Link condiviso senza modificare i dati

Per quanto io adori XKCD, non credo che quell’immagine sia proprio il massimo, e la vorrei rimpiazzare con questo bel logo di Flatpak trovato su Fedora Magazine. Già che ci sono, potrei volere correggere alcune maiuscole nel titolo e infine usare la prima frase dell’articolo come descrizione.

Devo solo inserire le informazioni nel modulo:

condivisione_fb_personalizzata
Utilizzo del modulo per creare un link personalizzato

Il risultato finale sarà esattamente come desiderato:

condivisione_fb_dopo
Link condiviso dopo aver modificato i dati

Ovviamente il modulo si può usare anche per fare qualche piccolo scherzo innocente, per esempio condividere un articolo dal sito ufficiale di Microsoft e cambiare il titolo in Linux è mille volte meglio di Windows, tanto lo sappiamo pure noi. Provare per credere. 😛

Facebook acquisisce Spool e chiude il servizio di bookmarking

Spool permetteva di salvare video in Flash da qualsiasi sito web e visualizzarli anche offline su smartphone e tablet

Ieri è arrivata a tutti gli utenti di Spool una email di avviso che notificava la chiusura del servizio, e conteneva un allegato con i link salvati nel proprio account. Le parti salienti sono:

Dear Spooler,

We’re writing to inform you that Spool has shut down. Your bookmarks are attached to this email. […] It’s been a pleasure to build Spool for you and we’ve been flattered with the overwhelmingly positive feedback we’ve received. However, after careful consideration, we’ve decided to pursue our vision in a new way. […]

Successivamente è stato pubblicato nel loro blog l’annuncio ufficiale dell’acquisizione e le istruzioni per salvare i propri “segnalibri”. Ed è proprio qui, secondo me, che c’è stato il grande fraintendimento di fondo.

Spool è nato come servizio per poter fruire in modo semplice dei contenuti video in flash disponibili online. In sostanza, trovandosi di fronte a un video in Flash su Android o iPhone, bastava inviare il link a Spool e il sito si occupava di registrarlo, convertirlo e salvarlo per la visualizzazione sul telefono, anche offline.

Era una funzionalità esclusiva di Spool, ancora attualmente non esiste un altro servizio di memorizzazione di pagine da leggere che sia in grado di fare lo stesso, e sappiamo bene come l’esigenza attuale non sia solo quella di scaricare e convertire video sul PC ma anche di farlo sul proprio dispositivo mobile, specialmente ora che anche su Android sta cominciando a sparire Flash (per fortuna, aggiungo io).

Dopo un certo periodo di tempo, Spool ha cominciato a inserire una nuova funzione di “social bookmarking”, cercando di scimmiottare piuttosto male una via di mezzo tra Twitter e Delicious, perdendo di vista qual era l’obiettivo di vera unicità: l’accesso ai video. Quindi si è arrivati ad un punto in cui per poter vedere un video, si doveva avviare una sorta di processo di salvataggio e condivisione di un segnalibro (e quindi togliere ogni volta la casella di spunta) semplicemente per dire al programma “registrami ‘sto video e poi riproducilo”.

Questo tipo di cambio improvviso di rotta mi ha confuso non poco, e penso lo stesso valga per molti utenti “dei primi tempi” di Spool. Ora il servizio ha chiuso e consiglia di passare a Delicious o Pocket (ex Read It Later) i quali sono buoni servizi ma non hanno alcuna funzione equiparabile al generico “registratore di video” che funzionava su qualsiasi sito, persino sulle presentazioni SlideRocket! La cosa da sperare vivamente è che Facebook sappia fare buon uso della funzionalità e riportarla a disposizione degli utenti, ma finora nessuno sa come andrà a finire. Voi che ne pensate?