¿Cómo adquirió importancia la firma de código?
Veamos tres tendencias interesantes que han surgido en el desarrollo de software durante la última década.
Una de ellas es que el número de empresas que desarrollan y lanzan software ha aumentado enormemente. Un factor clave para ello ha sido la revolución de los teléfonos inteligentes y la consiguiente necesidad de que las empresas cuenten con sus propias aplicaciones móviles para sus clientes y empleados.
La segunda tendencia es que el principal medio para distribuir software, así como los parches y actualizaciones correspondientes, se ha convertido prácticamente en internet. Las ventajas de usar la distribución de software en línea, frente a los métodos tradicionales como los CD (discos compactos), son significativas: distribución de software a gran escala, casi instantánea y a un coste extremadamente bajo.
La tercera tendencia es que el número de proveedores de software independientes (ISV, por sus siglas en inglés), que se dedican principalmente a la creación de aplicaciones de software, ha crecido de forma constante a lo largo de los años, y algunos informes de investigación indican un crecimiento de diez veces en la última década.
Estas tendencias explican cómo la distribución de software en línea se ha convertido en el método predilecto para las empresas que desarrollan y venden software. Pero ¿este método y su conveniencia también conllevan riesgos empresariales?
¿Cómo puede un usuario saber si el software que descarga proviene del autor original (y no de un impostor)? ¿Cómo puede saber que el software no ha sido manipulado y que no se le ha insertado código malicioso? Firma de código Proporciona respuesta a estas preguntas ayudando a las empresas a proteger el software que lanzan.
Además de los desarrolladores de software y los especialistas en seguridad empresarial, es fundamental que los gerentes de proyecto, los gerentes de producto, los gerentes de ingeniería e incluso la alta dirección estén familiarizados con la firma de código. La razón es simple: la firma de código es una excelente protección contra los ataques de malware. Y el malware es el tipo de ataque más costoso para cualquier empresa: el costo promedio de un ataque de malware, según un informe reciente de IBM Security, es de 239 millones de dólares, ¡60 veces más que el costo promedio de una filtración de datos!
¿Cómo funciona la firma de código?
El término “código” en la firma de código puede referirse a ejecutables, archivos comprimidos, controladores, firmware, bibliotecas, paquetes y, esencialmente, cualquier software destinado a su publicación y distribución a otra parte o usuario.
Para entender cómo funciona la firma de código, es importante tener un conocimiento básico de Infraestructura de clave pública (PKI)Como se definió en artículos anteriores de este blog, la PKI es un conjunto de roles, políticas, hardware, software y procedimientos necesarios para crear, administrar, distribuir, usar, almacenar y revocar Certificados digitales y gestionar el cifrado de clave pública. También es importante comprender los dos objetivos principales de la firma de código:
- Propiedad del código: Demostrar que el código del software que se descarga e instala pertenece al propietario original y auténtico.
- Integridad del código: Demostrar que el código no ha sido manipulado ni alterado de ninguna manera, por ejemplo, mediante la inserción de código malicioso (malware).
El proceso de firma de código consta de cuatro pasos principales, que se describen a continuación.
- Generación de claves: El requisito básico para la firma de código es disponer de una clave privada y su correspondiente clave pública. Este par de claves (pública y privada) se puede generar mediante una herramienta o software de terceros (de confianza). Una explicación detallada de la generación de claves está fuera del alcance de este artículo.
- Certificado de firma de código: Luego debe solicitar un certificado de firma de código con un Autoridad de certificación (CA), que es una entidad de confianza que emite certificados digitales. La solicitud debe incluir su clave pública junto con otros datos de identidad de la organización. Algunas de las CA más conocidas son Verisign, Digicert, Symantec, GoDaddy, Comodo, Let's Encrypt y GlobalSign. El certificado que emite la CA incluye información como la identidad de su organización, su clave pública, el período de validez del certificado, la firma digital de la CA y otros detalles.
- hash: El siguiente paso es aplicar una función hash a tu código. El hash es un proceso unidireccional mediante el cual datos de cualquier tamaño y tipo se convierten, a través de un algoritmo matemático, en datos de tamaño fijo. El algoritmo se denomina función hash, y su resultado, es decir, los datos de tamaño fijo, se denomina valor hash o hash. El valor hash es totalmente diferente de los datos originales, y estos no se pueden deducir a partir del hash.
- Firma: El valor hash del software se cifra o firma mediante la clave privada. El hash cifrado, junto con el certificado de firma de código, se añade al paquete de software, que ya está listo para su envío o distribución. La razón por la que se firma el valor hash, y no el software original, es que el hash es una pequeña cantidad de datos (normalmente hasta 512 bits), que se puede cifrar muy rápidamente, mientras que el software original puede ser muy grande y tardar mucho tiempo en cifrarse. Además, no es necesario cifrar el código del software en sí: la ventaja del hash es que si el código del software original se modifica, aunque sea en un solo bit, el valor hash generado por la función hash es totalmente diferente.
Mejores prácticas para la firma de código
Sugerimos las siguientes prácticas para un proceso de firma de código seguro:
-
Almacenamiento de claves privadas en HSM
La Módulo de seguridad de hardware (HSM) No permite la exportación de claves criptográficas privadas a software, ya que esto las haría vulnerables a ataques. Tras el requisito del Foro CAB de junio de 2023, recomendamos encarecidamente usar un FIPS 140-2 HSM certificado de nivel 2 (o superior) para firma de código.
-
Limitar el acceso a la clave privada
Recomendamos encarecidamente permitir solo conexiones mínimas a los sistemas cliente con las claves privadas. Limitar el acceso a las claves a un número limitado de usuarios solucionará gran parte de la actividad discreta de los usuarios.
-
El código siempre debe tener una marca de tiempo
El sellado de tiempo es una buena manera de rastrear cuándo se ha firmado el código y ayuda a verificar su validez. También permite verificar el código después de que el certificado utilizado para la firma haya expirado o haya sido revocado.
-
Evite usar excesivamente una tecla
Las organizaciones a veces usan la misma clave para firmar código en varias líneas de productos y negocios. Este no es un buen enfoque. Si esa clave se ve comprometida, todas las versiones firmadas con ella estarán en riesgo. Una buena práctica sería rotar las claves con la mayor frecuencia posible.
-
Crear transparencia y centralizar la gestión
Generalmente, las organizaciones gestionan los certificados y las claves manualmente. Sin embargo, este enfoque no es recomendable, ya que los procesos manuales no proporcionan visibilidad completa ni control centralizado sobre las claves. Aplicar diversas políticas a las claves y regularlas resulta difícil sin un sistema de gestión centralizado.
¿Qué sucede cuando se descarga el software?
En el lado del receptor, el navegador utilizado para descargar el software primero verifica que el certificado del código descargado sea auténtico y provenga de una CA confiable. Esto es posible porque las claves públicas de la mayoría de las CA conocidas ya están preinstaladas en la mayoría de los navegadores y sistemas operativos.
Si el certificado no se autentica, el navegador le avisará y, según su configuración de seguridad, podría permitir o no la descarga. Si el usuario ignora esta advertencia e intenta instalar el software, el sistema operativo mostrará una alerta indicando que no se pudo verificar al editor del software, lo que disuadirá al usuario de instalarlo. Esto cumple el primer objetivo de la firma de código: establecer la propiedad del código.
Si el certificado se autentica, se extrae la clave pública y se utiliza para descifrar el hash cifrado disponible en el paquete. A continuación, se vuelve a cifrar el software descargado (sin el certificado ni el hash) utilizando la misma función hash. Este valor hash se compara con el valor hash descifrado. Si coinciden, el software no ha sido alterado. Si un atacante ha modificado el software (por ejemplo, añadiendo malware), los hashes no coincidirán, el sistema operativo mostrará una alerta y rechazará la instalación del software. Esto cumple el segundo objetivo: garantizar la integridad del código.
Firma de código para la seguridad de la cadena de suministro de software
Cuando una clave privada se ve comprometida, el certificado pierde su confianza, lo que destruye la autenticidad e integridad del software firmado por este certificado de firma de código. Las prácticas de firma de código garantizan la seguridad del desarrollo, la producción y la implementación de productos. Las mejores prácticas para proteger la cadena de suministro de software con firma de código segura son:
-
Autentica el código antes de firmarlo y liberarlo.
Las organizaciones deben utilizar procesos de firma de código optimizados, como canalizaciones de CI/CD y procesos de aprobación, para evitar la firma de código malicioso. Tras la firma, el código o artefacto debe autenticarse y verificarse antes de publicarse. Las organizaciones también deben mantener registros de todos los procesos de firma de código para su posterior auditoría.
-
Revocar certificados comprometidos
Para garantizar la seguridad del código, se debe seguir el procedimiento de revocación. Los certificados que se hayan visto comprometidos deben ser revocados por el CA; de esta manera, los certificados dañados o comprometidos no se pueden utilizar para actividades de firma de código.
Firma de código en entornos nativos de la nube
Firma de código Es fundamental en las implementaciones de aplicaciones nativas de la nube o DevOps. Antes de distribuir el software a los usuarios, podemos firmar y verificar tipos de software como imágenes de contenedores, binarios de aplicaciones, etc. En entornos nativos de la nube, la firma de código está integrada con CI / CD Canalizaciones para mantener la confianza y la autenticidad del software. Al incluir la firma de código en entornos nativos de la nube, las organizaciones pueden prevenir el riesgo de manipulación del código que lo hace malicioso para su distribución.
Conclusión
Hoy en día, la firma de código es una parte esencial del ciclo de vida del desarrollo de software. Sin ella, las empresas corren el riesgo de perder usuarios y se enfrentan a enormes riesgos financieros y de reputación en caso de ataques de malware. Por lo tanto, es fundamental que tanto los responsables de software como la alta dirección comprendan la firma de código y su importancia para sus organizaciones.
