Acabo de encontrar este poco de rubí que se puede utilizar para descifrar Snapchat fotos tomadas de la memoria caché en un teléfono, al parecer adaptado de aquí. Para mi sorpresa, funcionó sin problemas, teniendo en cuenta los problemas en torno a Snapchat's de seguridad que han sido bien publicitado últimamente (Sobre todo las cosas en torno a todo el número de teléfono / nombre de usuario de fuga por lo que yo recuerdo).
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
Por lo tanto, mi pregunta es, ¿qué es exactamente lo que están haciendo mal aquí, y lo que podrían estar haciendo mejor con el fin de mejorar la seguridad de su aplicación en este sentido en lugar de lo que están haciendo ahora, teniendo en cuenta que las personas a menudo envían cosas íntimas que nunca fueron destinados a ser compartidos por más de 10 segundos sólo a una persona, y también teniendo en cuenta la popularidad de esta aplicación?
tldr/for all those who don't really care to know how computers work but still want to know what is up: Básicamente, digamos que tienes 40 millones de personas que usan Snapchat, con 16,5 millones de usuarios enviándose fotos, y cada foto en su propia pequeña caja fuerte cerrada cada día. Ahora bien, ¿qué pasaría si a todos esos 16,5 millones de personas les dieras la misma llave de plástico endeble para abrir todas y cada una de esas cajas de seguridad y capturar el contenido multimedia de Snapchat?
Este es un grave problema en la gestión de contraseñas. El primer problema aquí es la forma en que gestionaron su clave en su código fuente. SnapChat afirma que envían las fotos cifradas a través de Internet, y es cierto después de todo, pero están utilizando un "pre-shared" clave para cifrar estos datos (mal usando también AES en modo ECB) así, cada usuario en todo el planeta tiene la clave para descifrar cada foto.
El problema aquí es, ¿cómo consiguió internet la clave? Pan comido, simplemente la incluyeron en cada aplicación, y alguien simplemente la buscó.
¿Qué es esta clave de encriptación mágica utilizada por todas y cada una de las aplicaciones de Snapchat?
M02cnQ51Ji97vwT4 > Puedes encontrarla (en la aplicación Android) en una cadena constante situada en com.snapchat.android.util.AESEncrypt; no es necesario excavar, es literalmente sentado a la espera de ser encontrado por cualquier persona.
; En una nota más positiva (tal vez), en la 3.0.4 (18/08/2013) build de la aplicación para Android, hay - por extraño que parezca - ¡una segunda tecla!
; 1234567891123456
Es una muy mala práctica hardcodear una contraseña en tu código fuente (no importa si está en tus cabeceras o en tus binarios), el principal problema es que cualquiera podría encontrarla con un simple comando "strings" en tu binario (o buscando en algún lugar donde solías compartir tu código con tus amigos):
strings binaryFile
Entonces el usuario malicioso puede echar un vistazo a cada cadena y comprobar si esa es la contraseña que está buscando. Por lo tanto, si usted realmente necesita hardcode una contraseña en su código es mejor ocultarlo, pero esto sólo será "la seguridad a través de la oscuridad" y el usuario malicioso terminará por encontrar la clave (así que mejor pensar en un enfoque diferente).
¿Qué pueden hacer para mejorar su seguridad? Pues podrían haber generado una clave para cada foto, o pueden precompartir una clave entre los clientes que van a compartir una foto, claves públicas/privadas; hay un montón de opciones.
El código no es "cracking" el cifrado.
Simplemente está descifrando los datos con la clave de cifrado correcta que se obtuvo mediante ingeniería inversa de la aplicación.
¿Cómo podrían hacerlo mejor? Para empezar, no codificar la clave de cifrado.
Porque no se supone que sea impenetrablemente seguro. Snapchat sirve para compartir, que es lo opuesto a la seguridad.
Creo que han implementado lo que consideran "suficiente" seguridad para su modelo. No les preocupa demasiado que las fotos duren más de unos segundos, porque la gente siempre puede copiarlas a través del agujero analógico. Este cifrado impide que la gente simplemente guarde los archivos para enseñárselos a sus amigos, así que tienen que hacer un poco de trabajo extra. Este sencillo paso protege suficientemente bien más del 99% de sus fotografías.