
[03/10/2020] La firma de código es un mecanismo mediante el cual los fabricantes de software aseguran a sus consumidores que están ejecutando un software legítimo, firmado por su fabricante mediante criptografía. Esto garantiza que la versión del software no se haya manipulado mientras pasa del fabricante al usuario final, y es especialmente relevante cuando se descarga software de páginas web de terceros en lugar de los propios fabricantes.
Debe asegurarse de descargar la versión oficial de un paquete de software enviado por el fabricante y no un ejecutable que, por ejemplo, haya sido inyectado con malware por un atacante.
La ejecución de ejecutables firmados en Windows muestra el nombre del editor.
Cómo funciona la firma de código
Las firmas digitales en este contexto funcionan firmando criptográficamente un archivo para asegurar al usuario que la integridad de este archivo está intacta. Para hacer esto, un fabricante, con un par de llaves pública y privada, calcula el hash del paquete de software finalizado y cifra este hash con su clave privada.
Este hash cifrado, incluido con el archivo enviado, permite que las utilidades de validación de firmas instaladas en el lado del cliente verifiquen la autenticidad de la firma a través de la clave pública correspondiente. El resultado final en los sistemas Windows se parece al cuadro de diálogo siguiente. El archivo .exe tiene una firma digital incorporada que certifica que el archivo fue firmado por Microsoft Corporation.
¿Qué son los ataques de firma de código?
En un mundo ideal, la criptografía funcionaría según lo diseñado y las claves privadas permanecerían fuertemente protegidas. Sin embargo, este no es siempre el caso.
Los ataques de firma de código ocurren cuando los atacantes pueden firmar fraudulentamente aplicaciones piratas, o directamente maliciosas, utilizando certificados legítimos de una organización acreditada. Esto da la impresión de que el usuario está ejecutando un programa de software confiable cuando eso podría no ser cierto. Esto suele suceder por una de dos razones:
- El atacante pudo robar la clave secreta (privada) utilizada para firmar certificados y archivos. Esto comprometería la confianza de todo el par de llaves, así como cualquier cosa firmada por el fabricante, que utilice esta clave ahora debería considerarse inválida cuando se trata de confianza.
- Existe una falla en el algoritmo de firma o en la implementación del validador de firmas. En estos casos, el eslabón más débil se convierte en la herramienta que verifica las firmas digitales. Al no verificar adecuadamente los detalles de un archivo y las firmas que lleva, estos defectos permiten a los adversarios hacer pasar, como legítimas, firmas no válidas o pasar archivos, firmados incorrectamente, como genuinos.
Vulnerabilidades de validación de firma/firma de código de Microsoft Windows
Recientemente, Microsoft actualizó una vulnerabilidad, de la cual tenía conocimiento desde hacía al menos dos años y había sido explotada activamente. El fundador de VirusTotal, Bernardo Quintero, descubrió e informó respecto a esta falla en el 2019, a partir de una muestra de malware enviada al sitio. En ese momento, Microsoft optó por no reparar la falla después de reconocer su existencia, según la publicación del blog de Quintero.
La críptica "vulnerabilidad de suplantación” CVE-2020-1464 no es más que una falla de firma de código en las versiones del sistema operativo Windows -incluidas las últimas compilaciones de Windows 10- que permitirían a un atacante crear un archivo Java Archive (JAR) malicioso que pase la validación de la firma digital.
Según la explicación oficial de Microsoft, "[una] vulnerabilidad de suplantación de identidad existe cuando Windows valida incorrectamente las firmas de archivos. Un atacante que aproveche con éxito esta vulnerabilidad podría pasar por alto las funciones de seguridad y cargar archivos firmados incorrectamente. En un contexto de ataque, un atacante podría eludir las funciones de seguridad destinadas a evitar que se carguen archivos firmados deshonestamente”.
La explotación de esta vulnerabilidad es sencilla y es posible gracias a la forma en que Microsoft Windows comprueba los instaladores MSI firmados digitalmente (archivos * .msi). Cuando se trata de archivos MSI, la utilidad de validación de firmas de Windows lee solo los primeros bytes de un archivo MSI para verificar si es válido, y luego mira la firma adjunta al final para confirmar que es auténtica. Se ignora cualquier dato empaquetado con el archivo entre estos puntos.
Al principio, esto puede no parecer problemático, ya que la autenticación de firma digital funciona en el contexto del archivo MSI. Los problemas surgen cuando este archivo está presente en un archivo. Por ejemplo, si un archivo ZIP contiene un archivo MSI (primero) seguido de otro archivo, la validación de firma de Windows, que lee los primeros bytes del ZIP, ve el MSI, verifica su firma e ignora el resto. En consecuencia, todo el ZIP parecerá estar firmado digitalmente por la misma organización, independientemente de cuántos otros archivos contenga.
Los archivos JAR también son archivos con una estructura similar al formato ZIP. Estos JAR contienen archivos y recursos de clase Java (imágenes, textos, etcétera) que pueden ser ejecutados por un intérprete de código de bytes, como la Java runtime virtual machine (JVM).
Curiosamente, mientras que la validación de firmas de Windows de los MSI se realiza de arriba abajo, e ignora todo lo que se adjunta al MSI, JVM ejecuta archivos JAR leyéndolos de abajo hacia arriba. En otras palabras, si un archivo JAR contiene un MSI legítimamente firmado seguido de un archivo JAR malicioso anidado al final, la JVM ejecutará primero el JAR malicioso, mientras que los sistemas operativos Windows verán la firma digital del MSI y nada que venga después.
Al explotar esta técnica, un atacante ha hecho pasar un código malicioso como auténtico. Al hacer clic con el botón derecho en el JAR combinado, que contiene un MSI válido firmado por Google, Inc., por ejemplo, y un JAR malicioso (anidado) mostraría la firma digital del MSI (Google) en Windows.
Cómo defenderse de los ataques de firma de código
Los ataques de firma de código vienen en varios tipos y clases, cada uno de los cuales requiere sus propios métodos de detección y corrección. "Con los ataques de clonación de certificados, por ejemplo, puede detectar esta clase de ataque con Sigcheck y evitar que los no administradores instalen certificados raíz configurando el valor de registro”, explica Matt Graeber, director de investigación de amenazas en Red Canary.
Monitorear regularmente los cambios de las claves de registro también puede resaltar casos de firma de código. "Otras clases de ataques, como el subject interface package y el secuestro del proveedor de confianza, se detectan al monitorear las modificaciones del registro que un atacante debería estar ejecutando elevado para llevar a cabo este ataque. Estos son solo dos ejemplos de ataques de firma de código”, agrega Graeber.
Las fallas de firma de código de Microsoft Windows, explotadas en la práctica, son similares a otro problema (CVE-2019-1163) sobre cómo se validan los archivos CAB, afirma Graeber. "La forma de evitar este ataque es aplicar la actualización. Después de la revisión, Windows ya no validará estos archivos como si tuvieran firmas válidas. VirusTotal también informará las firmas no válidas para estos archivos. Por ejemplo, aquí hay un MSI que se encontró y que VirusTotal ahora marca como no válido. Después de aplicar la actualización, Windows también indica que existe una discrepancia de hash, la cual se puede validar con Sigcheck o Get-AuthenticodeSignature en PowerShell”.
Se mantiene el consejo convencional de instalar y mantenerse actualizado con las últimas actualizaciones de Windows. Las actualizaciones de seguridad, publicadas por Microsoft para CVE-2020-1464, se incluyeron en varias versiones de Windows 10. Los usuarios deben instalar estas últimas actualizaciones para proteger sus sistemas contra estas vulnerabilidades de suplantación.
Debido a que las vulnerabilidades de firma de código siguen evolucionando, las iteraciones futuras de estas fallas también deben considerarse al diseñar estrategias de detección. Se pueden implementar reglas de validación, no solo para verificar las firmas digitales, sino también los detalles de un archivo ejecutable portátil (PE, por sus siglas en inglés).
"En cuanto a la detección de intentos futuros, se podría confiar en la detección de anomalías en el PE. Por ejemplo, puede calcular el tamaño esperado de un archivo firmado analizando la información de la firma del encabezado PE en el encabezado opcional. Si se determina que existen datos superpuestos más allá del tamaño de archivo esperado, ese archivo podría considerarse sospechoso”, afirma Graeber.
Axe Sharma, CSO (EE.UU.)