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:
- de autenticación. Verifica quién es el autor del software.
- 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:
- El contenido de la dll/exe tiene un hash firmado por lo que no puede ser alterado.
- Cada referencia debe tener un nombre fuerte y ser verificada al cargar la dependencia.
- Los ensamblajes se pueden registrar en el GAC y se pueden usar las políticas del editor.
- 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.
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? –
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. –
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?) –