gpg2: Aviso: usando memória não segura!

11

Hoje, sempre que eu uso gpg2(instalado via Homebrew) no meu Mac (10.12.1), agora vejo o seguinte aviso:

Warning: using insecure memory!

Pelo que vale, estou vendo esse mesmo comportamento em duas máquinas diferentes: um Mac mini (final de 2012) e um MacBook Pro (final de 2012), ambos executando a versão 10.12.1.

Como o FAQ do GnuPG diz:

O GnuPG tenta bloquear a memória para que nenhum outro processo possa vê-la e para que a memória não seja gravada para troca. Se, por algum motivo, não for capaz de fazer isso (por exemplo, certas plataformas não suportam esse tipo de bloqueio de memória), o GnuPG avisará que ele está usando memória não segura.

Embora quase sempre seja melhor usar memória segura, não é necessariamente uma coisa ruim usar memória insegura. Se você possui a máquina e está confiante de que não está abrigando malware, esse aviso provavelmente poderá ser ignorado.

O que me deixa perplexo é que gpg2não mudou desde 12 de setembro de 2016 . Eu tive a versão 2.0.30 instalada mais ou menos desde então, mas só comecei a ver esse aviso sobre memória insegura hoje. Mesmo que a gpg2fórmula não tenha sido alterada desde 12 de setembro de 2016, a única coisa que posso dizer com certeza que fiz nas duas máquinas antes do início da visualização desse aviso é a brew update && brew upgrade. Mas nem tenho certeza de como isso poderia afetar isso; dado o que o FAQ do GnuPG diz, parece que isso tem mais a ver com o sistema operacional e o bloqueio de memória.

... E o mais estranho é que eu também gpg1instalei a partir do Homebrew (versão 1.4.21), que não avisa sobre memória insegura quando a uso:

$ 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

Os dois binários pertencem ao mesmo proprietário e grupo e têm as mesmas permissões:

-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

Eu apenas tentei reinstalar gpg2com o Homebrew: usando o binário pré-compilado e criando a fonte do formulário, mas isso não muda nada. Ainda recebo o aviso sobre o uso de memória não segura.

Além disso, mesmo tornar o gpg2 binário com o bit raiz setuid invertido (como sugerido, por exemplo , aqui ) não faz com que a mensagem desapareça; ele ainda adverte sobre o uso de memória não segura.

Alguém sabe o que poderia ter mudado de tal forma que de repente eu começaria a ver esse aviso hoje? E por que eu estaria vendo isso ao usar o gpg2binário, mas não o gpg1binário?

Outras informações possivelmente relevantes:

$ 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

Atualizar

Eu acho que a razão pela qual isso está acontecendo é por causa da nova versão do libgcrypt. Ainda não sei por que está acontecendo, mas tenho certeza de que essa é pelo menos a causa raiz do problema. A fórmula para libgcryptfoi atualizada hoje hoje para o bump 1.7.4; isso explicaria por que estou vendo isso em dois computadores diferentes depois de um brew update && brew upgrade. Também explicaria por que não está acontecendo gpg1, porque gpg1não confiava na libgcryptbiblioteca criptográfica externa , em vez disso, usando sua própria biblioteca criptográfica integrada.

Além disso, eu também gpg2instalei a partir do MacGPG Suite, que não apresenta esse problema e está vinculado a uma versão diferente de 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.

Portanto, acho que esse é provavelmente um relatório de bug para os mantenedores do libgcrypt. Vou postar na lista de discussão deles, mas deixarei isso aqui por enquanto, caso alguém encontre o mesmo problema e / ou se alguém souber por que exatamente isso está acontecendo. Se eu receber uma confirmação após enviar uma mensagem para a lista de discussão de que isso é um bug, votarei para encerrar esta pergunta.

Adam Liter
fonte
Estou sinceramente não tenho certeza se esta pergunta é mais apropriada aqui, em Apple.SE, ou se é mais apropriado para Unix.SE . Eu perguntei aqui primeiro, porque as perguntas frequentes do GnuPG sugerem que pode haver algo sobre o sistema operacional e o bloqueio de memória, mas fique à vontade para sugerir uma migração, se você pensar em contrário.
Adam Liter
techrepublic.com/blog/it-security/the-insecure-memory-faq parece sugerir que a causa pode ser devido ao seu ambiente ter pouca memória RAM e, portanto, precisar gravar dados para trocar espaço.
Sideshowbarker
@sideshowbarker Esse foi o meu pensamento inicial também, mas (i) isso não explica as diferenças entre o comportamento de gpg1e gpg2, e (ii) eu tenho monitorado a memória no meu computador ao testar isso, e há muita memória não utilizada quando vejo a mensagem de aviso. Acho que localizei a raiz do problema, mas ainda não sei por que isso está acontecendo. Atualizará a pergunta em um segundo.
Adam Liter
@sideshowbarker Atualizado!
Adam Liter

Respostas:

9

A diferença entre gpg1e gpg2que eu estava percebendo decorre do fato de que gpg2usa uma biblioteca criptográfica externa libgcrypt, enquanto que gpg1usa uma biblioteca criptográfica integrada.

E, especificamente, o Homebrew foi atualizado para a versão 1.7.4 do libgcryptem 10 de dezembro , que introduziu uma regressão no libgcryptcódigo, levando ao aviso inseguro de memória.

Inicialmente, houve um pouco de discussão sobre isso na solicitação pull que introduziu a fórmula para libgcrypt1.7.4 no Homebrew , sugerindo que pode ser por design:

No entanto, verifica-se que isso foi realmente um bug. O relatório de erro específico foi arquivado aqui:

O bug foi corrigido neste commit e a correção foi lançada na libgcrypt1.7.5, que, no momento da redação deste artigo, agora é a versão que o Homebrew instala graças ao Dominyk Tiller . Assim, para corrigir esse problema, você pode simplesmente fazer a brew update && brew upgrade.


Para o bem da posteridade, aqui estão algumas informações de uma versão antiga desta resposta antes de confirmar que isso era um bug libgcrypt:

Uma coisa que você pode fazer se preferir nem sempre ver o aviso sobre memória insegura é adicionar no-secmem-warninga ~/.gnupg/gpg.conf. Uma versão antiga do FAQ do GnuPG aponta:

O bloqueio de páginas contra a troca não é necessário se o seu sistema usar uma partição de troca criptografada. Na verdade, essa é a melhor maneira de proteger dados confidenciais para que acabem em um disco. Se o seu sistema permitir partições de troca criptografadas, use esse recurso. Observe que o GPG não sabe sobre partições de troca criptografadas e pode imprimir o aviso; portanto, você deve desativar o aviso se sua partição de troca estiver criptografada. Você também pode desativar esse aviso se não puder ou não quiser instalar o GnuPG setuid (root). Para desativar o aviso, você coloca uma linha

no-secmem-warning

no seu ~/.gnupg/gpg.confarquivo.

Até onde eu sei, o macOS usa espaço de troca criptografado. Para mim, por exemplo, sysctl vm.swapusageretorna:

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

Além disso, como @sideshowbarkerapontado nos comentários , também há uma postagem na lista de discussão gnupg-users , que diz que é relativamente seguro ignorar este aviso:

[...] é <understatement>muito difícil </understatement>explorar a memória insegura sem privilégios de root - e se o invasor tiver privilégios de root na sua máquina, está tudo acabado.

Adam Liter
fonte
À luz do github.com/Homebrew/homebrew-core/pull/… e o fato de os libgcryptmantenedores terem quebrado isso intencionalmente, vale a pena acrescentar aqui que a mensagem pode ser suprimida adicionando a linha no-secmem-warningao ~/.gnupg/gpg.confarquivo. Como observa lists.gnupg.org/pipermail/gnupg-users/2015-December/054771.html , “é muito difícil explorar a memória insegura sem privilégios de root - e se o invasor tiver privilégios de root na sua máquina, estará tudo acabado de qualquer maneira. ”. Portanto, o aviso não é muito útil para começar.
sideshowbarker