¿Por qué todavía podemos romper fotos de Snapchat en 12 líneas de Ruby?

107

Acabo de encontrar este poco de rubí que se puede usar para descifrar las fotos de Snapchat tomadas de la memoria caché en un teléfono, aparentemente adaptadas de aquí . Para mi sorpresa, funcionó sin problemas, teniendo en cuenta los problemas relacionados con la seguridad de Snapchat, que han sido bien publicitados últimamente (en su mayoría, todo el número de teléfono / nombre de usuario se filtra).

require 'openssl'

ARGV.each do|a, index|
    data = File.open(a, 'r:ASCII-8BIT').read
    c = OpenSSL::Cipher.new('AES-128-ECB')
    c.decrypt
    c.key = 'M02cnQ51Ji97vwT4'
    o = ''.force_encoding('ASCII-8BIT')
    data.bytes.each_slice(16) { |s| o += c.update(s.map(&:chr).join) }
    o += c.final
    File.open('decyphered_' + a , 'w') { |f| f.write(o) }
end

Entonces, mi pregunta es, ¿qué están haciendo mal aquí exactamente y qué podrían estar haciendo mejor para mejorar la seguridad de su aplicación en este sentido en lugar de lo que están haciendo ahora, considerando que la gente suele enviar ¿Cosas íntimas que nunca debieron compartirse por más de 10 segundos solo para una persona, y también considerando la popularidad de esta aplicación?

tldr / para todos aquellos a quienes realmente no les importa saber cómo funcionan las computadoras pero que aún quieren saber qué está pasando: Básicamente, digamos que tienes 40 millones de personas que usan Snapchat, con 16.5 millones de usuarios que se envían fotos entre sí, y cada imagen en su propia versión pequeña. Cerrado seguro todos los días. Ahora, ¿qué pasaría si le diera a esas 16.5 millones de personas la misma llave de plástico para abrir todas y cada una de estas cajas de seguridad para capturar los medios de Snapchat?

    
pregunta Dmitri DB 03.03.2014 - 09:53
fuente

9 respuestas

88

Este es un problema serio en la administración de contraseñas. El primer problema aquí es la forma en que manejaron su clave en su código fuente. SnapChat declara que envían las fotos cifradas a través de Internet, y es cierto después de todo, pero están usando una clave "precompartida" para cifrar estos datos ( Badly usando AES también en modo ECB ) por lo tanto, cada usuario alrededor del planeta tiene la clave para descifrar cada foto.

El problema aquí es, ¿cómo obtuvo Internet la clave? Un pedazo de pastel, solo lo incluyeron en cada aplicación, y alguien lo buscó .

  

¿Cuál es esta clave de cifrado mágica utilizada por todas y cada una de las aplicaciones de Snapchat?

     

M02cnQ51Ji97vwT4

     

Puede encontrar esto (en la aplicación de Android) en una cadena constante ubicada
  en com.snapchat.android.util.AESEncrypt; no es necesario excavar, es
  literalmente sentados a la espera de ser encontrados por cualquiera.

     

En una nota más positiva (quizás), en la compilación 3.0.4 (18/08/2013)
  De la aplicación de Android, por extraño que parezca, ¡hay una segunda clave!

     

1234567891123456

Es una muy mala práctica codificar una contraseña en su fuente (no importa si está en sus encabezados o en sus archivos binarios), el principal problema es que cualquiera podría encontrarla con un simple comando de "cadenas" en su archivo binario ( o mirando en algún lugar donde solía compartir su código con sus amigos ):

strings binaryFile

Luego, el usuario malintencionado puede ver cada cadena y verificar si esa es la contraseña que está buscando. Entonces, si realmente necesita codificar una contraseña en su código, es mejor que la oculte, pero esto simplemente será " seguridad a través de la oscuridad " y el usuario malintencionado terminará encontrando la clave (por lo que es mejor pensar en un enfoque diferente).

¿Qué pueden hacer para mejorar su seguridad? Bueno, podrían haber generado una clave para cada foto, o pueden compartir previamente una clave entre los clientes que van a compartir una imagen, claves públicas / privadas; hay un montón de opciones.

    
respondido por el kiBytes 03.03.2014 - 10:18
fuente
79

Porque este es un principio fundamental de la teoría de la información.

Si una máquina puede descifrar una información y mantenerla durante diez segundos, puede descifrarla y mantenerla para siempre.

Cualquier intento de disfrazar esto es simplemente humo y espejos.

    
respondido por el hakjhkjdhakjhdkja 03.03.2014 - 12:26
fuente
44

El código no está "rompiendo" el cifrado.

Simplemente está descifrando los datos con la clave de cifrado correcta que se obtuvo mediante la ingeniería inversa de la aplicación.

¿Cómo podrían hacerlo mejor? No codifique la clave de cifrado para uno.

    
respondido por el Ayrx 03.03.2014 - 10:05
fuente
19

Porque no se supone que sea impenetrablemente seguro. Snapchat es para compartir, lo que es antitético para asegurar.

Creo que han implementado lo que consideran una seguridad "suficiente" para su modelo. No les preocupa que las fotos duren más de unos pocos segundos, porque las personas siempre pueden copiarlas a través del agujero analógico. Este cifrado evita que las personas simplemente guarden los archivos para mostrarlos a sus amigos, por lo que tienen que hacer un poco de trabajo adicional. Este simple paso protege más del 99% de sus fotografías.

    
respondido por el John Deters 03.03.2014 - 12:17
fuente
7

Por diseño. No creo que el número de líneas sea relevante. Tampoco creo que el lenguaje sea relevante.

La pregunta simplificada es "¿Por qué alguien puede descifrar estos". La respuesta, porque esa era la intención.

El fondo es que el cifrado solo puede ser un servicio de labios, de la misma manera que los .pdf encriptados a menudo se envían con palabras del diccionario de cuatro letras como contraseñas.

Hay seguridad, pero es evitable en algún nivel de esfuerzo simbólico. El laico no tiene ni idea. Nosotros sabemos mejor ( Nosotros sabemos que en un mundo posterior a Snowden no podemos estar seguros de poder confiar en sitios web protegidos con SSL).

En resumen, es un candado de plástico para satisfacer la promesa de transmisión cifrada.

    
respondido por el mckenzm 04.03.2014 - 00:43
fuente
5

"Entonces, mi pregunta es, ¿qué están haciendo mal aquí"

Eso es fácil, están promoviendo una falsa sensación de seguridad en las personas que no están lo suficientemente familiarizadas con la tecnología en la que están dispuestos a confiar en el envío de información que de otra manera se consideraría privada, para extraños ...

Ese es el defecto real en el diseño.

En lugar de buscar formas más convenientes de hacerlo, deberían ayudar a criar generaciones más inteligentes, o simplemente renunciar a la instalación para que las víctimas autoinfligidas no puedan llorar.

Existen métodos de encriptación y transmisión sólidos y probados para las comunicaciones por Internet, y el objetivo final es que si desea seguridad, obtenga seguridad, si desea la posibilidad de intercepción, redistribución y malas prácticas de codificación, descargue lo que sea más caliente en la tienda de aplicaciones esta semana ...

La seguridad no es conveniente, generalmente no es divertida y no es simple. Todas las cosas que matan a una aplicación de Fly by Night.

Personalmente, me preocuparía mucho más que el desarrollador tenga acceso en cantidades masivas sobre ataques individuales ...

    
respondido por el Lolol 05.03.2014 - 18:31
fuente
4

El problema con Snapchat es que están haciendo criptografía simple, aunque en realidad necesitan DRM . Este último involucra más temas que simplemente cifrar sus datos, por ejemplo, necesita ocultar sus claves a su usuario. Parece que fallaron en este.

    
respondido por el Drunix 05.03.2014 - 15:18
fuente
2

La mala práctica combinada con estándares de seguridad depreciados ha abierto esta vulnerabilidad. Especialmente dada la 'misión' de Snapchat de hacer que las imágenes, los textos, etc. no sean reproducibles y solo se puedan ver una vez, un mejor enfoque habría sido generar aleatoriamente un PSK en cada bota y usarlo durante todo el tiempo. que la aplicación se está ejecutando, lo que hace que los datos sean inútiles en cada reinicio. Y sí, como muchos otros han dicho, la codificación de una clave de seguridad directamente en el código de una aplicación es una muy, muy mala práctica y una que podría evitarse fácilmente.

Resumiendo, para resolver fácilmente este problema:

Use una cadena generada de forma aleatoria (y un mejor algoritmo de cifrado, aunque esta mala elección puede estar relacionada de alguna manera con los requisitos más bajos del procesador y la audiencia objetivo principal [personas más jóvenes] que tienen más probabilidades de tener teléfonos inteligentes con fecha) como SSL previo clave compartida que realiza un ciclo en cada inicio, lo que hace que la memoria caché sea inútil al reiniciar la aplicación.

Muy fácil de resolver, la verdad. Parece que podrían hacerlo con una consultoría sobre las mejores prácticas de seguridad.

    
respondido por el Russell.Clare 05.03.2014 - 08:27
fuente
1

Por lo tanto, llamé a Snapchat para responder a esta pregunta que hice en su apoyo, y obtuve esto en su lugar. Así que, después de un poco más de unos pocos días, aquí está la respuesta oficial de Snapchat a una solicitud de soporte en la que me vinculo a esta publicación, y me preguntan si podrían participar con una respuesta honesta a esta pregunta. Personalmente, considero que esta es la respuesta más débil que pude haber recibido casi nada, y una indicación de una consideración disfuncional de las prácticas de seguridad y por no mencionar las relaciones públicas:

Team Snapchat replied:
Hi Dmitri,

Thank you for sharing your concerns. We remain committed to maintaining 
the security and integrity of the Snapchat community.

Best,
Tobias

Gracias, ¡Snapchat!

    
respondido por el Dmitri DB 10.03.2014 - 20:59
fuente

Lea otras preguntas en las etiquetas