为什么我们仍然可以在 12 行 Ruby 中破解 snapchat 照片?

信息安全 加密 密码学 应用安全 移动的
2021-08-17 01:50:58

刚刚发现了一点红宝石,它可以用来解密从手机缓存中取出的 Snapchat 照片,显然是从这里改编的。令我惊讶的是,考虑到最近广为人知的有关 Snapchat 安全性的问题(据我回忆,主要是围绕整个电话号码/用户名泄露的问题),它没有任何问题。

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

所以,我的问题是,考虑到人们经常发送私密的东西从来没有打算只与一个人分享超过 10 秒,并且还考虑到这个应用程序的受欢迎程度?

tldr/对于那些并不真正关心计算机如何工作但仍想知道发生了什么的人:基本上,假设您有4000 万人使用 Snapchat,有 1650 万用户互相发送图片,每张图片每天都在自己的小保险箱里。现在,如果你给这 1650 万人一把同样脆弱的塑料钥匙来打开每一个密码箱来捕捉 Snapchat 媒体会怎样?

4个回答

这是密码管理中的一个严重问题。这里的第一个问题是他们在源代码中管理他的密钥的方式。SnapChat 声明他们通过互联网发送加密的照片,毕竟这是真的,但他们使用“预共享”密钥来加密这些数据(在 ECB 模式下也糟糕地使用 AES)所以,地球上的每个用户都有破译每张照片的关键。

这里的问题是,互联网是如何获得密钥的?小菜一碟,他们只是将它包含在每个应用程序中,并且有人只是搜索它

任何和所有 Snapchat 应用程序使用的这个神奇的加密密钥是什么?

M02cnQ51Ji97vwT4


您可以在位于com.snapchat.android.util.AESEncrypt的常量字符串中找到它(在 Android 应用程序中) ;不需要挖掘,它
实际上是坐在那里等待任何人找到。

在更积极的方面(也许),在
Android 应用程序的 3.0.4 (18/08/2013) 版本中,有 - 奇怪的是 - 第二个键!

1234567891123456

在您的源代码中硬编码密码是一种非常糟糕的做法(无论它是在您的标头中还是在您的二进制文件中),主要问题是任何人都可以通过一个简单的“字符串”命令在您的二进制文件中找到它(或者通过查看在您曾经与朋友分享您的代码的某个地方):

strings binaryFile

然后恶意用户可以查看每个字符串并检查这是否是他正在寻找的密码。所以,如果你真的需要在你的代码中硬编码一个密码,你最好隐藏它,但这只是“通过默默无闻的安全”,恶意用户最终会找到密钥(所以你最好用不同的方法思考)。

他们可以做些什么来提高他们的安全性?好吧,他们可以为每张照片生成一个密钥,或者他们可以在要共享图片的客户端之间预先共享一个密钥,公钥/私钥;有很多选择。

因为这是信息论的一个基本原理。

如果一台机器可以解密一条信息并保存十秒钟,它就可以解密并永远保存它。

任何试图掩饰这一点的尝试都只是雾里看花。

该代码不会“破解”加密。

您只是使用通过对应用程序进行逆向工程获得的正确加密密钥来解密数据。

他们怎么能做得更好?不是硬编码一个加密密钥。

因为它不应该是无懈可击的安全。Snapchat 用于共享,这与安全性是对立的。

我认为他们已经为他们的模型实施了他们认为“足够”的安全性。他们不太关心持续时间超过几秒钟的照片,因为人们总是可以通过模拟孔复制它们。这种加密可以防止人们简单地保存文件以显示给他们的朋友,因此他们必须做一些额外的工作。这个简单的步骤可以很好地保护他们 99% 以上的照片。