OpenPGP é reescrito em Rust: o projeto Sequoia



Sequoia Stagg em Alder Creek, Califórnia



Em 2018, três ex-desenvolvedores de GnuPG começaram a trabalhar no projeto Sequoia , uma implementação do OpenPGP em Rust. Como você sabe, OpenPGP é um padrão de criptografia de dados aberto frequentemente usado para e-mail seguro; e o GnuPG é a implementação de referência deste padrão.



Os próprios desenvolvedores declararam a motivação para a criação de uma nova biblioteca OpenPGP:



  • O GnuPG é difícil de modificar. O código e a API vêm se acumulando há mais de 21 anos. Não há testes de unidade. Os componentes estão intimamente relacionados entre si. A arquitetura deixa muito a desejar e a refatoração simples não ajudará.

  • Muitos desenvolvedores estão descontentes com as APIs do GnuPG. A ferramenta de linha de comando GnuPG e as bibliotecas de programação correspondentes têm funcionalidades diferentes, com alguns comandos disponíveis apenas na linha de comando.

  • Rust é uma linguagem segura para a memória que elimina automaticamente toda uma classe de bugs.

  • O GnuPG não pode ser usado no iOS devido a restrições GPL.


A biblioteca Sequoia, com licença GPLv2, está agora se aproximando da versão 1.0 , embora ainda haja vários problemas a serem resolvidos .



Críticas ao GnuPG



A nova biblioteca deve estar livre das deficiências do GnuPG. Embora deva ser destacado que além da implementação de "referência" do OpenPGP, existem outras, incluindo OpenKeychain , OpenPGP.js e RNP .



O GnuPG foi criticado por anos . Foi criticado por sua complexidade absurda, um design universal de canivete suíço: GnuPG faz tudo, mas não vai bem, incluindo assinaturas digitais, proteção de senha, criptografia de chave pública, transferência segura de arquivos, assinatura de pacotes, proteção de backup, mensagens de chat, etc. .d. Acredita-se que na era moderna, ferramentas especializadas são necessárias: uma biblioteca separada para mensagens seguras, uma biblioteca separada para assinar pacotes, outra separada para criptografar arquivos (como um utilitárioraiva escrita em Rust) e assim por diante. E nem todos esses utilitários precisam ser totalmente compatíveis com PGP.



O esforço do OpenPGP para compatibilidade com as cifras dos anos 90 foi criticado, o que significa que as configurações padrão não correspondem às melhores práticas modernas para criptografia forte e segurança sempre possível por meio de protocolos de negociação. O problema é que é impossível manter simultaneamente a compatibilidade com versões anteriores e estar em conformidade com a criptografia segura moderna.



Já mencionamos o código de lixo: “A implementação padrão de fato do PGP é o GnuPG. Este programa não é muito bem escrito. Existe uma extensa base de código C - uma linguagem com funcionalidade duplicada (por exemplo, um recente ataque de negação de serviço na análise SKS diz que tem vários analisadores de chave) com um longo histórico de CVE que varia de corrupção de memória a ataque criptográfico através dos canais laterais. Às vezes, era possível remover a autenticação de mensagens sem que o GnuPG percebesse. Você poderia ter alimentado ele com as chaves sem a impressão digital correta. Em 2018, a vulnerabilidade Efail foi causada por GnuPG servindo texto simples não autenticado mediante solicitação , escreve Latacora.



Outro problema é a (in) usabilidade.



Há vários anos, foi realizado um estudo de usabilidade do PGP, no qual um grupo de técnicos foi colocado em uma sala com um computador e solicitado a configurar o PGP. Duas horas depois, nenhum deles saiu ainda. - Desenvolvedor Ted Unangst , OpenBSD e LibreSSL


Outras reclamações são a insegurança do armazenamento de longo prazo da mesma chave, o sistema de autenticação de texto cifrado MDC completamente fraco , a falta de sigilo de encaminhamento e chaves gigantes desajeitadas.



Projeto Sequoia



Sequoia é um kit de ferramentas OpenPGP moderno que resolve muitos desses problemas, escreve o LWN. O Sequoia já foi adotado por vários outros projetos, incluindo keys.openpgp.org , OpenPGP CA , koverto , Pijul e KIPA .



O projeto é financiado pelas fundações p≡p (pep) e Wau Holland , com todo o desenvolvimento sendo de código aberto.



A nova biblioteca está focada na segurança e correção, ao mesmo tempo que usa a criptografia moderna mais confiável. Os desenvolvedores prometem ferramentas poderosas, incluindo um programa de linha de comando e subcomandos no estilo Git.



$ echo hi | sq encrypt --recipient neal
-----BEGIN PGP MESSAGE-----
wcBMA8K4GQVsZSWYAQgAllrQ+9490eoFdB/jLrVvGl+IVtGJWPFDg9uhcl0D8k05
AWz8ZU2sd6GzoCH1nRpwASJWHxloNbPgvxhNRRVReg3GgfFwMkcoNJ2Xb4zocvx+
niH7ZlP9Py6kseuqtjhQZEyvtIfWc58TK9DRdPp5suzS3Y9Zbew9vC2N2u+8YsKL
BbbminTZqLYbt/00ZT/ZuDbtHhoDUxlnCK2Y2R6NZvuvwS1ujI0EOfdOagZO0z5k
hs8U9Xgk1/BWpQtKn3ygMDO0401nBBbwNgialcu/8yFS+wXoifRaj60Cbxhjv2/G
aTcl9loYpN93BL0a7EbKmcwDl14HwosKdkMj4Px25dI0AZjLxI7TBX18e+hBu5vr
q83G7aEwllpiDU3z+rFXBjsWDOwP2UBf05D/Bl05eSYx4x7UnQ==
=qAvC
-----END PGP MESSAGE----- 


Uma interface clara para analisador e inspeção de pacotes foi implementada, bem como dumps hexadecimais, que agora podem ser visualizados na demonstração online .



$ sq packet dump --hex message.pgp
New CTB, 13 bytes: One-Pass Signature Packet
Version: 3
Type: Binary
Pk algo: EdDSA Edwards-curve Digital Signature Algorithm
Hash algo: SHA512
Issuer: 83F8 2E4F E9A5 E098
Last: true

00000000 c4 0d frame
00000002 03 version
00000003 00 sigtype
00000004 0a hash_algo
00000005 16 pk_algo
00000006 83 f8 2e 4f e9 a5 e0 98 issuer
0000000e 01 last 


Ao contrário do GnuPG, onde a ferramenta de linha de comando gpg é mais poderosa do que a biblioteca, o Sequoia é principalmente uma biblioteca; todas as suas funcionalidades estão disponíveis por meio de APIs abertas. O projeto planeja fornecer duas "camadas" de APIs: uma implementação de baixo nível das especificações OpenPGP e uma API de alto nível com padrões razoáveis ​​para tornar mais fácil para os usuários executarem tarefas comuns, como assinar pacotes e verificar assinaturas:



$ sqv --trace --keyring tails-signing.key \
tails-amd64-3.11.iso.sig tails-amd64-3.11.iso
Will check signature allegedly issued by A8B0 F4E4 5B1B 50E2.
Found key A8B0 F4E4 5B1B 50E2.
Checking signature allegedly issued by A8B0 F4E4 5B1B 50E2.
Signature by A8B0 F4E4 5B1B 50E2 is good.
A490 D0F4 D311 A415 3E2B B7CA DBB8 02B2 58AC D84F
1 of 1 signatures are valid (threshold is: 1).
$ echo "Just check the exit status: $?"
Just check the exit status: 0 


Apesar da implementação de baixo nível das especificações OpenPGP, os desenvolvedores eliminaram alguns padrões desatualizados e perigosos, como hashes MD5.



Mesmo antes do início da iniciativa, os fundadores do projeto se reuniram com membros proeminentes da comunidade OpenPGP e usuários finais para discutir os planos para o projeto e ter certeza de que sua abordagem é realmente justificada. O desenvolvimento ativo está em andamento agora. A julgar pelas entradas no repositório e rastreador , existem cerca de 30 participantes, e três lançamentos foram feitos desde o anúncio em abril de 2020 da preparação da versão 1.0. A última versão 0.19.0 foi lançada em agosto de 2020 - a melhoria mais notável é a integração da API de criptografia do Windows: Next Generation como back-end(CNG) em vez de Nettle, que apresenta problemas em ambientes não POSIX.



Para aumentar a segurança, a Sequoia planeja usar a separação de processos entre os serviços de chave pública e privada (como no gpg-agent). Aqui, para comunicação entre processos, o protocolo de serialização Cap'n Proto é introduzido - algo semelhante a Buffers de protocolo, só que mais rápido.



Na apresentação, os desenvolvedores destacam que nem sempre a separação de processos é possível, por exemplo, em ambientes iOS. Quando não estiver disponível, a Sequoia planeja usar um banco de dados SQLite compartilhado para se comunicar entre os serviços no processo, como uma espécie de colocation.



O Sequoia tem uma abordagem conceitualmente diferente para as chaves públicas: elas são projetadas para serem "mais parecidas com uma agenda de endereços do que com chaves PGP." As chaves são armazenadas por identificadores de usuário ( petname ), com a capacidade de vincular dados estruturados arbitrários úteis na implementação de modelos de confiança. Os desenvolvedores dizem que essa abordagem está mais alinhada com a forma como os usuários realmente representam as chaves: elas estão associadas a nomes, em vez de um conjunto de identificadores abstratos. Esta é uma área onde o Sequoia difere de outras implementações OpenPGP.



Além disso, todas as chaves são atribuídas a um "reino" indicando o propósito pretendido da chave. Dois domínios são atualmente suportados: "Contatos" e "Chave de atualização de software".



O keychain é atualizado automaticamente a partir de servidores remotos (semelhante ao parcimonie ) para controlar as mudanças, novas subchaves e revogações de chave em tempo hábil. A documentação indica que isso pode ser feito usando serviços anônimos, como Tor, além dos métodos de criptografia TLS mais comuns.



A implementação de chaves privadas do Sequoia oferecerá suporte ao sigilo diretopor meio das especificações OpenPGP, que não são implementadas em muitas outras bibliotecas. Essas especificações tornam possível distinguir entre dados "em repouso" (armazenamento criptografado) e dados "em movimento" (transmissão criptografada). Do ponto de vista da segurança, é bom alterar periodicamente as chaves dos dados "em movimento", mas manter a capacidade de descriptografar os dados "em repouso". Uma apresentação de um dos desenvolvedores, Justus Winter, compara os recursos de sigilo direto do Sequoia com outras implementações do OpenPGP.



Vantagens da ferrugem



O Sequoia tira proveito de todos os benefícios de segurança de memória do Rust.



O que é segurança de memória é explicado popularmente em um artigo de Michael Hicks. Em termos simples, significa que em nenhum estado um programa pode acessar uma memória inválida. Estes são os seguintes erros:



  • estouro de buffer;

  • desreferenciando um ponteiro nulo;

  • salvar o ponteiro após liberar memória (use-after-free);

  • uso de memória não inicializada;

  • uma tentativa de um programa de liberar a mesma célula duas vezes (liberação dupla).


As violações de segurança de memória levam a vulnerabilidades, como vazamento de dados e execução remota de código. Embora algumas linguagens tenham se resignado à degradação do desempenho em nome da segurança da memória, o conceito de propriedade do Rust garante a segurança e minimiza a sobrecarga.



Com base no desenvolvimento atual do Sequoia, há um esforço significativo sendo feito para escrever testes de unidade para evitar regressões e melhorar a qualidade do código.



O Sequoia tem como alvo “plataformas modernas”, incluindo Linux, Windows, macOS, Android e iOS, aproveitando ao máximo as ferramentas criptográficas existentes; o objetivo do projeto é uma forte integração com serviços criptográficos de uma plataforma específica. Por exemplo, em dispositivos iOS, está planejado o uso do coprocessador Secure EnclaveQuando disponível. O Sequoia também fornece uma interface de função externa (FFI) para integrar um projeto com programas escritos em outras linguagens. Atualmente são oferecidos vínculos (vínculos) com Python e C. No entanto, deve-se observar que os programas com esses vínculos não têm a segurança de memória interna do Rust, portanto, regras especiais foram publicadas para o tratamento correto do uso de memória .





Componentes Sequoia



Planos para o futuro



O lançamento da versão 1.0 pode ocorrer em breve, embora a princípio apenas a API de baixo nível seja lançada, ou seja, a caixa sequoia-openpgp e suas dependências. Isso significa que o Sequoia ainda não é um substituto para ferramentas como o GnuPG para todos os usuários: a primeira versão principal se concentrará em uma biblioteca de desenvolvedor. Os desenvolvedores do Sequoia precisam completar uma ferramenta de linha de comando sqque não será incluída na versão 1.0. Além disso, o serviço de armazenamento de chaves ainda está em desenvolvimento - junto com a ferramenta de linha de comando, esta é uma das principais prioridades do projeto após o lançamento da versão 1.0.



No geral, é bom ver um projeto que está tentando tornar o OpenPGP mais fácil de usar e mais acessível. Pode-se ver que ao longo de três anos, os desenvolvedores fizeram progressos significativos. A documentação permite que você use esta biblioteca em aplicativos. No entanto, o Sequoia ainda tem um longo caminho a percorrer antes de se tornar uma ferramenta criptográfica confiável. Mais importante ainda, o código precisa ser auditado. A página do projeto afirma que ainda não foi auditado, mas "assim que liberarmos a caixa principal do Sequoia, ele será auditado por terceiros". Nenhuma data de lançamento para a versão 1.0 foi anunciada, mas parece que será lançada em breve.






Publicidade



VDS para programadores com o hardware mais recente, proteção contra ataques e uma grande seleção de sistemas operacionais. A configuração máxima é de 128 núcleos de CPU, 512 GB de RAM, 4000 GB NVMe.






All Articles