El software es una entidad intrigante y compleja. Cada fragmento es una máquina invisible, creada a partir de palabras aparentemente mágicas, diseñada para funcionar en la máquina universal definitiva. Aunque no está vivo, sigue un ciclo de vida. Comienza como código fuente—archivos de texto simples, almacenados en algún repositorio—y luego, a través de un proceso específico, ese código se «construye» en algo distinto: ya sea un trozo de Javascript, una imagen de contenedor o un binario para una arquitectura de procesador específica. Este producto final se denomina comúnmente «artefacto de software».
Tras su creación, estos artefactos suelen quedar en reposo, esperando ser utilizados. Pueden residir en registros de paquetes o contenedores, como GitHub Packages o AWS ECR. En algún momento, alguien decide usar ese artefacto, ya sea ejecutando el código, lanzando el contenedor o actualizando el firmware. Esta acción marca el final del ciclo de vida de producción, el cual puede requerir muchas horas de trabajo y recursos significativos.
Sin embargo, surge un problema crítico: a menudo no contamos con una garantía sólida de que el artefacto que ejecutamos sea exactamente el mismo que construimos. Los detalles de su viaje se pierden, complicando la conexión entre el artefacto y su código fuente. Esta falta de visibilidad es una preocupante fuente de desafíos de seguridad.
La creación verificada de artefactos de software es esencial para mitigar riesgos y evitar que actores maliciosos comprometan el producto final. Un método básico para asegurar la integridad de un archivo es generar un digest a través de un algoritmo hash seguro. Por ejemplo, con OpenSSL y el algoritmo SHA-256, puedes garantizar que un archivo no ha sido alterado comparando los hashes generados en distintos momentos.
Afirmar la autenticidad de un artefacto requiere firmas digitales. Utilizando cifrado asimétrico, es posible firmar un digest con una clave privada y permitir que cualquiera que posea la clave pública correspondiente verifique la autenticidad del archivo.
La tecnología de cifrado asimétrico, fundamental para la seguridad en internet, también se utiliza para construir una base de confianza en el software mediante firmas. Los sistemas operativos modernos exigen firmas en los artefactos de software ejecutables, asegurando así su origen confiable.
Para mejorar la seguridad del ciclo de vida del desarrollo de software (SDLC), necesitamos más que firmas. En su lugar, debemos considerar las atestaciones: declaraciones firmadas que afirman hechos sobre un artefacto. Las atestaciones de procedencia, que detallan el origen y las instrucciones de construcción del artefacto, son especialmente cruciales.
La especificación de atestación de procedencia del proyecto SLSA proporciona un marco común para abordar la seguridad en la cadena de suministro de software. Basado en el trabajo de in-toto del proyecto CNCF, SLSA facilita la producción de atestaciones de procedencia estandarizadas.
Hacer esto requiere establecer una infraestructura robusta: emitir certificados públicos, asegurar su correcta utilización, permitir firmas seguras y verificar las firmas de una manera confiable. Aquí es donde entra en juego Sigstore, un proyecto de código abierto que proporciona una autoridad de certificación X.509 y soporte para firmas temporales basadas en RFC 3161. Facilitando firmas y atestaciones con tokens OIDC, Sigstore simplifica el proceso, similar a como Let’s Encrypt hizo con los certificados TLS.
Sigstore establece una raíz de confianza segura conforme a The Update Framework (TUF), mitigando múltiples vectores de ataque y asegurando actualizaciones fiables. Esto permite crear un rastro auditado que vincula los artefactos al CI (Integración Continua), proporcionando a los usuarios finales la certeza sobre el origen del software que ejecutan.
La adopción de estas tecnologías promete transformar la manera en que verificamos y confiamos en el software, ofreciendo nuevas garantías de seguridad en un mundo cada vez más dependiente de las soluciones digitales.