La firma de código es el proceso de firmar digitalmente ejecutables y scripts para confirmar el autor del software y garantizar que el código no ha sido alterado ni corrompido desde que se firmó. El proceso emplea el uso de una función hash criptográfica para validar la autenticidad e integridad. [ 1 ] La firma de código fue inventada en 1995 por Michael Doyle, como parte del complemento de navegador Eolas WebWish, que permitió el uso de criptografía de clave pública para firmar el código de programas de aplicaciones web descargables utilizando una clave secreta, de modo que el intérprete de código del complemento pudiera usar la clave pública correspondiente para autenticar el código antes de permitirle el acceso a las API del intérprete de código. [ 2 ] [ 3 ]
La firma de código puede proporcionar varias características valiosas. El uso más común es brindar seguridad durante la implementación; en algunos lenguajes de programación, también se puede usar para ayudar a prevenir conflictos de espacios de nombres. Casi todas las implementaciones de firma de código proporcionan algún tipo de mecanismo de firma digital para verificar la identidad del autor o del sistema de compilación, y una suma de verificación para comprobar que el objeto no ha sido modificado. También se puede usar para proporcionar información de versionado sobre un objeto o para almacenar otros metadatos sobre él. [ 4 ]
La eficacia de la firma de código como mecanismo de autenticación de software depende de la seguridad de las claves de firma subyacentes. Al igual que con otras tecnologías de infraestructura de clave pública (PKI) , la integridad del sistema se basa en que los publicadores protejan sus claves privadas contra el acceso no autorizado. Las claves almacenadas en software en computadoras de uso general son vulnerables a la vulneración. Por lo tanto, es más seguro, y una buena práctica , almacenar las claves en dispositivos de hardware criptográficos seguros e inalterables, conocidos como módulos de seguridad de hardware o HSM . [ 5 ]
Brindar seguridad
Muchas implementaciones de firma de código ofrecen una forma de firmar el código mediante un sistema que utiliza un par de claves, una pública y otra privada, similar al proceso empleado por TLS o SSH . Por ejemplo, en el caso de .NET, el desarrollador utiliza una clave privada para firmar sus bibliotecas o ejecutables cada vez que realiza una compilación. Esta clave es única para cada desarrollador o grupo, o a veces para cada aplicación u objeto. El desarrollador puede generar esta clave por sí mismo u obtenerla de una autoridad de certificación (CA) de confianza. [ 6 ]
La firma de código es particularmente valiosa en entornos distribuidos, donde el origen de un fragmento de código puede no ser inmediatamente evidente; por ejemplo, applets de Java , controles ActiveX y otro código de scripting web y de navegador activo. Otro uso importante es proporcionar actualizaciones y parches de forma segura al software existente. [ 7 ] Windows , Mac OS X y la mayoría de las distribuciones de Linux proporcionan actualizaciones mediante la firma de código para garantizar que no sea posible que otros distribuyan código maliciosamente a través del sistema de parches. Esto permite que el sistema operativo receptor verifique que la actualización es legítima, incluso si fue entregada por terceros o medios físicos (discos). [ 8 ]
La firma de código se utiliza en Windows y Mac OS X para autenticar el software en su primera ejecución , garantizando que no haya sido manipulado maliciosamente por un distribuidor o sitio de descarga externo. Esta forma de firma de código no se utiliza en Linux debido a la naturaleza descentralizada de esa plataforma, donde el gestor de paquetes es el modo de distribución predominante para todo tipo de software (no solo actualizaciones y parches), además de que el modelo de código abierto permite la inspección directa del código fuente si se desea. Las distribuciones de Linux basadas en Debian (entre otras) validan los paquetes descargados mediante criptografía de clave pública. [ 9 ]
Identificación confiable mediante una autoridad de certificación (CA)
La clave pública utilizada para autenticar la firma del código debe poder rastrearse hasta una autoridad de certificación raíz de confianza, preferiblemente mediante una infraestructura de clave pública (PKI) segura. Esto no garantiza la confianza en el código en sí, sino únicamente que proviene de la fuente indicada (o, más explícitamente, de una clave privada específica ). [ 10 ] Una CA proporciona un nivel de confianza raíz y puede asignar confianza a otras mediante un intermediario. Si un usuario confía en una CA, entonces presumiblemente puede confiar en la legitimidad del código firmado con una clave generada por esa CA o uno de sus intermediarios. Muchos sistemas operativos y marcos de trabajo incluyen confianza integrada para una o más autoridades de certificación. También es común que las grandes organizaciones implementen una CA privada, interna a la organización, que ofrece las mismas características que las CA públicas, pero cuya confianza se limita al ámbito interno de la organización.
Firma de código con validación extendida (EV)
Los certificados de firma de código de validación extendida (EV) están sujetos a requisitos técnicos y de validación adicionales. Estas directrices se basan en los Requisitos Básicos y las Directrices de Validación Extendida del Foro CA/B. Además de los requisitos de validación específicos para EV, las directrices de firma de código EV estipulan que "la clave privada del suscriptor se genera, almacena y utiliza en un módulo criptográfico que cumple o supera los requisitos del nivel 2 de FIPS 140-2 ". [ 11 ]
Ciertas aplicaciones, como la firma de controladores en modo kernel de Windows 10, requieren un certificado de firma de código EV. [ 12 ] Además, el IEBlog de Microsoft afirma que los programas de Windows "firmados con un certificado de firma de código EV pueden establecer inmediatamente una reputación con los servicios de reputación de SmartScreen , incluso si no existe una reputación previa para ese archivo o editor". [ 13 ]
Certificado de firma de código EV de muestra
Este es un ejemplo de un certificado de firma de código EV decodificado utilizado por SSL.com para firmar software. SSL.com EV Code Signing Intermediate CA RSA R3Se muestra como el nombre común del emisor, lo que lo identifica como un certificado de firma de código EV. El Subjectcampo del certificado describe a SSL Corp como una organización. Code SigningSe muestra como el único uso de clave extendida X509v3.
Certificado: Datos: Versión: 3 (0x2) Número de serie: 59:4e:2d:88:5a:2c:b0:1a:5e:d6:4c:7b:df:35:59:7d Algoritmo de firma: sha256WithRSAEncryption Editor: commonName = SSL.com EV Code Signing Intermediate CA RSA R3 nombre de la organización = SSL Corp Nombre de la localidad = Houston Nombre del estado o provincia = Texas Nombre del país = EE. UU. Validez No antes del: 30 de agosto de 2019, 20:29:13 GMT No después de: 12 de noviembre de 2022, 20:29:13 GMT Sujeto: 1.3.6.1.4.1.311.60.2.1.3 = EE. UU. 1.3.6.1.4.1.311.60.2.1.2 = Nevada Dirección: 3100 Richmond Ave Ste 503 BusinessCategory = Organización privada Código postal = 77098 commonName = SSL Corp Número de serie = NV20081614243 nombre de la organización = SSL Corp Nombre de la localidad = Houston Nombre del estado o provincia = Texas Nombre del país = EE. UU. Información de la clave pública del sujeto: Algoritmo de clave pública: rsaEncryption Clave pública: (2048 bits) Módulo: 00:c3:e9:ae:be:d7:a2:6f:2f:24 ... Exponente: 65537 (0x10001) Extensiones X509v3: Identificador de clave de autoridad X509v3: ID de clave:36:BD:49:FF:31:2C:EB:AF:6A:40:FE:99:C0:16:ED:BA:FC:48:DD:5F Acceso a la información de la autoridad: Emisores de CA - URI:http://www.ssl.com/repository/SSLcom-SubCA-EV-CodeSigning-RSA-4096-R3.crt OCSP - URI:http://ocsps.ssl.com Políticas de certificados X509v3: Política: 2.23.140.1.3 Política: 1.2.616.1.113527.2.5.1.7 Política: 1.3.6.1.4.1.38064.1.3.3.2 CPS: https://www.ssl.com/repository Uso extendido de la clave X509v3: Firma de código Puntos de distribución de CRL para X509v3: Nombre completo: URI:http://crls.ssl.com/SSLcom-SubCA-EV-CodeSigning-RSA-4096-R3.crl Identificador de clave de sujeto X509v3: CE:6A:64:06:26:A7:7A:69:E8:CC:06:D5:6F:FA:E1:C2:9A:29:79:DE Uso de la clave X509v3: crítico Firma digital Algoritmo de firma: sha256WithRSAEncryption 17:d7:a1:26:58:31:14:2b:9f:3b ...
Alternativa a las CA
El otro modelo es el de confianza en el primer uso , en el que los desarrolladores pueden optar por proporcionar su propia clave autogenerada. En este caso, el usuario normalmente tendría que obtener la clave pública directamente del desarrollador para verificar que el objeto es suyo por primera vez. Muchos sistemas de firma de código almacenan la clave pública dentro de la firma. Algunos marcos de software y sistemas operativos que verifican la firma del código antes de la ejecución permiten confiar en ese desarrollador a partir de ese momento, después de la primera ejecución. Un desarrollador de aplicaciones puede proporcionar un sistema similar incluyendo las claves públicas con el instalador. La clave se puede usar para garantizar que cualquier objeto posterior que necesite ejecutarse, como actualizaciones, complementos u otra aplicación, se verifique que proviene del mismo desarrollador.
Sello de tiempo
El sellado de tiempo se diseñó para eludir la advertencia de confianza que aparece en caso de un certificado caducado. En efecto, el sellado de tiempo extiende la confianza del código más allá del período de validez de un certificado. [ 14 ]
En caso de que un certificado deba ser revocado debido a una vulneración de seguridad, la fecha y hora específicas del evento que la vulneró pasarán a formar parte del registro de revocación. En este caso, el registro de la hora ayuda a determinar si el código se firmó antes o después de que el certificado se viera comprometido. [ 14 ]
Firma de código en Xcode
Los desarrolladores deben firmar sus aplicaciones para iOS y tvOS antes de ejecutarlas en cualquier dispositivo real y antes de subirlas a la App Store . Esto es necesario para demostrar que el desarrollador posee un ID de desarrollador de Apple válido . Una aplicación necesita un perfil o certificado válido para poder ejecutarse en los dispositivos. [ 15 ]
Problemas
Como cualquier medida de seguridad, la firma de código puede ser vulnerada. Los usuarios pueden ser engañados para ejecutar código sin firmar, o incluso código que se niega a validarse, y el sistema solo permanece seguro mientras la clave privada se mantenga privada. [ 16 ] [ 17 ]
También es importante tener en cuenta que la firma de código no protege al usuario final de ninguna actividad maliciosa ni de errores de software involuntarios por parte del autor del software; simplemente garantiza que el software no haya sido modificado por nadie más que el autor. En ocasiones, los sistemas de pruebas (sandbox) no aceptan certificados debido a una marca de tiempo errónea o a un uso excesivo de la memoria RAM .
Implementaciones
Microsoft implementa una forma de firma de código (basada en Authenticode) para los controladores probados por Microsoft. Dado que los controladores se ejecutan en el núcleo, pueden desestabilizar el sistema o exponerlo a vulnerabilidades de seguridad. Por este motivo, Microsoft prueba los controladores que se envían a su programa WHQL . Una vez que el controlador supera la prueba, Microsoft firma esa versión como segura. Solo en sistemas de 32 bits, es posible instalar controladores no validados por Microsoft tras aceptar la instalación en un aviso que advierte al usuario de que el código no está firmado. Para el código .NET (administrado), existe un mecanismo adicional llamado Firma de Nombre Fuerte (Strong Name Signing) que utiliza claves públicas/privadas y el hash SHA -1 en lugar de certificados. Sin embargo, Microsoft desaconseja el uso de la Firma de Nombre Fuerte como sustituto de Authenticode. [ 18 ]
El Grupo de Trabajo de Firma de Código del Foro CA/Navegador decidió que, a partir del 1 de junio de 2023, todos los certificados de firma de código (no solo los EA) deberían exigir el almacenamiento de la clave privada en un medio físico, como un módulo criptográfico de hardware que cumpla al menos con FIPS 140-2 Nivel 2 o Common Criteria EAL 4+. [ 19 ] Posteriormente, las CA emitieron anuncios sobre el cumplimiento de la decisión. [ 20 ] [ 21 ] [ 22 ] [ 23 ] [ 24 ] [ 25 ] [ 26 ]
Código sin firmar en juegos y dispositivos de consumo
En el contexto de dispositivos de consumo como las consolas de videojuegos , el término "código sin firmar" se usa a menudo para referirse a una aplicación que no ha sido firmada con la clave criptográfica normalmente requerida para que el software sea aceptado y ejecutado. La mayoría de los juegos de consola deben estar firmados con una clave secreta diseñada por el fabricante de la consola o el juego no se cargará en la consola (tanto para fomentar la dependencia del proveedor como para combatir la piratería de software). Existen varios métodos para lograr que el código sin firmar se ejecute, que incluyen exploits de software , el uso de un chip de modificación , una técnica conocida como el truco del intercambio o la ejecución de un softmod .
Puede que al principio no parezca obvio por qué simplemente copiar una aplicación firmada a otro DVD impide que se inicie. En Xbox , esto se debe a que el archivo ejecutable de Xbox (XBE) contiene un indicador de tipo de medio que especifica el tipo de medio desde el que se puede iniciar el XBE. En casi todo el software de Xbox, este indicador está configurado para que el ejecutable solo se inicie desde discos de fábrica, por lo que simplemente copiar el ejecutable a un medio grabable es suficiente para impedir la ejecución del software.
Sin embargo, dado que el ejecutable está firmado, no es posible simplemente cambiar el valor del indicador, ya que esto altera la firma del ejecutable, lo que provoca que falle la validación al comprobarlo.
Véase también
Referencias
- ↑ "Introducción a la firma de código (Windows)" . learn.microsoft.com . 15 de agosto de 2017. Archivado del original el 6 de febrero de 2024. Consultado el 13 de marzo de 2024 .
- ↑ "WebWish: Nuestro deseo es tu orden" .
- ↑ Schroeder, H y Doyle, M. “Aplicaciones web interactivas con Tcl/Tk”. Academic Professional, Boston, 1998, pág. 14, ISBN 0122215400.
- ↑ Hendric, William (2015). "Una visión general completa de los certificados de confianza - CABForum" (PDF) . Archivado (PDF) del original el 22 de abril de 2019. Recuperado el 26 de febrero de 2015 .
- ↑ "Protegiendo sus claves privadas como buena práctica para los certificados de firma de código" (PDF) .
- ↑ Hendric, William (17 de junio de 2011). "¿Qué es la firma de código?" . Archivado del original el 20 de junio de 2018. Recuperado el 26 de febrero de 2015 .
- ↑ "Firmas digitales e instalador de Windows - Aplicaciones Win32" . learn.microsoft.com . 7 de enero de 2021. Archivado del original el 30 de enero de 2024. Consultado el 13 de marzo de 2024 .
- ↑ windows-driver-content (18/05/2022). "Guía para la creación y administración de claves de arranque seguro de Windows" . learn.microsoft.com . Archivado del original el 30/10/2023 . Consultado el 22/09/2023 .
- ↑ "SecureApt - Debian Wiki" . wiki.debian.org . Archivado del original el 7 de mayo de 2019. Consultado el 7 de mayo de 2019 .
- ↑ "Firma de código" (PDF) . 26/02/2014. Archivado (PDF) del original el 26/02/2014 . Consultado el 21/02/2014 .
- ↑ "Directrices para la emisión y gestión de certificados de firma de código de validación extendida" (PDF) . CA/Browser Forum. Archivado (PDF) del original el 27 de noviembre de 2019. Consultado el 4 de diciembre de 2019 .
- ↑ "Política de firma de controladores" . Microsoft. Archivado del original el 9 de diciembre de 2019. Consultado el 9 de diciembre de 2019 .
- ↑ "Certificados de firma de código de Microsoft SmartScreen y validación extendida (EV)" . Microsoft. 14 de agosto de 2012. Archivado del original el 9 de diciembre de 2019. Consultado el 9 de diciembre de 2019 .
- 1 2 Morton, Bruce. "Firma de código" (PDF) . CASC. Archivado (PDF) del original el 26 de febrero de 2014. Recuperado el 21 de febrero de 2014 .
- ↑ "Distribución de tu aplicación a dispositivos registrados" . Documentación para desarrolladores de Apple . Archivado del original el 13 de marzo de 2024. Consultado el 15 de enero de 2024 .
- ↑ "Las soluciones antivirus falsas utilizan cada vez más certificados de firma de código robados" . 9 de enero de 2014. Archivado del original el 16 de abril de 2014. Consultado el 14 de abril de 2014 .
- ↑ "Por qué las claves privadas son el talón de Aquiles de la seguridad de la firma de código" .
- ↑ "Blog de seguridad de .NET" . learn.microsoft.com . 6 de agosto de 2021. Archivado del original el 19 de enero de 2024. Consultado el 13 de marzo de 2024 .
- ↑ "Requisitos básicos para la emisión y gestión de certificados de firma de código de confianza pública" (PDF) . CA/Browser Forum. 2024. pág. 10. Archivado (PDF) del original el 13 de marzo de 2024. Recuperado el 22 de marzo de 2024. (
Sección 1.2.2) [...] A partir del 1 de junio de 2023, para los certificados de firma de código, las CA DEBEN garantizar que la clave privada del suscriptor se genere, almacene y utilice en un módulo criptográfico de hardware adecuado que cumpla o supere los requisitos especificados en la sección 6.2.7.4.1 utilizando uno de los métodos en 6.2.7.4.2.
- ↑ "Firma de código - Almacenamiento de claves privadas | SignPath" . SignPath - Firma de código simple y segura . Archivado del original el 8 de marzo de 2024. Consultado el 13 de marzo de 2024 .
- ↑ "Cambios en la firma de código en 2021" . knowledge.digicert.com . Archivado del original el 10/12/2023 . Consultado el 13/03/2024 .
- ↑ "Cronología de DigiCert: Nuevo requisito de almacenamiento de clave privada para la firma de código" . knowledge.digicert.com . Archivado del original el 8 de diciembre de 2023. Consultado el 13 de marzo de 2024 .
- ↑ "Nuevo requisito de almacenamiento de clave privada para certificados de firma de código" . knowledge.digicert.com . Archivado del original el 19 de febrero de 2024. Consultado el 13 de marzo de 2024 .
- ↑ " [ CSCWG-public ] Resultados de la votación de la papeleta CSCWG-17: Extensión de la clave privada del suscriptor" . 26 de septiembre de 2022. Archivado del original el 5 de diciembre de 2022. Consultado el 13 de marzo de 2024 .
- ↑ "Los requisitos de almacenamiento de claves de firma de código cambiarán el 1 de junio de 2023" . Archivado del original el 2 de octubre de 2023. Consultado el 13 de marzo de 2024 .
- ↑ "🥇 Nuevo requisito de almacenamiento de clave privada para todos los certificados de firma de código - junio de 2023 (Actualización)" . SSLPOINT . 23 de septiembre de 2022. Archivado del original el 22 de septiembre de 2023. Consultado el 13 de marzo de 2024 .
Enlaces externos
- Guía de firma de código de Apple
- Introducción a la firma de código de Microsoft
- Infraestructura de seguridad de Debian
- Cómo lograr una distribución eficaz
- Aplicaciones de la criptografía
- Software de seguridad informática
- Infraestructura de clave pública
- cultura de los videojuegos
- Hacer trampas en los videojuegos