El software es una entidad curiosa y profunda: cada pieza de él es una máquina invisible, aparentemente hecha de palabras mágicas, diseñada para ejecutarse en la máquina definitiva y universal. Aunque no está vivo, tiene un ciclo de vida que comienza como código fuente—simplemente archivos de texto alojados en un repositorio en algún lugar—y luego se transforma en algo diferente. Este proceso convierte el código fuente en lo que llamamos «artefacto de software», ya sea un trozo de Javascript minimizado para un servidor web, una imagen de contenedor llena de código y lógica empresarial, o un binario compilado para una arquitectura de procesador específica. Una vez creado, el artefacto a menudo permanece en reposo en registros de paquetes o contenedores, esperando ser utilizado.
Eventualmente, alguien decide utilizar ese artefacto: lo descomprime, ejecuta el código, lanza el contenedor, instala el controlador o actualiza el firmware. Esta acción culmina un ciclo de vida de producción que puede llevar muchas horas de trabajo humano y un alto costo financiero, además de ser crítica para la seguridad del mundo moderno, que depende en gran medida del software. Sin embargo, en muchos casos, no tenemos una garantía sólida de que el artefacto que ejecutamos sea exactamente el que construimos originalmente. Los detalles del viaje de ese artefacto a menudo se pierden, lo que crea desafíos de seguridad críticos.
Para asegurar el flujo de código que se transforma en artefactos a lo largo del ciclo de vida del desarrollo de software (SDLC), es fundamental tener visibilidad y seguridad. La falta de esta visibilidad es la raíz de muchos problemas de seguridad actuales. Algunos retos en ciberseguridad pueden parecer difíciles de abordar, pero rastrear y asegurar el ciclo de vida del software no es uno de ellos.
Imaginemos que tienes un archivo en tu directorio personal y quieres asegurarte de que sea exactamente el mismo mañana. Una buena manera de empezar es generar un digest del archivo utilizando un algoritmo hash seguro, como SHA-256 con OpenSSL:
openssl dgst -sha256 ~/important-file.txt
Este digest o hash es una representación única del archivo. Cualquier cambio en el archivo cambiará el hash. Este proceso permite determinar si algo ha sido manipulado. Para asegurar un artefacto de software de manera confiable, puedes usar firmas de software mediante criptografía asimétrica, que es la base de la confianza en Internet. Firmar un digest con una clave privada y ofrecer la clave pública correspondiente permite a cualquier persona en el mundo verificar la autenticidad de tu archivo.
Los sistemas operativos modernos como Windows, macOS, iOS y Android tienen mecanismos para garantizar la autenticidad de los artefactos de software exigiendo firmas. Sin embargo, para mejorar la seguridad en el SDLC, es fundamental ir más allá de las firmas y pensar en términos de atestaciones: declaraciones autenticadas sobre un artefacto por una entidad confiable.
Una atestación básica es declarar hechos sobre el origen y creación del artefacto, a esto se le llama atestación de procedencia. El proyecto SLSA proporciona un marco para crear estas atestaciones, lo cual es fundamental para la seguridad de la cadena de suministro de software. Como mayor plataforma global de desarrollo de software, GitHub ha estado trabajando en estos temas, incluyendo la gobernanza y operación del proyecto Sigstore.
Sigstore es un proyecto de código abierto que ofrece una CA X.509 y una autoridad de estampado de tiempo. Este proyecto facilita la firma y verificación de artefactos, creando un rastro de papel a prueba de manipulaciones que vincule los artefactos al entorno de integración continua (CI). Así, los consumidores de software pueden aplicar sus propias reglas de seguridad sobre el origen del código ejecutado.
GitHub Advanced Security ofrece herramientas para aprovechar estas tecnologías y mejorar la confianza y seguridad en el software. Para más información y para comenzar a adoptar estas medidas, visita el blog oficial de GitHub.