martedì 16 giugno 2009

Come non leggere gli IM altrui di Rah Vaher

Sul Forum di Sl Italia c'è una spiegazione più che esauriente sull'impossibilità di leggere gli IM attraverso SpyIm o che che sia....e un mito cade per sempre, credo!

Copio incollo:




Come (non) leggere gli IM altrui.

Mi è stato più volte chiesto un parere sull'argomento ed ecco il risultato: in questo breve articolo tenterò di spiegare in modo non particolarmente approfondito come (non) sia tecnicamente possibile leggere gli IM altrui tramite oggetti scriptati IW in LSL, che come molti sanno è un linguaggio a dir poco idiota e tutt’altro privo di limitazioni, volute o meno che siano. Cercherò di mettermi nei panni dell’utente malevolo che prova a intercettare i messaggi privati di altri utenti, spiegando ogni singolo passaggio in modo non troppo tecnico e comprensibile a tutti. Come direbbero i colleghi americani, a questo livello di approfondimento non si tratta di ‘rocket science’, si tratta piuttosto di argomenti comprensibili a tutti soprattutto se spiegati in modo adeguato. Mi dispiace per gli utenti più esperti che probabilmente vorrebbero approfondire l’argomento in maniera molto più tecnica e dettagliata e che forse storceranno il naso su alcuni passaggi spiegati in modo piuttosto grossolano (entrare nei dettagli “veri” dell’argomento richiede altro rispetto ad un articolo come questo): forse in futuro scriverò qualcos’altro in merito e ci sarà modo di discuterne, sempre che io abbia il tempo e che a qualcuno interessi. Ancora una volta, tengo a precisare che non ho nessun interesse al di fuori di rispondere a chi mi ha chiesto delucidazioni in merito alla faccenda “Spy-IM” e dare qualche informazioni corretta in più a chi fosse interessato.

Iniziamo prendendo in considerazione l'unica funzione esplicitamente dedicata alle comunicazioni IM e che potrebbe in qualche modo tornarci utile per "spiare" le conversazioni private di altri utenti: llInstantMessage(key user, string message).

La funzione invia all'utente identificato dall'UUID 'user' il messaggio specificato col parametro 'message' (se la dimensione del messaggio è superiore a 1023 bytes verrà troncato), imponendo un delay di 2 secondi ad ogni chiamata. Il delay imposto è stato chiaramente inserito da LL per evitare l’eventuale spam di IM da parte di un oggetto verso un utente. L’avatar ricevente non visualizzerà una nuova finestra IM come accade nella comunicazione tra utenti, ma visualizzerà il messaggio di colore verde nella propria chat history, esattamente come un messaggio pubblico, ma ovviamente visibile solo dal legittimo destinatario. Gli oggetti inoltre non possono ricevere IM, ma solo inviarne. llInstantMessage funziona indipendentemente dal simulatore e dalle regioni in cui si trovano mittente e destinatario.

Importante sottolineare come il messaggio non possa essere intercettato in alcun modo nell'evento 'listen' utilizzando la funzione llListen. Questo perchè gli IM sono gestiti in modo diverso e non vengono inviati come messaggi su canali intercettabili da llListen. Faccio presente inoltre, che anche se così fosse, il range dei possibili canali è [-2147483647, +2147483647] e intercettare un determinato messaggio, in un determinato istante e in una determinata regione sarebbe comunque piuttosto improbabile, per non dire impossibile. In più, il limite di possibili listener attivi per script imposto da LSL è 65 (non 64 come segnalato sul wiki), il che renderebbe ancora più difficoltosa l'intercettazione dei messaggi sparati su canali LSL. Ovviamente, dato che di fatto gli IM non viaggiano su canali intercettabili, tutta questa teoria resta comunque inutile.

Conclusione: di fatto gli IM non possono tecnicamente essere maneggiati utilizzando LSL, tantomeno intercettati. Questo esclude una serie infinita di spy-tools (o presunti tali) tanto acclamati, che in realtà altro non fanno che restare in ascolto su determinati canali e inoltrare tutto ciò che viene rilevato ad altri utenti. Questa è una delle funzionalità più basilari mai viste su SL nonostante molti utenti siano convinti di avere tra le mani uno strumento per intercettare gli IM, quando in realtà si tratta di un più o meno semplice relayer di chat pubblica e/o canali "nascosti". Tutte le informazioni sulle funzioni LSL sono liberamente reperibili qui: http://lslwiki.net/.

Potrei tranquillamente fermarmi qui, ma l'obiettivo iniziale era leggere gli IM di un'altro utente: dunque, continuiamo. Per poter intercettare un IM, dobbiamo prima capire come vengono trasmessi. Se ci trovassimo qualche anno nel passato e fossimo decisamente più sfigati, dovremmo occuparci del reverse engineering del client SL, ovvero “smontare” il sofware per capire come funziona, cosa non esattamente semplice soprattutto per chi sa di cosa parlo e di come si procede nel reversing, oppure ‘catturare’ i pacchetti maneggiati dal client e cercare di trovare quello che ci serve: il famoso ago nel pagliaio (impresa titanica all’epoca intrapresa dai creatori di libsecondlife). Fortunatamente invece, il client è da qualche tempo open-source, e negli ultimi anni il progetto libsecondlife si è evoluto parecchio. Diamo quindi un occhio ai sorgenti libopenmetaverse o ai sorgenti del client ufficiale di SecondLife, facendo particolare attenzione a dove e come vengono maneggiati gli Instant Messages. Per comodità prelevo la versione 0.6.3 di libopenmetaverse tramite SVN dal relativo sito e apro i sorgenti del test client (si, il “mistico” programma che molti rippers idioti utilizzano con una vecchia GUI in .NET sviluppata tempo fa da un noto gruppo di griefers pesantemente perma-bannati da SL: sto parlando del copybot). La prima cosa che salta al’occhio è che: sorpresa! (ironia-off) il software gestisce pacchetti di dati ma (ironia-on) non c’è nessuna scritta rossa lampeggiante con la dicitura “clicca qui per fregare gli IM dei tuoi amici niubbi”.

Gli InstantMessages sono per il client nient’altro che strutture di dati suddivise in pacchetti ed inviate al server in determinate circostanze non solo per gestire i messaggi privati. Per farla breve, quando inviamo un oggetto ad un altro avatar, una richiesta di teleport o eseguiamo altre particolari operazioni (ripeto, non necessariamente avviare una conversazione privata quindi), il client si preoccupa di creare un InstantMessage in un determinato modo e con una determinata struttura a seconda dei casi, che verrà poi spedito al server; quest’ultimo saprà comportarsi di conseguenza in base ai dati ricevuti. Per darvi un’idea della casistica delle tipologie di messaggi, ecco un estratto del codice sorgente:

Codice: Seleziona tutto
///
/// Special commands used in Instant Messages
///

public enum InstantMessageDialog : byte
{
/// Indicates a regular IM from another agent
MessageFromAgent = 0,
/// Simple notification box with an OK button
MessageBox = 1,
// Used to show a countdown notification with an OK
// button, deprecated now

//[Obsolete]
//MessageBoxCountdown = 2,
/// You've been invited to join a group.
GroupInvitation = 3,
/// Inventory offer
InventoryOffered = 4,
/// Accepted inventory offer
InventoryAccepted = 5,
/// Declined inventory offer
InventoryDeclined = 6,
/// Group vote
GroupVote = 7,
// A message to everyone in the agent's group, no longer
// used

//[Obsolete]
//DeprecatedGroupMessage = 8,
/// An object is offering its inventory
TaskInventoryOffered = 9,
/// Accept an inventory offer from an object
TaskInventoryAccepted = 10,
/// Decline an inventory offer from an object
TaskInventoryDeclined = 11,
/// Unknown
NewUserDefault = 12,
/// Start a session, or add users to a session
SessionAdd = 13,
/// Start a session, but don't prune offline users
SessionOfflineAdd = 14,
/// Start a session with your group
SessionGroupStart = 15,
/// Start a session without a calling card (finder or objects)
SessionCardlessStart = 16,
/// Send a message to a session
SessionSend = 17,
/// Leave a session
SessionDrop = 18,
/// Indicates that the IM is from an object
MessageFromObject = 19,
/// Sent an IM to a busy user, this is the auto response
BusyAutoResponse = 20,
/// Shows the message in the console and chat history
ConsoleAndChatHistory = 21,
/// Send a teleport lure
RequestTeleport = 22,
/// Response sent to the agent which inititiated a teleport invitation
AcceptTeleport = 23,
/// Response sent to the agent which inititiated a teleport invitation
DenyTeleport = 24,
/// Only useful if you have Linden permissions
GodLikeRequestTeleport = 25,
/// A placeholder type for future expansion, currently not
/// used

CurrentlyUnused = 26,
// Notification of a new group election, this is
// deprecated

//[Obsolete]
//DeprecatedGroupElection = 27,
/// IM to tell the user to go to an URL
GotoUrl = 28,
/// IM for help
Session911Start = 29,
/// IM sent automatically on call for help, sends a lure
/// to each Helper reached

Lure911 = 30,
/// Like an IM but won't go to email
FromTaskAsAlert = 31,
/// IM from a group officer to all group members
GroupNotice = 32,
/// Unknown
GroupNoticeInventoryAccepted = 33,
/// Unknown
GroupNoticeInventoryDeclined = 34,
/// Accept a group invitation
GroupInvitationAccept = 35,
/// Decline a group invitation
GroupInvitationDecline = 36,
/// Unknown
GroupNoticeRequested = 37,
/// An avatar is offering you friendship
FriendshipOffered = 38,
/// An avatar has accepted your friendship offer
FriendshipAccepted = 39,
/// An avatar has declined your friendship offer
FriendshipDeclined = 40,
/// Indicates that a user has started typing
StartTyping = 41,
/// Indicates that a user has stopped typing
StopTyping = 42
}

Nel caso specifico degli IM intesi come “messaggi privati” invece, il client invia prima di tutto una richiesta specifica al fine di interrogare il server LL per la risoluzione della key del destinatario del messaggio e altri parametri necessari, successivamente viene creata ed inviata la relativa struttura dati . I più curiosi possono dare un occhio ai sorgenti partendo dalla funzione di invio IM con il più alto livello di astrazione e procedendo a ritroso.

Codice: Seleziona tutto
///
/// Instant Message
///

public struct InstantMessage
{
/// Key of sender
public UUID FromAgentID;
/// Name of sender
public string FromAgentName;
/// Key of destination avatar
public UUID ToAgentID;
/// ID of originating estate
public uint ParentEstateID;
/// Key of originating region
public UUID RegionID;
/// Coordinates in originating region
public Vector3 Position;
/// Instant message type
public InstantMessageDialog Dialog;
/// Group IM session toggle
public bool GroupIM;
/// Key of IM session, for Group Messages, the groups UUID
public UUID IMSessionID;
/// Timestamp of the instant message
public DateTime Timestamp;
/// Instant message text
public string Message;
/// Whether this message is held for offline avatars
public InstantMessageOnline Offline;
/// Context specific packed data
public byte[] BinaryBucket;
}

Come accennavo precedentemente, tutta questa roba viene scambiata tra client e server (stento a credere che la comunicazione avvenga in chiaro) e non passa per nessuno script IW (motivo per cui non possono esistere oggetti IW scriptati in LSL che intercettano gli IM). In aggiunta a quanto detto fin’ora, ogni volta che una sessione IM viene generata, essa viene identificata da un UUID univoco e temporaneo, che viene assegnato e mantenuto attivo per tutta la durata della conversazione. In linea del tutto teorica quindi, è possibile intercettare i messaggi privati tra utenti; intromettendosi nella comunicazione tra client e server (auguri!), intercettando i pacchetti che ci interessano filtrando il flusso di dati (non conoscendo l’UUID che identifica la sessione), estrapolando le informazioni che ci servono dai pacchetti (scrivendo un software ad hoc che svolga il compito) ed eliminando il resto.

Mi fermo qui, credo che a questo punto le cose siano decisamente più chiare e non vedo nessuna utilità nel proseguire con la dimostrazione. A scopo didattico, i più prodi potrebbero essere in grado di intercettare i propri IM, probabilmente non senza qualche difficoltà: ben diverso è invece intercettare le conversazioni private di altri. Detto questo, confermo ancora una volta che intercettare gli IM attraverso script LSL IW è impossibile, le tecniche sono ben altre ben più complesse. Per assurdo, è più semplice rubare la password ad un avatar che intercettare gli IM: se riusciste a far collegare la “vittima” a SL attraverso un proxy, sarebbe possibile intercettare tutti i pacchetti trasmessi, almeno in fase di login. Questo significa che sareste in grado di loggare l’hash md5 della password (trasmesso ai server LL in all’interno di una struttura XML in chiaro e facilmente interpretabile) e collegarvi successivamente ad SL utilizzando l’hashing “rubato” anche senza conoscere la password originale. Un metodo sicuramente più semplice (ma che non incoraggio in nessun modo) per venire in possesso delle conversazioni private tra utenti, è quello di utilizzare un po’ di social engineering, hacking-tools o trojan (magari self-made e incorporati nel famoso copybot che tanto piace ai rippers) e fare visita al malcapitato: nel caso in cui egli abbia il logging IM attivo (abilitato di default) sarebbe facilmente possibile recuperare i log. Non è un mistero inoltre che gli indirizzi IP degli utenti collegati a SecondLife sono reperibili in svariati modi. Per fare un esempio, tutti voi che state leggendo questo blog avete lasciato il vostro indirizzo e relativo nome SL, così come quando entrate in land ed attivate lo streaming: quando ascoltate musica IW, il vostro client si connette ad un determinato server che provvede all’invio del flusso di dati in streaming (il che significa che quel server “sa chi siete”).

Le tecniche sono parecchie e potrei continuare all’infinito, ma richiedono un livello di conoscenza un attimo superiore rispetto al già comunque difficilissimo“cliccare su un oggetto che spia gli IM” come l’ormai celebre quanto introvabile “SpyIM”, il cui mito hanno collaborato un po’ tutti ad alimentare (senza polemica di alcun tipo, è semplicemente un dato di fatto). Tenendo conto di tutto ciò che ho detto e non solo, credo fermamente che nessuno sia mai stato in grado di intercettare gli IM di altri utenti tramite LSL (semplicemente perché è impossibile) né con altri mezzi (data l’altissima difficoltà dell’operazione e relativi rischi di ritorsioni legali da parte di LL soprattutto in caso di violazione dei loro server, argomento che non ho volutamente toccato). Sono pronto a ricredermi qualora qualcuno sia in grado di dimostrare il contrario in modo concreto: cambiare opinione davanti all’evidenza è sintomo di intelligenza.

Per chi ha pensato di poter sfruttare in qualche modo la funzionalità di inoltro dei messaggi privati tramite e-mail quando un avatar è off-line, rispondo citando un articolo di James Linden del 6 febbraio 2007, riportando le parti più interessanti (l’articolo completo è disponibile qui https://blogs.secondlife.com/community/ ... s-changing).

In order to reduce database load we are changing the “from address” used to allow you to reply to these messages. It currently looks like f9deadc4-6fa8-4a54-7921-27cbeefad0fd @im.agni.lindenlab.com. Soon it will look like 1taRxmON1vBQ-KdZRaE1yAC3-dwuXHz76eH9cOvqa7RW7Cg3LXXiLw== @im.agni.lindenlab.com. Unless you are doing complicating filtering or have written software that auto-replies this change should not affect you.

The new e-mail address format allows us to store all the IM routing information inside the address itself. No database access is required. To prevent “spoofing” IMs from users the data is encrypted using Blowfish and a rotating secret key in Linden Lab’s servers. The address is the Base64 encoded output of the encrypted data, with + and / replaced with _ and - to allow better compatibility with e-mail systems.

Precisazione: per eventuali altre informazioni in merito a tutto l’argomento, non sono disponibile a rispondere alle domande: non mandate IM nè notecard in merito perchè semplicemente non riceverete risposta a meno che non sappiate esattamente di cosa state parlando e volete semplicemente farvi una chiacchierata, oppure siete disposti a pagare bei soldoni per la consulenza e per il tempo che mi fareste spendere. Di solito questo basta ad evitare gli IM per almeno un mese.

Rah Vaher prosegue sul blog di ItaliaSL con Come Leggere gli IM altrui il ritorno

dove specifica

In un articolo precedente ho spiegato, senza entrare troppo nel dettaglio, come non fosse assolutamente possibile maneggiare o intercettare Instant Messages IW tramite LSL. Questa volta invece mi occuperò di spiegare come sia tecnicamente possibile intercettare i messaggi privati scambiati tra due utenti utilizzando un proxy che verrà inserito nel mezzo della comunicazione tra client e server. In altre parole, l’unico modo per leggere gli IM altrui è assicurarsi che la “vittima” utilizzi un client appositamente modificato che maneggi in qualche modo gli IM e ne effettui, per esempio, il relay ad un utente specifico.

Nessun commento:

Etichette

WDT Planet (243) AMICI (197) WDT STAFF (187) ALICE MASTROIANNI (163) IL MIO DIARIO DI SECOND LIFE (138) IL MIO DIARIO DI REAL LIFE (112) MOSTRE NEL METAVERSO (96) PROGETTI IN SECOND LIFE (93) LIBRI GIORNALI ARTICOLI SU E DI SL (72) PROGETTI NO PROFIT ONLUS (72) FILM VIDEO MACHINIMA E NON SU SECOND LIFE (66) MATRIMONI FESTE EVENTI INCONTRI IN SL (65) FOTOGRAFIE (64) SPORT IN SL (64) politica (62) MUSICA (61) CONCORSI ARTE/CULTURA/FOTOGRAFIA ETC. (58) TORINO LA MIA CITTA' REALE E VIRTUALE (54) PANGEA (49) BLOGGER (40) NOTIZIE VARIE SU SL E DINTORNI (40) ARTE CREATIVITA' E ALTRO IN REAL LIFE (39) CONCERTI LIVE SU SECOND LIFE (38) CONFERENZE EVENTI REALI ANCHE SU SECOND LIFE (37) DONNA (36) NOVITA' LINDEN LAB (36) INFORMAZIONI VARIE SULLA REALTA' DI SECOND LIFE (35) Incoerenza jazz Club (33) cbm Italia (32) HELLAS VERONA (28) TERREMOTO ABRUZZO 2009 (23) GITE 2010 (19) PROGETTI ICT REALI (19) 2Lei : giornata mondiale contro la violenza sulle donne in SL (15) TUTORIAL (14) ICOMUNICAZIONI LINDEN LAB (13) NOTIZE DAL WEB (12) LA STORIA DEL ROCK (11) LEZIONI/CORSI TUTOR (11) QUESTA SETTIMANA TI SUGGERISCO (11) AZIENDE CHE SBARCANO IN SL (10) 2lei 2011 (9) GITE 2008 (7) MONDI VIRTUALI (7) NEW YORK (7) NORMAZIONI VARIE SULLA REALTA' DI SECOND LIFE (7) 2lei: Internatonal Day for the Elimination of Violence against Woman in SL (6) BOINC.Italy (6) MODA IN SL (6) 150 anni di unità di Italia (5) COLORS OF LIFE (5) GIOCO DI RUOLO SU SECONDLIFE (5) INCONTRI LETTERARI (5) LAVORO IN SL (5) GITE 2009 (4) nichi vendola (4) 2010 (3) 2lei 2013 (3) LAUREA SU SECONDLIFE (3) Tutorial Second Life Viewer 2.0 (3) terremoto emilia 2012 (3) EDUCAZIONE ALLA SALUTE (2) PROPOSTE ALLE AZIENDE (2) SAVE THE CHILDREN (2) WDT Planet chiude in SL (2) equitalia (2) metaCOSMO (2) multe apcoa (2) politiche 2013 (2) #1billionrising (1) #nonsiamotuttiputtane (1) #siamotuttiputtane (1) 2011 (1) 2012 (1) 25 novembre 2011 (1) NAPOLI E I RIFIUTI (1) Terremoto Giappone 2011 (1) Tsunami Pacifico 2011 (1) WONDERFUL DREAM TEAM (1) clio nera (1) e-government (1)