zlib-rs, una alternativa a zlib-rs en Rust que tiene como finalidad abordar los problemas causados por errores de memoria
La biblioteca zlib, desarrollada por Jean-Loup Gailly y Mark Adler, es un componente esencial ya que es utilizada en una amplia gama de aplicaciones que están enfocadas en la compresión de archivos en formatos como ZIP, gzip y PNG debido a su eficiencia y versatilidad. Esta biblioteca ha estado presente desde 1995 y como resultado de su amplio uso, también ha sido blanco de múltiples vulnerabilidades de seguridad de la memoria.
El núcleo de zlib es el algoritmo de compresión DEFLATE, que combina las técnicas de compresión sin pérdida de datos del algoritmo LZ77 con una estructura de árbol Huffman para lograr tasas de compresión notables. Esta combinación de técnicas hace que zlib sea extremadamente eficiente en la compresión y descompresión de datos, siendo especialmente útil en aplicaciones donde el espacio de almacenamiento o el ancho de banda son limitados.
Además de la compresión de archivos, zlib también se utiliza en la transferencia de datos comprimidos en redes para reducir la carga de ancho de banda, en aplicaciones de almacenamiento y procesamiento de archivos, así como en aplicaciones multimedia para la compresión de datos de audio y video.
A lo largo del tiempo, zlib ha enfrentado algunas vulnerabilidades que han sido abordadas en versiones posteriores de zlib, como las mencionadas CVE-2005-1849, CVE-2016-9840, CVE-2016-9841 y CVE-2016-9842 (solo por mencionar algunas de las conocidas de zlib), que podían ser explotadas por atacantes para provocar una denegación de servicio (DoS) o incluso ejecutar código arbitrario y que debido a las fallas de seguridad de memoria común para las bibliotecas de compresión escritas en C/C++, zlib sigue siendo un blanco importante.
Con la finalidad de abordar estos problemas, sin dejar de lado la naturaleza y bondades de zlib, la ISRG (la organización detrás del proyecto Let’s Encrypt y dedicada a mejorar la seguridad en internet) dio a conocer recientemente el lanzamiento de un nuevo proyecto que tiene como finalidad el crear un análogo de zlib en el lenguaje de programación Rust.
Contratamos a Tweede Golf en diciembre de 2023 para una implementación inicial basada en zlib-ng , con un enfoque en mantener un rendimiento excelente al tiempo que introducimos la seguridad de la memoria.
Que sigue
Actualmente estamos buscando financiación para completar el trabajo necesario para que la implementación inicial esté lista para la producción.
La nueva alternativa tiene como nombre «zlib-rs» y esta se presenta como una solución de zlib escrita en Rust con el objetivo principal de abordar los problemas de seguridad asociados con errores de memoria y vulnerabilidades que suelen estar presentes en las bibliotecas de compresión escritas en C/C++.
El desarrollo de zlib-rs surge en respuesta a estadísticas de Microsoft y Google que señalan que aproximadamente el 70% de las vulnerabilidades se deben a un manejo inseguro de la memoria. Al utilizar Rust como lenguaje de programación, se espera reducir significativamente el riesgo de estas vulnerabilidades, como el acceso a áreas de memoria liberadas o el desbordamiento de búferes.
El proyecto zlib-rs contiene una implementación Rust del formato de archivo zlib que es compatible con la API zlib y el repositorio actualmente se están trabajando en dos implementaciones:
- zlib-rs, una implementación de Rust basada en zlib con una API de Rust segura (actualmente se considera como inestable, pero se espera llegar a estabilizar la implementación en poco tiempo).
- libz-rs-sys, una API C una API C para zlib-rs . La API es, en términos generales, equivalente a zlib-sysy zlib-ng-sys, pero actualmente no proporciona la familia de funciones gz*. Desde la perspectiva de rust, esta API no es muy ergonómica por lo que de momento se recomienda el trabajo con flate2.
Sobre el trabajo en el desarrollo actual, se menciona que el ofrecer un análogo en Rust pueda atraer la atención de otros y puedan sumarse al trabajo, ya que el ofrecer una alternativa enfocada en la seguridad y la prevención de errores comunes, pueda en cuestión de algunos años de trabajo y desarrollo ofrecer un sustituto transparente a zlib.
Finalmente cabe mencionar que actualmente el trabajo de zlib-rs se publica en GitHub en el siguiente repositorio y el código se distribuye bajo la licencia Zlib. Puedes consultar más al respecto en el siguiente enlace.