2011-12-19 7 views
21

Estoy tratando de entender las firmas de código autenticode y los nombres fuertes.¿La firma de código sin un nombre fuerte deja su aplicación abierta al abuso?

¿Estoy en lo cierto al pensar que si código-firmar un exe que hace referencia a unos dlls (nombre no fuerte) que un usuario malintencionado podría reemplazar mis archivos DLL y distribuir la aplicación de una manera que parece estar firmado por mí , pero está ejecutando su código?

Suponiendo que sea cierto, parece que no desea firmar una aplicación .NET sin darle un nombre fuerte, de lo contrario le está dando a la gente la capacidad de ejecutar código bajo la apariencia de una aplicación que usted escribió ? El motivo por el que no estoy seguro es que ninguno de los artículos que encontré en línea (incluido el documento de MSDN sobre el uso de SN + Authenticode) parece mencionar esto, y me parece un punto bastante importante de entender (si lo hago). ¿Entendido correctamente?

Respuesta

15

Estoy en lo cierto al pensar que si el código a firmar un exe que hace referencia a unos dlls (no nombre seguro) que un usuario malintencionado podría sustituir a mi DLL y distribuir la aplicación de una manera que parece como si está firmado por mí, pero está ejecutando su código?

Sí si el resto de los archivos DLL sólo se están firmados y no es fuerte llamado que pueden ser reemplazados sin .NET lanzar una excepción. Podría, dentro del exe, verificar que las DLL estén firmadas por la misma clave que el exe. Ninguno de estos enfoques evita que alguien reemplace sus archivos DLL o EXE.

Suponiendo que eso es cierto, parece que en realidad no se quiere firmar una aplicación .NET sin nombrar fuerte todo el asunto, de lo contrario se está dando a las personas la capacidad para ejecutar código con el pretexto de una aplicación que escribiste?

general supongo que es la 'mejor práctica', pero una vez más no han impedido cualquier cosa. Una vez que un usuario tiene los derechos para cambiar los archivos en el sistema local, no hay mucho que pueda hacer para evitar que tengan actividad maliciosa.

Existen varias tecnologías de ofuscación que construyen proyectos .NET completos en un solo exe, esto podría hacer que el enfoque sea "más seguro" pero aún así pueda ser manipulado.

La verdadera pregunta es, ¿qué intentas evitar que hagan? Quiero decir, ¿por qué alguien estaría interesado en reemplazar tu dll? ¿Qué esperarían lograr, cuál es su objetivo? Si está tratando de evitar que alguien lea información delicada del proceso, se encontrará con un largo camino de decepción. Supongamos que una parte maliciosa tiene acceso completo a su código fuente y a cada información utilizada por su proceso, porque lo hacen. Asuma que pueden reemplazar todo o parte de su código a voluntad, porque pueden.

Updated siendo cambiado redirección

Así unión sólo funcionará con los conjuntos de fuerte nombran con la misma clave, y por lo tanto no le protegerá de DLL?

correcta, con la excepción que se señala que la inyección de código todavía puede hacerse de muchas maneras.

... y de nuevo a la pregunta original, lo hace de firma de código sin nombrar un poco fuerte-minar el punto de firma de código?

Realmente no. La firma de código (no fuerte de nomenclatura) tiene dos propósitos distintos:

  1. de autenticación. Verifica quién es el autor del software.
  2. Integridad. Verificando que el software no ha sido alterado desde que se firmó.

A menudo esto solo se autentica y valida durante la instalación. Esta es la razón por la que firmamos nuestro setup.exe, para asegurarnos de que el cliente haya recibido el instalador no modificado de nuestra parte. Se solicitan con la "¿Confía en la empresa XXXX?" Y otorgan autorización al instalador autenticado/firmado. Una vez instalado, sin embargo, hay poco uso incorporado de la firma de código por parte del sistema operativo (a excepción de los controladores y algunos otros casos poco claros).

Naming fuerte en el otro tenía un propósito completamente diferente para su existencia. Está completamente enfocado en la "integridad" de la aplicación. No hay ningún certificado, ninguna autoridad de firma (CA) para verificarlo, ninguna información que los usuarios puedan mostrar para que lo confirmen, y nada que el sistema operativo pueda verificar sobre el ejecutable que se ejecutará.

El marco .NET utiliza nombres fuertes para muchas cosas, todos ellos he vagamente categorizar como integridad de la aplicación:

  1. El contenido de la dll/exe tiene un hash firmado por lo que no puede ser alterado.
  2. Cada referencia debe tener un nombre fuerte y ser verificada al cargar la dependencia.
  3. Los ensamblajes se pueden registrar en el GAC y se pueden usar las políticas del editor.
  4. Se pueden crear imágenes nativas para producir una imagen compilada de la IL del conjunto.

Estoy seguro de que hay otras cosas que me faltan aquí, pero estos son los usos primarios que conozco.

Mejores prácticas para la firma y Strong-nombrar

  • usar un instalador firmado
  • Uso firmado, código ejecutable
  • Utilice un ejecutable
  • nombre fuerte con nombre todas las dependencias y referencias a ellos
  • No se requieren generalmente las dependencias de firma de código *
  • Considere GAC el registro de Asambleas durante la instalación

* Nota: Código de firma puede ser útil en algunos casos de una DLL, para objetos ejemplo COM marcados 'seguro' y embebidos en un navegador debe ser firmado y fuerte-nombrados como si fuera un ejecutable. La firma de código también puede ser útil para verificar externamente dependencias sin cargar el ensamblado ni reflejar sus atributos.

+0

No tengo un ejemplo que estoy tratando de proteger, solo estoy tratando de entender completamente la firma de código/SN :-) Sugieres que SN se puede pasar por alto con enlaces de redirección ... ¿No es así como una derrota el punto de SN por completo? –

+0

Tiene razón, la redirección de enlace no puede cambiar la clave de firma. Voy a verificar mis datos después de haber publicado pero me he distraído. –

+0

Entonces, la redirección de enlace solo funcionará con los ensamblados de nombre seguro con la misma clave, y por lo tanto * ¿* lo protege de las DLL que se cambian? (Y volviendo a la pregunta original, ¿la firma de código sin un nombre fuerte debilita el punto de la firma del código?) –

1

Una vez que alguien puede reemplazar dll o ejecutar el código en su máquina, no existen muchas garantías que le quedan. En mi caso, todos los Dll tienen código firmado individualmente. Mi código se niega a descargar Dll's que no están firmados como parte de la actualización automática. Sin embargo, cualquier aplicación que se ejecute en mi nivel de integridad o superior en mi sistema (en el caso de> = Windows Vista) aún puede inyectar un dll en mi exe con algo así como CreateRemoteThread, etc. (http://www.codeguru.com/Cpp/WP /dll/article.php/c105) Pero asumir nuevamente que alguien puede obtener código extraño en el sistema es la parte más difícil. El resto es fácil.

0

también debe recordar que la firma de código a menudo presenta muchas dificultades al actualizar dll sin implementar otras partes de la aplicación.

Por esta razón muchas bibliotecas populares no fuertemente el nombre de

0

la DLL Después de haber sido la búsqueda por el mismo y leer muchas cosas. Finalmente puedo responder a su pregunta, SÍ, un nombre seguro para las dependencias es obligatorio si va a firmar digitalmente su aplicación exe.

Supongamos esto, si sus dependencias no tienen un nombre seguro. Y ellos son reemplazados. Su aplicación los cargará sin ningún problema. Y el usuario verá el diálogo "Editor verificado: su nombre". Mientras que el ejecutable no se tocó, pero las dependencias se alteraron.

El problema no es ese usuario, sino la distribución de ese paquete con dependencias alteradas, mientras que todos verán su nombre en él.

Cuestiones relacionadas