OpenPGP se reescribe en Rust: el proyecto Sequoia



Sequoia Stagg en Alder Creek, California



En 2018, tres ex desarrolladores de GnuPG comenzaron a trabajar en el proyecto Sequoia , una implementación de OpenPGP en Rust. Como sabe, OpenPGP es un estándar de cifrado de datos abierto que se utiliza a menudo para el correo electrónico seguro; y GnuPG es la implementación de referencia de este estándar.



Los propios desarrolladores declararon la motivación para crear una nueva biblioteca OpenPGP de la siguiente manera:



  • GnuPG es difícil de modificar. El código y la API se han ido acumulando durante 21 años. No hay pruebas unitarias. Los componentes están estrechamente relacionados entre sí. La arquitectura deja mucho que desear y una simple refactorización no ayudará.

  • Muchos desarrolladores no están satisfechos con las API de GnuPG. La herramienta de línea de comandos GnuPG y las bibliotecas de programación correspondientes tienen una funcionalidad diferente, con algunos comandos disponibles solo desde la línea de comandos.

  • Rust es un lenguaje seguro para la memoria que elimina automáticamente toda una clase de errores.

  • GnuPG no se puede utilizar en iOS debido a restricciones de GPL.


La biblioteca Sequoia con licencia GPLv2 se acerca ahora a la versión 1.0 , aunque todavía quedan varios problemas por resolver .



Criticando a GnuPG



La nueva biblioteca debería estar libre de las deficiencias de GnuPG. Aunque cabe señalar que además de la implementación de "referencia" de OpenPGP, existen otras, como OpenKeychain , OpenPGP.js y RNP .



GnuPG ha sido criticado durante años . Ha sido criticado por su complejidad absurda, un diseño de cuchillo suizo universal: GnuPG hace todo, pero lo hace mal, incluidas firmas digitales, protección con contraseña, cifrado de clave pública, transferencias seguras de archivos, firma de paquetes, protección de respaldo, mensajería de chat, etc. .re. Se cree que en la era moderna, se necesitan herramientas especializadas: una biblioteca separada para mensajería segura, una biblioteca separada para firmar paquetes, una biblioteca separada para cifrar archivos (como una utilidadrage escrito en Rust) y así sucesivamente. Y no todas estas utilidades deben ser totalmente compatibles con PGP.



La búsqueda de OpenPGP de compatibilidad retroactiva con cifrados de los años 90 ha sido criticada, lo que significa que la configuración predeterminada no se corresponde con las mejores prácticas actuales para una criptografía sólida y la seguridad siempre puede verse comprometida a través de protocolos de negociación. El problema es que es imposible mantener simultáneamente la compatibilidad con versiones anteriores y cumplir con la criptografía segura moderna.



Ya mencionamos el código basura: “La implementación estándar de facto de PGP es GnuPG. Este programa no está muy bien escrito. Existe una extensa base de código C, un lenguaje con funcionalidad duplicada (por ejemplo, un ataque reciente de denegación de servicio en el análisis de SKS dice que tiene múltiples analizadores de claves) con un largo historial de CVE, que va desde la corrupción de la memoria hasta el ataque criptográfico a través de canales laterales. A veces era posible eliminar la autenticación de los mensajes sin que GnuPG se diera cuenta. Podrías haberle dado las llaves sin la huella dactilar correcta. En 2018, la vulnerabilidad de Efail fue causada por GnuPG que ofrecía texto sin formato no autenticado a pedido , escribe Latacora.



Otro problema es la (in) usabilidad.



Hace varios años, se realizó un estudio de usabilidad de PGP, en el que se colocó a un grupo de técnicos en una habitación con una computadora y se les pidió que configuraran PGP. Dos horas después, ninguno de ellos salió todavía. - Ted Unangst , desarrollador de OpenBSD y LibreSSL


Otras quejas son la inseguridad del almacenamiento a largo plazo de la misma clave, el sistema de autenticación de texto cifrado MDC completamente débil , la falta de confidencialidad directa y las torpes claves gigantes.



Proyecto Sequoia



Sequoia es un conjunto de herramientas de OpenPGP moderno que resuelve muchos de estos problemas, escribe LWN. Sequoia ya ha sido adoptado por varios otros proyectos, incluyendo keys.openpgp.org , OpenPGP CA , koverto , Pijul y KIPA .



El proyecto está financiado por las fundaciones p≡p (pep) y Wau Holland , y todo el desarrollo se lleva a cabo en modo abierto.



La nueva biblioteca se centra en la seguridad y la corrección, al tiempo que utiliza la criptografía moderna más confiable. Los desarrolladores prometen herramientas potentes, incluido un programa de línea de comandos y subcomandos de 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----- 


Se implementó una interfaz clara para el analizador y la inspección de paquetes, así como volcados hexadecimales, que ahora se pueden ver en la demostración en línea .



$ 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 


A diferencia de GnuPG, donde la herramienta de línea de comandos gpg es más poderosa que la biblioteca, Sequoia es principalmente una biblioteca; toda su funcionalidad está disponible a través de API abiertas. El proyecto planea proporcionar dos "capas" de API: una implementación de bajo nivel de las especificaciones de OpenPGP y una API de alto nivel con valores predeterminados razonables para que sea más fácil para los usuarios realizar tareas comunes como firmar paquetes y verificar firmas:



$ 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 


A pesar de la implementación de bajo nivel de las especificaciones de OpenPGP, los desarrolladores han eliminado algunos estándares obsoletos y peligrosos, como los hashes MD5.



Incluso antes del inicio de la iniciativa, los fundadores del proyecto se reunieron con miembros destacados de la comunidad OpenPGP y usuarios finales para discutir los planes del proyecto y asegurarse de que su enfoque esté realmente justificado. El desarrollo activo está en marcha ahora. A juzgar por las entradas en el repositorio y el rastreador , hay alrededor de 30 participantes, y se han realizado tres lanzamientos desde el anuncio en abril de 2020 de la preparación de la versión 1.0. La última versión 0.19.0 se lanzó en agosto de 2020; la mejora más notable es la integración de la API de criptografía de Windows: Next Generation como backend(CNG) en lugar de Nettle, que tiene problemas en entornos que no son POSIX.



Para mayor seguridad, Sequoia planea utilizar la separación de procesos entre servicios de clave pública y privada (como en gpg-agent). Aquí, para la comunicación entre procesos, se introduce el protocolo de serialización Cap'n Proto, algo similar a los búferes de protocolo, solo que más rápido.



En la presentación, los desarrolladores señalan que la separación de procesos no siempre es posible, por ejemplo, en entornos iOS. Cuando no esté disponible, Sequoia planea usar una base de datos SQLite compartida para comunicarse entre los servicios en el proceso, como una colocación.



Sequoia adopta un enfoque conceptualmente diferente para los llaveros públicos: están diseñados para ser "más como una libreta de direcciones que un llavero PGP". Las claves se almacenan mediante identificadores de usuario ( petname ), con la capacidad de vincular datos estructurados arbitrarios útiles para implementar modelos de confianza. Los desarrolladores dicen que este enfoque está más en línea con la forma en que los usuarios realmente representan las claves: están asociadas con nombres, en lugar de un conjunto de identificadores abstractos. Esta es un área en la que Sequoia se diferencia de otras implementaciones de OpenPGP.



Además, a todas las claves se les asigna un "reino" que indica el propósito previsto de la clave. Actualmente se admiten dos dominios: "Contactos" y "Clave de actualización de software".



El llavero se actualiza automáticamente desde servidores remotos (similar a parcimonie ) para realizar un seguimiento de los cambios, las nuevas subclaves y las revocaciones de claves de manera oportuna. La documentación indica que esto se puede hacer utilizando servicios anónimos como Tor, además de los métodos de cifrado TLS más comunes.



La implementación del llavero privado de Sequoia apoyará el secreto hacia adelantea través de las especificaciones OpenPGP, que no están implementadas en muchas otras bibliotecas. Estas especificaciones permiten distinguir entre datos "en reposo" (almacenamiento cifrado) y datos "en movimiento" (transmisión cifrada). Desde el punto de vista de la seguridad, es bueno cambiar periódicamente las claves de los datos "en movimiento", pero conservar la capacidad de descifrar los datos "en reposo". Una presentación de uno de los desarrolladores, Justus Winter, compara las características de confidencialidad directa de Sequoia con otras implementaciones de OpenPGP.



Ventajas del óxido



Sequoia aprovecha todos los beneficios de seguridad de la memoria de Rust.



Lo que es la seguridad de la memoria se explica popularmente en un artículo de Michael Hicks. En términos simples, significa que en ningún estado un programa puede acceder a una memoria inválida. Estos son los siguientes errores:



  • desbordamiento de búfer;

  • desreferenciar un puntero nulo;

  • guardar el puntero después de liberar memoria (use-after-free);

  • uso de memoria no inicializada;

  • un intento de un programa de liberar la misma celda dos veces (doble libre).


Las violaciones de seguridad de la memoria conducen a vulnerabilidades como la fuga de datos y la ejecución remota de código. Si bien algunos lenguajes se han resignado a la degradación del rendimiento en nombre de la seguridad de la memoria, el concepto de propiedad de Rust garantiza la seguridad y minimiza los gastos generales.



Basado en el desarrollo actual de Sequoia, se está haciendo un esfuerzo significativo para escribir pruebas unitarias para prevenir regresiones y mejorar la calidad del código.



Sequoia apunta a "plataformas modernas", incluidas Linux, Windows, macOS, Android e iOS, aprovechando al máximo las herramientas criptográficas existentes; el objetivo del proyecto es una estrecha integración con los servicios criptográficos de una plataforma específica. Por ejemplo, en dispositivos iOS está previsto utilizar el coprocesador Secure EnclaveCuando esté disponible. Sequoia también proporciona una interfaz de función externa (FFI) para integrar un proyecto con programas escritos en otros idiomas. Actualmente se ofrecen enlaces (enlaces) con Python y C. Sin embargo, debe tenerse en cuenta que los programas con estos enlaces carecen de la seguridad de memoria incorporada de Rust, por lo que se han publicado reglas especiales para el manejo correcto del uso de la memoria .





Componentes de Sequoia



Planes para el futuro



El lanzamiento de la versión 1.0 puede tener lugar pronto, aunque al principio solo se lanzará la API de bajo nivel, es decir, la caja sequoia-openpgp y sus dependencias. Esto significa que Sequoia aún no reemplaza herramientas como GnuPG para todos los usuarios: la primera versión importante se centrará en una biblioteca para desarrolladores. Los desarrolladores de Sequoia deben completar una herramienta de línea de comandos sqque no se incluirá en la versión 1.0. Además, el servicio de almacenamiento de claves todavía está en desarrollo; junto con la herramienta de línea de comandos, esta es una de las principales prioridades del proyecto después del lanzamiento de la versión 1.0.



En general, es bueno ver un proyecto que intenta hacer que OpenPGP sea más fácil de usar y más accesible. Se puede ver que los desarrolladores han logrado un progreso significativo en tres años. La documentación le permite utilizar esta biblioteca en aplicaciones. Sin embargo, Sequoia todavía tiene un largo camino por recorrer antes de que se convierta en una herramienta criptográfica confiable. Lo más importante es que se debe auditar el código. La página del proyecto indica que aún no ha sido auditado, pero "tan pronto como lancemos la caja principal de Sequoia, será auditada por terceros". No se ha anunciado una fecha de lanzamiento para la versión 1.0, pero parece que llegará pronto.






Publicidad



VDS para programadores con el último hardware, protección contra ataques y una gran selección de sistemas operativos. La configuración máxima es de 128 núcleos de CPU, 512 GB de RAM, 4000 GB de NVMe.






All Articles