El sábado, Mega, el sucesor de Megaupload, salió al público. Una de las características más llamativa es lo seguro que dicen que es. Los archivos se cifran en tu ordenador, Mega no sabe qué estás guardando, estás totalmente protegido... Al menos, eso es lo que podríamos adivinar. Pero, ¿qué nivel de seguridad tiene Mega en realidad? ¿Es todo palabrería o estamos hablando de un salto que nadie más ha hecho?
Antes de nada, me gustaría aclarar que de lo que vamos a hablar aquí es de la seguridad del diseño. Ya en las primeras horas se han descubierto fallos en el cliente web de Mega: es vulnerable a XSS con los nombres de archivo, no tiene HSTS, una cabecera que fuerza que todas las conexiones al sitio sean por HSTS; ni tampoco usa DNSSEC. También se ha detectado que el generador de claves no es precisamente aleatorio: usa el generador de números aleatorios de Javascript, que es predecible. Sin embargo, estos son fallos relativamente sencillos de corregir, y hay que tener en cuenta que Mega salió ayer y habrá que darles tiempo a cambiar cosas. Lo que es permanente es el diseño, y esto es lo que vamos a explorar.
¿Cómo funciona el cifrado simétrico y asimétrico?
Para poder entender bien cómo funciona el cifrado de Mega, antes voy a explicar brevemente qué es el cifrado simétrico y asimétrico. En el cifrado simétrico, ciframos el archivo con una clave X. Para descifrarlo y obtener el archivo original, utilizamos la misma clave X. Es un concepto muy sencillo y básico.
El cifrado asimétrico es más complicado. Aquí no tenemos una sola clave común. En su lugar, cada persona tiene dos claves, una pública y una privada. Para enviarle un archivo a un amigo, lo cifras con su clave pública. De esta forma, sólo lo puede descifrar él con su clave privada. Es más seguro que el cifrado simétrico, ya que la clave de descifrado (la privada) nunca se comparte, siempre la tiene el receptor.
Lo malo de esto es que el cifrado asimétrico es mucho más caro en términos de computación. Por eso, en ocasiones se usan combinaciones más eficientes. Por ejemplo, la generación de una clave simétrica usando los pares claves públicas/privadasa: primero, combinas tu clave privada y la clave pública del receptor para obtener la clave de cifrado X. El receptor hace lo mismo con su clave privada y tu clave pública, obteniendo la misma clave X. Entonces, se usa esa clave X para cifrar de forma simétrica el archivo. Este sería el concepto básico, aunque por supuesto hay algoritmos más elaborados, como el intercambio de claves Diffie-Hellman para dos usuarios puedan generar la misma clave a partir de las claves públicas y privadas.
Por otra parte están los sistemas de cifrado híbrido, en los que se usa una clave simétrica para cifrar el archivo, y después se cifra la clave simétrica con los pares de claves pública/privada.
¿Cómo funciona el cifrado de Mega?
Vamos ahora con Mega. Lo primero que hace cuando os registráis es generar un par de claves pública/privada RSA de 2048 en vuestro ordenador. Se guardan en vuestro espacio de almacenamiento del navegador (HTML5), pero también se envían a los servidores de Mega. También se genera una clave simétrica maestra, que permanece en los servidores de Mega. Esta clave está cifrada con un _hash_ derivado de vuestra contraseña. Esta es la clave que se usa para proteger tu clave privada.
Bien, ahora, ¿qué ocurre cuando subes un archivo? Según la documentación de desarrolladores de Mega, el proceso (básico, resumido y obviando detalles que no son demasiado relevantes, como los chequeos de integridad) es el siguiente:
- Se genera una clave simétrica aleatoria de 128 bits para el archivo.
- Se cifra el archivo con esa clave.
- Se genera otra clave para enviar el archivo. La documentación no especifica de dónde sale la clave, aunque probablemente se use el intercambio de claves Diffie-Hellman con tu par de clave pública/privada y un secreto compartido.
- Se envía el archivo cifrado a Mega, junto con la clave de cifrado del archivo, todo ello protegido con la clave que habíamos generado antes.
- Mega guarda el archivo cifrado (sin descifrar sus contenidos) por un lado. Por otro, guarda la clave del archivo cifrada con tu clave maestra.
En la documentación no se discute cómo se descarga el archivo. Probablemente Mega envíe el archivo y su clave de cifrado al cliente protegidos de nuevo con tu par clave pública/privada, pero esto es sólo especulación ya que no se especifica nada.
¿Cómo se comparten los archivos?
Lo que he explicado es lo básico del funcionamiento de Mega. Sin embargo, hay más detalles que añaden complejidad. Una de ellas es la posibilidad de compartir ficheros con otros usuarios.
Cuando permites a otros usuarios que accedan a alguna de tus carpetas, las claves de cifrado de cada uno de los archivos que tienes ahí también se comparten con ellos. Así pueden acceder al contenido que esté almacenado, y también podrán cargar ficheros nuevos, compartiendo su clave con todos los que tengan acceso a esa carpeta.
Por otro lado está la posibilidad de enviar ficheros usando enlaces. Un enlace a un archivo de Mega tiene el formato _http://mega.co.nz/#[ID de archivo]![Clave de cifrado (opcional)]_. Si simplemente envías un enlace con el ID de archivo, Mega te pedirá la clave de cifrado de 43 caracteres para descargar el archivo. Si el enlace tiene contiene la clave, con sólo acceder ya podrás descargarlo.
Lo bueno de usar esta forma de compartir es que sólo distribuyes las claves de los archivos que compartes. El resto de tus ficheros permanecen cifrados con claves a las que nadie más puede acceder.
Duplicación de archivos, un punto comprometido
Cotilleando por los términos de uso, encontré un párrafo interesante (traducción propia):
8. Nuestro servicio puede borrar automáticamente un bloque de datos que subas si determina que es un duplicado exacto de otro bloque ya almacenado en nuestro servicio. En este caso, tendrás acceso al bloque original.
Hasta aquí nada extraño, otros servicios de almacenamiento en la nube también lo hacen para evitar almacenar varias veces el mismo archivo. Pero hay un problema en el caso de Mega. Los archivos se guardan cifrados, y (en teoría) Mega no puede descifrarlos. Por lo tanto, no puede saber si dos archivos son duplicados o no, y sólo podría chequear si ya tiene el mismo bloque de datos cifrados.
El problema es que hacer eso sería bastante ineficiente. Podemos asumir que un bloque de datos cifrados es totalmente aleatorio, así que la probabilidad de que haya una colisión (dos bloques sean iguales) es extremadamente baja. Si tuviésemos cien mil archivos de 1 MB cifrados, la probabilidad de que haya una colisión es de, aproximadamente, 3 por diez elevado a -145. Para que os hagáis una idea, es más probable que os toque el Gordo de la lotería durante veinte años seguidos a que haya una colisión.
Tampoco sería plausible generar el _hash_ (huella digital) del archivo antes de subirlo para evitar duplicados: aunque pudieses detectar que lo tiene ya otro usuario, no podrías acceder a él ya que la clave de cifrado es suya y sólo desbloqueable con su contraseña.
La solución plausible a esto sería el cifrado convergente, que genera una clave a partir del propio archivo que quieres cifrar. De esta forma, puedes mantener el control de duplicados al mismo tiempo que mantienes los archivos seguros. Sin embargo, no parece que Mega está usando esto: las claves de cada fichero son aleatorias, y la documentación no menciona nada relativo a esto.
Quizás sea un fallo en sus términos de servicio (lo más probable, en mi opinión), o quizás un error en la documentación. O, lo más improbable de todo, que nos estén mintiendo y sí tengan mecanismos para descifrar los archivos. Pero como digo, para mí lo más probable es que sea un error de comunicación y no de programación de Mega.
Conclusión: Mega no está blindado, y tampoco tiene seguridad de alto nivel
Con todo esto, parecería que Mega es lo más seguro que te puedas encontrar. En mi opinión, no lo es. Dropbox o SkyDrive, por ejemplo, también cifran los archivos en su servidor con una clave que también está protegida. También cifran las descargas y cargas de archivos desde tu ordenador a sus servidores.
Diréis que Mega tiene la ventaja de que la clave se almacena cifrada en sus servidores y no pueden acceder a ella y por tanto no pueden acceder a vuestros archivos, mientras que Dropbox o SkyDrive sí que pueden hacerlo porque la clave la tienen ellos. En realidad no es una ventaja. Si no os fiáis de que los segundos no accedan a vuestros archivos, ¿por qué fiaros de que Mega entonces? No podéis saber si va a guardar vuestras claves sin cifrar, ni tampoco si los archivos JavaScript de su página cifran correctamente los datos.
Mega, Dropbox, SkyDrive, SugarSync y el resto de servicios de almacenamiento en la nube están protegidos muy bien contra atacantes externos, y llega un momento en el que importa más las protecciones de los servidores que las capas de cifrado que tenga cada archivo. El problema es que si no confías en ellos, ninguno es seguro por muchas claves, capas, algoritmos y demás que haya.
¿Queréis tener un almacenamiento en la nube seguro de verdad? Entonces cifrad vuestros archivos en vuestro ordenador con una clave privada propia que mantengáis oculta, sin transmitirla a nadie y que además la hayáis generado vosotros; y después subidlos a donde queráis. Entonces sí que estarán (bastante) protegidos de cualquier mirada indiscreta del servicio y de quien sea.
Pero si vais a elegir Mega por la "seguridad mejorada", os estáis equivocando. Quizá tenga muchas ventajas sobre cualquier otro servicio de almacenamiento (por poner una aquí, el precio, por ejemplo) pero ya os adelanto que la seguridad no es una de ellas.
De hecho, tanta preocupación por la privacidad viene más bien del deseo de protegerse ellos mismos. Si no saben qué tienen los usuarios, no pueden recriminarles los contenidos que tengan alojados porque nadie sabe cuáles son, y tampoco pueden establecer un filtro para que nadie suba contenido protegido con copyright. En este caso, la protección es más para ellos que para los usuarios.
Ver 47 comentarios