gpg2:警告:使用的内存不安全!


11

从今天开始,每当我gpg2在Mac(10.12.1)上使用(通过Homebrew安装)时,现在都会看到以下警告:

Warning: using insecure memory!

对于它的价值,我在两台不同的机器上都看到了相同的行为:Mac mini(2012年末)和MacBook Pro(2012年末),两者都运行10.12.1。

正如GnuPG常见问题解答所说:

GnuPG尝试锁定内存,以便其他进程都看不到它,并且不会将内存写入交换区。如果由于某种原因它不能执行此操作(例如,某些平台不支持这种内存锁定),则GnuPG会警告您它正在​​使用不安全的内存。

尽管使用安全内存几乎总是更好,但使用不安全内存不一定不是一件坏事。如果您拥有计算机,并且确信它没有恶意软件,则可以忽略此警告。

gpg220169月12日以来一直没有改变过,这让我感到困惑。从那时起,我或多或少安装了2.0.30版,但是今天我才开始看到有关内存不安全的警告。即使gpg2自2016年9月12日以来公式未更改,但我可以肯定地说的是,我在看到此警告之前在两台计算机上都做了这件事brew update && brew upgrade。但是我什至不知道那会如何影响这一点。根据GnuPG常见问题解答的说法,这似乎与操作系统和内存锁定有更多关系。

...而且更奇怪的是,我还gpg1从Homebrew(版本1.4.21)安装了该软件,当我使用它时不会警告内存不安全:

$ gpg1 --require-secmem
gpg: Go ahead and type your message ...
^C
gpg: Interrupt caught ... exiting

$ gpg2 --require-secmem
Warning: using insecure memory!
gpg: will not run with insecure memory due to --require-secmem

这两个二进制文件属于相同的所有者和组,并且具有相同的权限:

-r-xr-xr-x  1 adamliter  admin  681932 Dec 10 18:06 /usr/local/Cellar/gnupg2/2.0.30_2/bin/gpg2
-r-xr-xr-x  1 adamliter  admin  929352 Aug 17 09:21 /usr/local/Cellar/gnupg/1.4.21/bin/gpg1

我只是尝试gpg2使用Homebrew 重新安装:既通过使用预编译的二进制文件,也通过构建表单源进行了安装,但这并没有任何改变。我仍然收到有关使用不安全内存的警告。

此外,即使使gpg2二进制具有翻转的setuid根位(作为建议,例如此处)不原因的消息消失; 它仍然警告使用不安全的内存。

有谁知道会发生什么变化,使我今天突然开始看到此警告?当使用gpg2二进制文件而不使用二进制文件时,为什么会看到它gpg1呢?

其他可能相关的信息:

$ which gpg1
/usr/local/bin/gpg1
$ ls -al /usr/local/bin/gpg1
lrwxr-xr-x  1 adamliter  admin  31 Aug 17 17:42 /usr/local/bin/gpg1 -> ../Cellar/gnupg/1.4.21/bin/gpg1
$ which gpg2
/usr/local/bin/gpg2
$ ls -al /usr/local/bin/gpg2
lrwxr-xr-x  1 adamliter  admin  34 Dec 10 18:06 /usr/local/bin/gpg2 -> ../Cellar/gnupg2/2.0.30_2/bin/gpg2

更新资料

我认为发生这种情况的原因是由于的新版本libgcrypt。我仍然不知道为什么会这样,但是我很确定这至少是问题的根本原因。该公式libgcrypt今天刚刚更新了1.7.4凸块; 这可以解释为什么我在一秒钟后在两台不同的电脑上看到这个brew update && brew upgrade。它还将说明为什么它不会发生gpg1,因为它gpg1不依赖外部libgcrypt密码库,而是使用其自己的集成密码库。

此外,我还gpg2从MacGPG套件安装了该套件,该套件没有出现此问题,并且链接到另一个版本的libgcrypt

$ /usr/local/MacGPG2/bin/gpg2 --version
gpg (GnuPG/MacGPG2) 2.0.30
libgcrypt 1.6.6
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ gpg2 --version
gpg (GnuPG) 2.0.30
libgcrypt 1.7.4
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

因此,我猜测这可能是的维护者的错误报告libgcrypt。我将发布到他们的邮件列表中,但是暂时将其保留在此处,以防其他人遇到相同的问题和/或其他人知道确切的原因。如果在向他们的邮件列表发送消息后得到确认,这是一个错误,我将投票关闭该问题。


我真的不知道,如果这个问题是最合适的位置,在Apple.SE,或者如果它更适合Unix.SE。我之所以首先在这里询问,是因为GnuPG常见问题解答建议这可能与操作系统和内存锁定有关,但是如果您另有意见,请随时提出迁移建议。
亚当·利特

techrepublic.com/blog/it-security/the-insecure-memory-faq似乎表明,原因可能是由于您的环境的RAM不足,因此需要写入数据以交换空间。
sideshowbarker

@sideshowbarker这也是我最初的想法,但是(i)不会解释gpg1和的行为之间的差异gpg2,以及(ii)测试此功能时我一直在监视计算机上的内存,并且有大量未使用的内存当我看到警告消息时。我认为我已经定位了问题的根源,但是我仍然不确定为什么会这样。将在一秒钟内更新问题。
亚当·里特(Adam Liter)2016年

@sideshowbarker更新了!
亚当·里特(Adam Liter)

Answers:


9

我注意到的gpg1和之间的区别gpg2是由于gpg2使用了外部密码库libgcrypt,而gpg1使用了集成密码库。

特别是,Homebrew libgcrypt在12月10更新到1.7.4版,该版本libgcrypt代码中引入了回归,从而导致不安全的内存警告。

最初在pull请求中libgcrypt对此进行了一些讨论,将1.7.4 的公式引入Homebrew,表明它可能是设计使然

尽管如此,事实证明这确实是一个错误。具体的错误报告在这里提交:

该错误已在此提交中修复,并在libgcrypt1.7.5 中发布了此修复程序,在撰写本文时,由于Dominyk Tiller现在已成为Homebrew安装的版本。因此,要解决此问题,您只需做一个即可brew update && brew upgrade


为了后代的缘故,以下是该答案的旧版本中的一些信息,在确认这是以下方面的错误之前libgcrypt

有一两件事可以做,如果你不想总是看到不安全的内存警告是添加no-secmem-warning~/.gnupg/gpg.confGnuPG常见问题解答旧版本指出:

如果您的系统使用加密的交换分区,则不必锁定页面以免被交换出去。实际上,这是保护敏感数据免于存储在磁盘上的最佳方法。如果您的系统允许加密交换分区,请使用该功能。请注意,GPG不了解加密的交换分区,因此可能会显示警告;因此,如果交换分区已加密,则应禁用警告。如果您不能或不想安装GnuPG setuid(root),则可能还想禁用此警告。要禁用警告,请在一行

no-secmem-warning

到您的~/.gnupg/gpg.conf文件中。

据我所知,macOS确实使用了加密交换空间。例如,对于我来说,sysctl vm.swapusage返回:

vm.swapusage: total = 1024.00M  used = 234.75M  free = 789.25M  (encrypted)

此外,正如@sideshowbarker评论中指出的那样,gnupg-users邮件列表中有一个帖子,它表示忽略此警告相对安全:

[...] 没有root特权就<understatement>很难</understatement>利用不安全的内存-如果攻击者在您的计算机上拥有root特权,那么反正一切都结束了。


鉴于github.com/Homebrew/homebrew-core/pull/…以及libgcrypt维护者似乎故意破坏了这一事实,可能值得在此添加的是,可以通过将行添加no-secmem-warning~/.gnupg/gpg.conf文件中来抑制消息。如lists.gnupg.org/pipermail/gnupg-users/2015-December/054771.html所述,“在没有root特权的情况下利用不安全的内存是非常困难的-如果攻击者在您的计算机上拥有root特权,那么反正一切都结束了。 ”。因此,警告从一开始就不是很有用。
sideshowbarker
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.