KWallet 密码加密应用程序的安全性?

信息安全 加密 密码 linux
2021-09-02 20:33:40

根据http://gaganpreet.in/blog/2013/07/24/kwallet-security-analysis/,KWallet 密码管理系统相当薄弱,它使用密钥拆分、Blowfish 56 和无盐。

密钥生成可以描述为——将用户密码分成每块 16 个字符的块,并在每个块上应用 SHA1 2000 次。这是没有盐的关键拉伸。然后将这些块修剪并连接到 56 个字节,这是 Blowfish 密码允许的最大密钥长度。

它还说,虽然它使用 CBC,但它使用它的方式变成了 ECB。

KWallet 使用 CBC,或者准确地说,它假装 - 用于 CBC 的密钥大小是要加密的字符串的长度,这将 CBC 变成了不太安全的密码模式 - ECB。

我的问题是,我使用与我的 KWallet 相同的 root 密码。/etc/shadow 只能由 root 读取,但我的 .kwl 文件任何人都可以读取,因此任何人都可以获取该文件并尝试暴力破解它,并可能成功。

那么有什么办法可以提高 KWallet 的安全性吗?这不仅适用于我手动输入的密码,还适用于依赖 KWallet 存储密码的网络浏览器和应用程序(例如 Chromium),因此我不能只切换到另一个程序。也许我可以编辑源代码,或者找到一个兼容的分支?

我的最后一个问题是:有什么方法可以提高 KWallet 的安全性,以及使用它的安全问题有多大?

4个回答

您引用的博客文章的表述非常不精确。但是,通过查看 KWallet 源代码,尤其是这个文件(用于密码散列)和那个文件(用于调用加密代码),我们看到以下内容:

通过重复应用 SHA-1 ,密码被扩展为大小为 20、40 或 56 字节(160、320 或 448 位)的对称密钥。即:

  • 如果密码长度为 0 到 16 个字符,则密钥的长度为 20 字节,并且是对密码重复应用 SHA-1(2000 次)(密码经过哈希处理,然后再次对 20 字节输出进行哈希处理,并且再次,对于 SHA-1 的 2000 次调用)。

  • 如果密码长度为 17 到 32 个字符,则密钥的长度为 40 个字节:前 16 个字符按上述处理,其余字符按类似处理,产生 20 个以上字节。

  • 如果密码长度为 33 到 48 个字符,则密钥长度为 56 个字节:前 16 个字符按上述处理,第二个 16 个字节字符的块也是如此,然后是第三个块;然后第一个块的输出被截断为 16 个字节,总共 56 个字节。

  • 如果密码长度为 49 个或更多字符,则 2000 次 SHA-1 调用将发生四次。对于第四块,将使用密码的其余部分。然后将四个 20 字节的输出分别截断为 14 字节,然后将它们连接起来,产生一个 56 字节的输出。

作为密码散列函数,它很差。它笨重而且不规则。它没有加盐,允许有效的并行攻击,当必须破坏几个 KWallet 实例时(像往常一样,“并行性”也意味着可以使用预先计算的表,从而消除 2000 SHA-1 调用的减慢效果)。此外,它会“拆分”密码,因此如果攻击者找到密码哈希,那么他可以独立于其他块攻击每个块。这意味着整个事物的安全性在很大程度上取决于 Blowfish 块密码在用作散列函数时的表现。充其量,这是一个研究不足的属性。

加密声称使用 CBC,但没有。在 CBC 中,您应该加密一系列(使用 Blowfish 每块 8 个字节);在加密一个块之前,它首先与前一个加密块进行异或。对于第一个块,我们必须变出一个正式的“前一个块”,即初始化向量CBC 需要随机 IV。

在 KWallet 代码中,我们看到该代码确实准备了一个大小合适的随机 IV……然后完全无法执行 CBC。对加密的调用是:

int rc = bf.encrypt(wholeFile.data(), wholeFile.size());

(第 291 行backendpersisthandler.cpp

查看此encrypt()方法的实现,在 中cbc.cc,我们看到它将创建一个与整个文件大小相同的临时缓冲区;然后用零填充它;然后将所有这些零与要加密的数据进行异或(这不会改变数据......);然后继续彼此独立地加密每个块。这确实是 ECB 模式,而不是 CBC。很明显,这是一个编程错误;但是,要吸取的教训是,由于 KWallet 似乎可以工作,因此没有检测到错误:无法通过功能测试安全性

(这意味着计算出来的随机 IV 在这里什么都不做;它本身是加密的,但不会影响整个文件中的任何其他字节。)

众所周知, ECB 模式在以下方面很弱:它会泄露有关哪些块彼此相等的信息。对于未压缩的图片,这是致命的,如通常的企鹅图像所示。对于 KWallet 来说,这是一个令人担忧的来源:内部结构有一些冗余,这可能是可利用的,尽管需要一些努力来确定问题的严重程度。

请注意,由于密码未加盐,因此受相同密码保护的两个连续版本的 KWallet 将使用相同的对称密钥,因此 ECB 泄露的块等式适用于所有连续版本的 KWallet。

有一个自制的MAC。文件的最后 20 个字节(不包括一些填充)包含在其余部分上计算的 SHA-1 值。一般来说,这不是一个好的 MAC。如果加密使用 RC4 或 CTR 模式下的分组密码,那将是一个非常糟糕的 MAC。在 ECB 模式下使用分组密码(如此处使用的),它并没有那么糟糕,但仍然很差。


整个代码都散发着自制加密货币的味道,被不掌握这些概念的人拼凑在一起。这不好。另外,我发现代码在很多方面都很糟糕(例如,当密码块被散列时,重复调用 SHA-1 的循环被无情地重复;这是一种射击罪行)。为了“改进” KWallet,我建议删除整个代码并从头开始。

代码似乎包含一些可选的支持,不做密码散列和加密本身(正如我们所见,它做得很差),而是使用GnuPG现在这是个好主意。GnuPG 实现了OpenPGP 格式,尽管它有所有缺点,但至少在密码学上是不错的(如果使用得当),而且 GnuPG 也被认为是一个相当不错的实现。要改善 KWallet 的存储,请查看您是否可以说服您的计算机使用此 GnuPG 支持代码和格式。

我是写有问题的原始博客文章的人。我还写了一个Python 脚本来读取 KWallet 文件,应该比原来的 KWallet 代码更容易理解。

不过,汤姆的分析很到位。我尝试为普通用户写文章,并没有深入研究技术细节。KWallet 代码处于可怕的状态,除了所描述的安全问题之外,该代码的文档记录非常差。KDE 5 将带来一个全新的密码存储,这还需要一段时间。

带有 GnuPG 的 KWallet 正在开发中,但尚未发布。它将随 KDE 4.12 一起提供。

  • 您应该做的第一件事是不要使用与 root 相同的密码。根是神圣的!
  • 您可以通过创建一个TrueCrypt卷并将其放入其中来更好地保护密码数据库。
  • 您可以编辑源代码,但前提是您真的知道自己在做什么。如果您不确切知道在源代码中要做什么,则可能会使情况变得更糟。
  • 最后,您应该看看KeePass,它是开源的、跨平台的和出色的密码生成器/管理器。

由于 KWallet 仍然是 KDE 中的默认密码管理器,我认为这值得更新。

当前状态,2021 年 4 月

此问题中最初讨论的安全漏洞和 2013 年的答案(特别是Tom Leek 的答案)在CVE-2013-7252中公开,该文章链接回此问题中引用的同一博客文章,该文章本身链接回 Tom Leek 的分析这里。

这些问题已经得到解决。特别是在 4.12 中添加了 GPG 支持kde-runtime,在 4.13 中改进了密码加密在 KDE Applications 14.12.1 和 KF5::KWallet 5.6.0 中解决了 ECB/CBC 问题
(注意:据我了解,在后一个链接中,“kde-runtime KWallet”是指较旧的“KWallet 4”,“KF5::KWallet”是指较新的“KWallet 5”。)

现代 KWallet不应该有这些漏洞,至少在使用 GPG 支持时(这篇文章建议使用 Kleopatra 而不是 KGPG 来设置它)。但这并不是说没有任何其他漏洞例如:

  1. 密码数据库和 GUI 管理器一起解锁。当数据库解锁时,查看存储的密码不需要额外的密码。任何有权访问 PC 的人都可以通过 GUI 以纯文本形式查看每个存储的密码。在用户会话的整个持续时间内保持解锁状态的常见做法使情况变得更糟。
  2. 同样,数据库本身在解锁时存储为纯文本。在此期间,数据库安全性仅与文件系统安全性一样好(实际上更糟糕的是,由于其他访问选项,例如上面的第 1 点)。
  3. 任何应用程序都可以通过 CLI 查询数据库,并且不同应用程序的密码之间没有隔离。因此,恶意应用程序可能会查询另一个应用程序的密码(公平地说,这可能也是其他密码存储的问题。)
  4. 当应用程序请求访问钱包时,消息并不总是清楚说明哪个应用程序正在尝试访问。所以很难判断它是否是一个合法的请求。此外,很容易为此类请求模拟有效的应用程序。
  5. 它曾经并且很可能仍然容易受到键盘记录器和ptrace攻击

Plasma-devel 邮件列表上2016 年的这个帖子提供了更多详细信息。

其中一些可以通过禁用自动解锁、启用自动锁定以及每次应用程序尝试访问钱包时要求提示来降低用户的便利性,从而降低用户的便利性。此外,不要将高度敏感的机密与您的应用程序密码一起存储并对真正敏感的内容使用双重身份验证,例如您的电子邮件(可用于重置您的许多其他密码)、银行帐户/网站和信用卡/网站密码。

PAM 自动解锁:

如上所述,自动解锁本身已经降低了安全性,但根据 ArchWiki,它实际上更糟:

  • kwallet-pamGnuPG密钥不兼容,KDE 钱包必须使用标准blowfish加密。
  • 钱包必须命名kdewallet(默认名称)。它不会解锁任何其他钱包。

所以你要么得到GPG要么得到自动解锁,而不是两者;并且默认钱包名称很容易被恶意脚本猜测(尽管脚本无论如何都可以ls在钱包文件夹中运行)。

KSecretsService,QtKeyChain, libsecret

过去,有人试图用KSecretsService(又名KSecrets )替换 KWallet 。这是FreeDesktop Secret Service API 草案的实现,它也由GNOME Keyring实现。但由于缺乏开发人员时间,以及 Linux 生态系统的新发展,这被放弃了。

在 Plasma-devel 邮件列表中进行了讨论,共识似乎是将 KDE 应用程序迁移到QtKeyChain,这会将 API 与后端实现分开。我不知道是否遵循了该决定,但鉴于QtKeyChain 上的活动水平,这似乎是一个合理的假设(这篇文章也证实了这一点)。

几个月后,QtKeyChain增加了对 的支持libsecret,它也是基于 FreeDesktop Secret Service(自 QtKeyChain 0.8 起包含)。最近, QtKeyChainlibsecret 现在需要它(除非禁用)。

libsecret它本身是一个替代品libgnome-keyring(但没有 GNOME 依赖项),因此 GNOME 应用程序也应该迁移到libsecret.

KeePassXC 和 KDE 集成

KeePassXC是 KeePassX 的现代继承者,它本身就是KeePass的 Linux 端口。KeePassXC 通过 Qt5 实现跨平台。增加了对 2.5.0 (2019) 版本的libsecret支持理论上(我自己还没有测试过),这应该允许 KDE 应用程序与 KeePassXC 通信,如果这些 KDE 应用程序使用 QtKeyChain

(注意:KeePassXC已经在客户端隔离方面做了一些工作,但这还不是一个完整的解决方案。)

免责声明

我不是安全专家。此处提供的信息只是我在 Google 中找到的内容的摘要。对于因您使用此处提供的信息或建议而导致的任何损害、数据或财务损失、安全漏洞、不便等,我概不负责。使用风险自负。

参考

  1. CVE-2013-7252
  2. 错误 1048169 - CVE-2013-7252 kwallet:加密滥用 [fedora-all] - Bugzilla
  3. KDE 安全公告 2015 年 1 月 9 日
  4. KWallet 的情况,该怎么办?- Plasma-devel 邮件列表,2016
  5. kwallet 的安全性如何 - KDE 论坛
  6. 驯服 KDEwallet:使用 GPG - 关于计算的思考
  7. 无法配置 Kgpg kwalletmanager - AskUbuntu
  8. 登录时自动解锁 KDE 钱包 - ArchWiki
  9. KSecretsService - KDE.org , KSecrets - GitHub
  10. 秘密服务 API 草案 - FreeDesktop.org
  11. Libsecret 透露 - LWN.net
  12. libsecret 在 Focal - Ubuntu 软件包
  13. QtKeyChain 提交历史 - GitHub
  14. QtKeyChain PR62:添加了 libsecret 支持 - GitHub
  15. KeePassXC PR2726:实现 Freedesktop.org 秘密存储 - GitHub