CSIRTCV

Está usted visitando una publicación en la hemeroteca de CSIRT-CV.
Para acceder al portal y contenido actual, visite https://www.csirtcv.gva.es

11/02/2014

Així funciona la seguretat de Telegram

Telegram A hores d'ara tots heu sentit parlar ja de Telegram, la nova aplicació de missatgeria instantània que pretén reemplaçar Whatsapp (encara que molts pensem que això és impossible). Un dels seus majors avantatges, segons els seus creadors, és la seua seguretat.

Telegram implementa un protocol propi, MTProto, que transmet els missatges de forma segura entre el nostre mòbil i el servidor. Inclús permet crear xats segurs entre dos clients, de tal forma que ni tan sols els servidors de Telegram poden veure què estàs enviant. Ara bé, com funciona? En este article explicarem en què consistix la seguretat de Telegram.

La base: criptografia simètrica

Bàsicament i amb poques paraules, Telegram xifra els missatges d’una forma simple: es xifra amb una clau i es desxifra en l’altre costat amb eixa mateixa clau. A l’estar els missatges xifrats, algú que estiga espiant el tràfic del nostre mòbil no sabrà de què estem parlant amb els nostres amics.

Eixa és la idea principal de Telegram. Fàcil, senzill i per a tota la família. Però les coses es comencen a complicar prompte.

I el primer problema que ens sorgix és la clau. Està clar que la clau no pot ser la mateixa per a tots els clients perquè llavors qualsevol podria desxifrar els missatges. Ha de ser distinta per a cada client.

Estem en una posició complicada. Cada vegada que un usuari instal·le l’aplicació de Telegram s’ha de crear una clau, i eixa clau ha d’enviar-se al servidor perquè puga desxifrar els missatges. Òbviament, no podem transmetre la clau en clar al servidor. Cal buscar una forma de dir-li al servidor quina és la clau sense dir-li quina és la clau. Esta idea, que pareix impossible, és en realitat un algoritme molt senzill.

Diffie-Hellman, intercanviant claus de forma segura

La implementació de Diffie-Hellman es basa en matemàtiques, més concretament en grups de sencers multiplicadors mòdul p, amb p primer. No obstant això, el que ens interessa d’eixa teoria matemàtica és una propietat molt important: és molt fàcil operar un nombre a amb un altre b perquè isca c, però a partir de c és molt difícil saber quins nombres a i b ho han generat.

Però és més fàcil entendre Diffie-Hellman amb colors que amb nombres. Este és l’esquema de l’intercanvi de claus (suposant que no sabem com separar dos colors):

Oblidem-nos per un moment de Telegram, i suposem que tenim dos amics, Alicia i Bernardo, que volen crear un color secret que només sàpien ambdós. La primera cosa que han de fer és posar-se d’acord en un color de partida comuna, que usaran els dos, en este cas el blau. A més, cada un tria un color secret que mai serà compartit ni vist per ningú.

Diffie-Hellman permet que ambdós parts arriben a una clau comuna secreta, sense haver de transmetre-la.

Alicia mescla el seu color comú amb el color secret, i li passa el resultat (al qual anomenem color intermedi) a Bernardo. Bernardo el mescla amb el seu color secret: el que quede serà la clau secreta, que Alicia obtindrà de forma anàloga.

El millor de tot és que encara que algú intercepte el color comú i els dos colors intermedis, no seria capaç d’arribar a la clau secreta. Podria mesclar tot el que volguera eixos colors però mai arribaria a la mateixa combinació que conforma el color final.

Tornant a Telegram: problemes tècnics addicionals

Ara que ja sabem com compartix el client i el servidor la clau, pareix que tot està resolt. No obstant això, continua havent-hi problemes que obliguen a modificar el protocol, i per a entendre’ls hem d’aprofundir un poc en temes tècnics.

Telegram usa l’algoritme d’encriptat AES amb claus de 256 bits, en mode IGE (Infinite Garble Extension). El mode té a veure amb l’entrada de l’algoritme: AES xifra per blocs, cadenes de 128 bits. Depenent del mode en què usem l’algoritme, xifrarem els blocs provinents del text pla o els combinarem d’alguna forma amb blocs xifrats anteriors. Si esteu interessats en el tema, este és un bon recurs, però el mode de AES no ens interessa massa per a este article.

El que sí que ens importa és que AES-IGE és vulnerable a certs atacs de criptoanàlisi. Per exemple, a CPA (Chosen Plaintext Attack). Este tipus d’atac consistix a xifrar certs textos plans que tu coneixes i veure quin n'és el resultat. A partir d’eixos textos (que no són triats a l’atzar, sinó que es formen específicament per a cada situació), es poden inferir dades sobre la clau, reduint les possibilitats i augmentant la probabilitat d’endevinar-la per complet.

Per a contrarestar este tipus d’atacs, Telegram implementa dos característiques enginyoses. La primera és que, quan es xifra un missatge, no es xifra només el missatge sinó que a ell s’afig un salt, una cadena aleatòria que definix el servidor de Telegram, l’hora actual i un nombre de seqüència que indica l’orde del missatge.

D’esta manera, un atacant no pot xifrar amb AES-IGE el text que ell vullga, ja que l’aplicació sempre afig eixos tres valors fixos que ell no controla.

La segona característica té més implicacions, i és que abans vos he mentit un poc. La clau que compartixen servidor i client no és la que s’usa per a xifrar els missatges. Vegem els detalls en la següent secció.

MAC i xifratge de missatges

A més de xifrar els missatges, voldrem comprovar que no s’han modificat pel camí (accidentalment o per un atacant). Per a això usem un MAC. I no em referisc als Mac d’Apple, sinó al Message Authentication Code, o codi de verificació de missatge.

Este codi s’obté a partir del missatge, i és (quasi) únic. Si el missatge canvia encara que només siga en una titla, el MAC serà distint. És paregut a les funcions hash o d’empremta digital, encara que no exactament igual.

La clau amb què es xifra el missatge depén del seu contingut.

A l’hora d’enviar el missatge, Telegram obté la seua empremta digital per mitjà de l’algoritme SHA-1. El resultat és una clau que identifica al missatge. Però a més eixe resultat es combina junt amb la clau compartida entre client i servidor per a obtindre una nova clau amb què xifrar el missatge.

És a dir, que la clau amb què es xifra cada missatge depén del seu propi contingut. Este fet dóna molta robustesa al xifratge de Telegram i a més impedix diversos atacs a què són vulnerables alguns dels seus components. L’esquema final del xifratge és el següent:

Després de xifrar el missatge, s’envia un paquet que conté el missatge xifrat, l’empremta digital SHA-1 del text sense xifrar i un nombre que identifica la clau compartida que s’usa.

Al rebre el missatge en l’altre costat de la connexió, es recrea la clau de xifratge usant la clau compartida i l’empremta del missatge, es desxifra el text i es comprova que l’empremta digital concorda. També es comprova que el salt siga correcte (igual al que el servidor haja definit), que la data i hora siga raonable (per exemple, no acceptarem un missatge amb data dos anys en el futur) i que el nombre de seqüència siga l’apropiat.

Així, amb eixa comprovació múltiple, Telegram s’assegura que ningú més pot llegir el missatge i que a més ha arribat sense cap tipus de modificació.

Altres detalls: xats segurs i firma digital

Ens hem deixat dos temes en el tinter en l’explicació. El primer és ràpid: com s’asseguren les connexions que es realitzen abans de generar la clau compartida? Ja hem vist que no passa res perquè algú veja l’intercanvi Diffie-Hellman, però, com sabem que realment estem parlant amb el servidor oficial de Telegram i no amb un impostor?

La solució és senzilla: usant certificats digitals. Quan el servidor envie missatges al client, adjuntarà la firma digital que es pot verificar amb la clau pública que emmagatzemen les aplicacions. En Genbeta ja expliquem a fons en què consistix la firma digital amb clau pública/privada, per si teniu interés en això.

D’altra banda, Telegram també oferix xats segurs en què ni tan sols el seu servidor pot llegir el que envies. L’esquema és exactament el mateix que en les comunicacions client-servidor, encara que esta vegada la clau se l’intercanvien els dos clients que facen el xat segur. El servidor de Telegram només s’encarrega de posar en contacte inicialment ambdós clients.

En general, el protocol de Telegram està prou bé pensat i encara que no és serà infal·lible (res és 100% segur) sí que oferix moltíssima més seguretat que les altres alternatives que hi ha en el mercat, a més de l’avantatge de ser un protocol obert perquè tots ho puguen estudiar.

Font: Genbeta

CSIRT-CV