Certificado interno de firma de código en Windows

3

Estoy buscando mejorar la defensa en profundidad en un sistema, principalmente cerrando algunos agujeros en las DLL inyectadas. Ciertas aplicaciones instaladas en el sistema hacen que las DLL de ayuda (por ejemplo, extensiones de shell, BHO, etc.) se carguen en los procesos. Desafortunadamente, muchos de estos no se compilaron con los distintivos de inclusión de ASLR / DEP. Dado que los procesos afectados son los principales objetivos de explotación, he estado revisando manualmente el soporte para no poder explotar las llamadas cadenas ROP "universales".

Un efecto secundario de mis cambios es que muchos de los componentes ahora tienen firmas de código no válidas. Esto no parece haber roto nada, pero me gustaría volver a firmarlos con un certificado instalado localmente, utilizando algún tipo de certificado raíz personal como padre. Como beneficio adicional, puedo aprovechar el indicador de integridad de la fuerza.

¿Qué pasos debo seguir para hacer lo siguiente?

  1. Cree e instale un certificado raíz, con un certificado secundario (¿intermedio?) para la firma de código.
  2. Eliminar los certificados existentes de los binarios.
  3. Vuelva a firmar los binarios con el nuevo certificado.

Nunca me he metido con el almacén de certificados en Windows, más allá de algunas incursiones rápidas para verificar las existentes o instalar la CA de Burp, así que estoy un poco perdido aquí. ¿Es OpenSSL una buena opción para generar certificados o existe una mejor solución específica para Windows? ¿Qué herramientas son ideales para volver a firmar binarios?

    
pregunta Polynomial 16.02.2014 - 19:21
fuente

1 respuesta

4

Probablemente querrá usar la herramienta de firma de código como parte de Visual Studio, y makecert.exe probablemente sea más fácil de usar para la generación de certificados. Tendrá que asegurarse de obtener la plantilla de certificado adecuada, de lo contrario, la firma del código fallará. Una buena fuente de información se puede encontrar aquí: enlace

Si almacena la clave de firma de código localmente, la seguridad de la red obtenida es bastante baja. Realmente querrá al menos moverlo a una máquina segura, o posiblemente almacenarlo en una máquina virtual, en un disco extraíble, encriptado y nunca conectado. Sin embargo, el problema con esto es que cada vez que una aplicación carga la DLL, Windows intentará validar la firma e intentará verificar que el certificado no se haya colocado en una lista de revocaciones, lo que significa una llamada saliente a una ubicación desconocida, causando el bloqueo de los tiempos de espera, lo que lleva a un rendimiento horrible y las cosas aleatorias que no se inician.

Probablemente querrás ponerte de pie con una CA completa (gag) para que todo esto funcione correctamente . Las opciones alternativas son obtener un certificado de firma de código real de una CA de confianza y firmar las DLL con eso. Aunque si esas DLL alguna vez salieron a la luz con sus probabilidades de firma son buenas, su certificado será revocado ... eventualmente.

Además, si está haciendo esto con los componentes principales de Windows, es probable que solo rompa su instalación, ya que las protecciones internas se volverán locas por la firma desconocida.

Por último, si está haciendo esto con ciertos controladores que no son de Microsoft o componentes en modo kernel, es posible que tenga un mal momento debido a que las CA de códigos duros de Windows pueden firmar certificados para ciertos componentes que tienen ciertos usos clave. Consulte: enlace .

    
respondido por el Steve 17.02.2014 - 02:53
fuente