c# - with - ¿La firma de código sin una denominación segura deja su aplicación abierta al abuso?
please give your assembly a strong name and re register it (4)
Tratando de entender mi autenticidad de firmas de código y nombres fuertes.
¿Estoy en lo cierto al pensar que si firmo el código de un archivo ejecutable que hace referencia a algunos dlls (que no tienen un nombre seguro), un usuario malintencionado podría reemplazar mis DLL y distribuir la aplicación de manera que parezca que está firmada por mí, pero está funcionando? su codigo
Suponiendo que eso sea cierto, parece que realmente no querría firmar una aplicación .NET sin nombrarlo todo, de lo contrario, ¿le está dando a la gente la capacidad de ejecutar código bajo la apariencia de una aplicación que escribió?
La razón por la 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 Autenticodo de SN +) parece mencionar esto, y parece un punto bastante importante de entender (si lo he entendido correctamente) ?
¿Estoy en lo cierto al pensar que si firmo el código de un archivo ejecutable que hace referencia a algunos dlls (que no tienen un nombre seguro), un usuario malintencionado podría reemplazar mis DLL y distribuir la aplicación de manera que parezca que está firmada por mí, pero está funcionando? su codigo
Sí, si el resto de las DLL solo están firmadas y no tienen un nombre seguro, se pueden reemplazar sin que .NET genere una excepción. Usted podría, dentro del exe, verificar que las DLL estén firmadas por la misma clave que el exe. Ninguno de estos enfoques impide que alguien reemplace sus DLL o el EXE.
Suponiendo que eso sea cierto, parece que realmente no querría firmar una aplicación .NET sin nombrarlo todo, de lo contrario, ¿le está dando a la gente la capacidad de ejecutar código bajo la apariencia de una aplicación que escribió?
En general, supongo que esa es la "mejor práctica", pero una vez más no has evitado nada. Una vez que un usuario tiene los derechos para cambiar archivos en el sistema local, no hay mucho que pueda hacer para evitar que realice actividades maliciosas.
Existen varias tecnologías de ofuscación que construyen proyectos .NET completos en un solo archivo ejecutable, esto puede hacer que el enfoque sea el más "seguro", pero aún así puede ser manipulado.
La verdadera pregunta es: ¿qué estás tratando de evitar que hagan? Quiero decir, ¿por qué alguien estaría interesado en reemplazar tu dll? ¿Qué esperan lograr, cuál es su objetivo? Si está tratando de evitar que alguien lea la información confidencial del proceso, puede pasar por un largo y duro camino de decepción. Supongamos que una parte malintencionada tiene acceso completo a su código fuente y a toda la información utilizada por su proceso, porque lo hacen. Supongamos que pueden reemplazar todo o parte de su código a voluntad, porque pueden.
Actualizado
Entonces, la redirección vinculante solo funcionará con ensamblajes con nombre seguro con la misma clave y, por lo tanto, ¿lo protege de los cambios de DLL?
Correcto, con la notable excepción de que la inyección de código todavía se puede hacer de muchas maneras.
... y volviendo a la pregunta original, ¿la firma de códigos sin una denominación segura socava el punto de la firma de códigos?
Realmente no. La firma de código (no la denominación segura) tiene dos propósitos distintos:
- Autenticación. Verificando quien es el autor del software.
- Integridad. Verificando que el software no haya sido manipulado desde que se firmó.
A menudo esto solo se autentica y valida durante la instalación. Es por esto que firmamos nuestro setup.exe, para asegurarnos de que el cliente haya recibido de nosotros el instalador no modificado. Se les solicita el mensaje "¿Confía en la empresa XXXX?" Y, por lo tanto, otorgan la autorización al instalador autenticado / firmado. Sin embargo, una vez instalado, 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 oscuros).
Strong Naming en el otro tenía un propósito completamente diferente para su existencia. Está totalmente centrado en la "integridad" de la aplicación. No hay certificado, ni autoridad de firma (CA) para verificarlo, no hay información que el usuario muestre para confirmar, y nada que el sistema operativo pueda verificar sobre el ejecutable que se va a ejecutar.
El marco .NET usa nombres fuertes para muchas cosas, todas ellas categorizadas de manera flexible como integridad de la aplicación:
- El contenido de la dll / exe tiene un hash firmado para que no pueda ser manipulado.
- Cada referencia debe tener un nombre seguro y estar verificada al cargar la dependencia.
- Los ensamblajes se pueden registrar en el GAC y se pueden usar las políticas del editor.
- Las imágenes nativas pueden ser ngen''d para producir una imagen compilada de la IL del ensamblaje.
Estoy seguro de que hay otras cosas que me estoy perdiendo aquí, pero estos son los usos principales que conozco.
Las mejores prácticas para la firma y la fuerte denominación
- Use un instalador firmado
- Usa un ejecutable codificado.
- Usa un ejecutable fuerte
- Nombre fuerte todas las dependencias y referencias a ellas.
- Generalmente no se requieren dependencias de firma de código *
- Considere la posibilidad de que GAC registre los ensamblajes en el momento de la instalación
* Nota: la firma de código puede ser útil en algunos casos para una DLL, por ejemplo, los objetos COM marcados como "seguros" e incrustados en un navegador deben estar firmados y con un nombre seguro como si fueran un ejecutable. La firma de código también puede ser útil para verificar las dependencias externamente sin cargar el ensamblaje o reflejar sus atributos.
Después de buscar lo mismo y leer muchas cosas. Finalmente puedo decir a su pregunta, SI, el 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 fuerte. Y son reemplazados. Su aplicación los cargará sin ningún problema. Y el usuario verá el cuadro de diálogo "Editor verificado: su nombre". Mientras que el ejecutable estaba intacto, las dependencias se alteraron.
El problema no es ese usuario, sino la distribución de ese paquete con dependencias modificadas, mientras que todos verán su nombre en él.
También debe recordar que la firma de código a menudo presenta muchos inconvenientes al actualizar archivos DLL sin implementar otras partes de la aplicación.
Esta es la razón por la que muchas bibliotecas populares no nombran fuertemente las DLL
Una vez que alguien pueda reemplazar el código de dll o de ejecución en su máquina, no habrá muchas salvaguardas para usted. En mi caso todos los Dll son codificados individualmente. Mi código se niega a descargar archivos DLL 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> = Vista Windows) aún puede inyectar una DLL en mi exe con algo como CreateRemoteThread, etc. (http://www.codeguru.com/Cpp/WP) /dll/article.php/c105) Pero nuevamente, asumir que alguien puede ingresar un código extranjero en el sistema es la parte difícil. El resto es fácil.