Typing e la Privacy di Facebook Chat

Da tempo mi ero promesso di studiare per bene le dinamiche della chat di facebook e finalmente da qualche giorno ho deciso di cominciare. Probabilmente lo studio del protocollo lo avrei tenuto per me visto che in giro si trova buona documentazione, se non fosse per il fatto che ho notato qualcosa di interessante nell’uso del typing. Non si tratta di un bug di facebook ma di una comune richiesta utilizzata per mettere in comunicazione due utenti e che, se adeguatamente intercettata e riutilizzata, potrebbe stimolare qualcuno a rimettere ancora una volta in discussione la privacy su facebook.

Per non portarla alle lunghe cerco di sintetizzare e di evitare particolari tecnicismi.

All’apertura della chat di facebook il browser lavora asincronicamente attraverso richieste ajax. Inizialmente viene inviata la seguente richiesta POST (dal nostro browser verso il web server di Facebook) seguita dai parametri essenziali per presentarsi al server.

POST /ajax/chat/buddy_list.php?__a=1

Il browser resta in attesa di intercettare la risposta dove gli verranno fornite le informazioni sullo stato degli amici online (buddy list).

Una volta aperta la finestra di popup e selezionato l’utente con cui si desidera conversare (ovviamente il destinatario non è al corrente del fatto che state per scrivergli), alla pressione del primo carattere digitato nel campo della finestra chat viene generata una richiesta HTTP di tipo POST verso il server web

POST /ajax/chat/typ.php?__a=1

con il seguente contenuto

typ=1&to=DESTIDNUM&post_form_id=SOURCEIDNUM&fb_dtsg=XYZKJ&post_form_id_source=AsyncRequest

Si tratta di un typing. In soldoni avvisiamo il server che siamo SOURCEIDNUM e desideriamo aprire una sessione di chat con DESTIDNUM. Naturalmente il server prende in carico la richiesta e verifica che il destinatario sia online e disponibile a intraprendere una conversazione in chat.

Per confermare la disponibilità viene inoltrata dal browser del destinatario verso il web server di facebook una richiesta di tipo GET

GET X.channelYZ.facebook.com/x/CODENUM/false/p_IDNUM=N

Il server risponde con il seguente messaggio

for (;;);{"t":"msg","c":"p_DESTIDNUM","ms":[{"type":"typ","st":1,"from":SOURCEIDNUM,"to":DESTIDNUM}

E' qui che DESTIDNUM (il destinatario) viene informato che il contatto SOURCEIDNUM sta per scrivergli qualcosa, di conseguenza il suo browser si prepara alla ricezione.

L'utente destinatario non ha ancora ricevuto alcun segnale visivo, non sa ancora che sta per ricevere un messaggio da uno dei suoi contatti.

Sfruttando questo passaggio utilizzato per stabilire la prima connessione tra due utenti e sniffando il traffico in uscita dal nostro browser siamo in grado di capire quando e da chi stiamo per ricevere un messaggio prima ancora che venga mostrato a noi. Anche quando chi sta per scriverci si pente di inviarlo.

Molto banalmente sarebbe sufficiente una estensione per firefox che intercetti la richiesta GET in uscita dal browser attraverso una espressione regolare del tipo

[0-9].channel[0-9]{1,}.facebook.com/x/[0-9]{1,}/false/p_[0-9]{1,}

e la risolva in background in modo da restituire il nome del contatto che sta per scriverci.

Se si procede manualmente, invece, basta tenere aperto uno sniffer con filtro attivo per il tipo di richiesta, leggere il SOURCEIDNUM e assegnarlo alla url come valore della variabile id. Esempio:

http://www.facebook.com/profile.php?id=565977181

5 thoughts on “Typing e la Privacy di Facebook Chat

  1. Rebus scrive:

    Oppure si può usare Pidgin, che sfrutta proprio questo meccanismo per avvisarti che qualcuno sta iniziando a scriverti (“percepisco una vibrazione nella Forza”)

  2. Andrea Delfino scrive:

    Bug, or feature… that is the question! :P

  3. guelfoweb scrive:

    @Rebus: non ho idea di come lavori il plugin di Pidgin, se ti riferisci al fatto che mostra il typing durante la conversazione (dopo che hai ricevuto il primo messaggio) non vedo nulla di anormale, se invece ti avvisa prima ancora che l’utente ti abbia contattato vuol dire che ci sono arrivati molto prima di me.

    @Andrea: già, un bel dilemma :|

  4. Rebus scrive:

    Certo che mi riferisco alla “preveggenza”, é di quello che stiam parlando, no?
    Prima ancora che ti arrivi il primo messaggio, Pidgin apre giá la finestra di chat con quel tale utente e ti avvisa che percepisce un disturbo nella Forza :)
    E non é una faccenda limitata a Facebook, funziona anche per altri protocolli, come MSN.

  5. guelfoweb scrive:

    @Rebus: il protocollo di Yahoo! Messenger ricordo bene che gestiva il typing in perfetta modalità hidden, almeno fino a YMSG12. Non so dirti di MSN ma ti credo per fede :P

Comments are closed.