stringtranslate.com

Asamblea (CLI)

Definido por Microsoft para su uso en versiones recientes de Windows , un ensamblado en Common Language Infrastructure (CLI) es una biblioteca de código compilado que se utiliza para implementación, control de versiones y seguridad. Hay dos tipos: ensamblados de procesos ( EXE ) y ensamblados de biblioteca ( DLL ). Un ensamblaje de proceso representa un proceso que utilizará clases definidas en ensamblajes de biblioteca. Los ensamblados CLI contienen código en CIL , que generalmente se genera a partir de un lenguaje CLI y luego el compilador justo a tiempo lo compila en lenguaje de máquina en tiempo de ejecución . En la implementación de .NET Framework , este compilador es parte de Common Language Runtime (CLR).

Un ensamblaje puede constar de uno o más archivos. Los archivos de código se denominan módulos. Un ensamblado puede contener más de un módulo de código. Y dado que es posible usar diferentes lenguajes para crear módulos de código, es técnicamente posible usar varios lenguajes diferentes para crear un ensamblado. Sin embargo , Visual Studio no admite el uso de diferentes lenguajes en un ensamblado.

Nombres de ensamblaje

El nombre de un conjunto consta de cuatro partes.

  1. El nombre corto. En Windows, este es el nombre del archivo Portable Executable (PE) sin la extensión.
  2. La cultura. Este es un identificador RFC 1766 de la configuración regional del ensamblaje. En general, las bibliotecas y los ensamblajes de procesos deben ser culturalmente neutrales; el cultivo sólo debe utilizarse para montajes satélite.
  3. La versión. Este es un número de puntos compuesto por cuatro valores: mayor, menor, compilación y revisión.
  4. Un token de clave pública . Este es un hash de 64 bits de la clave pública que corresponde a la clave privada utilizada para firmar [1] el ensamblaje. Se dice que una asamblea firmada tiene un nombre fuerte .

El token de clave pública se utiliza para que el nombre del ensamblado sea único. Por lo tanto, dos ensamblados con nombres seguros pueden tener el mismo nombre de archivo PE y aun así la CLI los reconocerá como ensamblados diferentes. El sistema de archivos de Windows ( FAT32 y NTFS ) solo reconoce el nombre del archivo PE, por lo que dos ensamblados con el mismo nombre de archivo PE (pero diferente cultura, versión o token de clave pública) no pueden existir en la misma carpeta de Windows. Para resolver este problema, la CLI presenta GAC ​​( Caché de ensamblaje global ) que se trata como una sola carpeta en tiempo de ejecución, pero que en realidad se implementa mediante carpetas del sistema de archivos anidados.

Para evitar ataques de suplantación de identidad , en los que un cracker intentaría hacer pasar un ensamblaje que aparece como otra cosa, el ensamblaje se firma con una clave privada. El desarrollador del conjunto previsto mantiene la clave privada en secreto, por lo que un cracker no puede tener acceso a ella ni simplemente adivinarla. Por lo tanto, el cracker no puede hacer que su conjunto se haga pasar por otra cosa, careciendo de la posibilidad de firmarlo correctamente después del cambio. Firmar el ensamblaje implica tomar un hash de partes importantes del ensamblaje y luego cifrar el hash con la clave privada. El hash firmado se almacena en el ensamblado junto con la clave pública. La clave pública descifrará el hash firmado. Cuando CLR carga un ensamblaje con nombre seguro, generará un hash a partir del ensamblaje y luego lo comparará con el hash descifrado. Si la comparación tiene éxito, significa que la clave pública en el archivo (y por lo tanto el token de clave pública) está asociada con la clave privada utilizada para firmar el ensamblaje. Esto significará que la clave pública en el ensamblado es la clave pública del editor del ensamblado y, por lo tanto, se evita un ataque de suplantación de identidad.

Versiones de montaje

Los ensamblados CLI pueden tener información de versión, lo que les permite eliminar la mayoría de los conflictos entre aplicaciones causados ​​por ensamblados compartidos. [2] Sin embargo, esto no elimina todos los posibles conflictos de versiones entre ensamblados. [3]

Seguridad de ensamblajes y CLI

La seguridad de acceso al código CLI se basa en ensamblajes y evidencia . La evidencia puede ser cualquier cosa que se deduzca del ensamblaje, pero normalmente se crea a partir del origen del ensamblaje, ya sea que el ensamblaje se descargó de Internet, de una intranet o se instaló en la máquina local (si el ensamblaje se descarga desde otra máquina, almacenarse en una ubicación protegida dentro del GAC y, por lo tanto, no se considera instalado localmente). Los permisos se aplican a ensamblajes completos y un ensamblaje puede especificar los permisos mínimos que requiere a través de atributos personalizados (consulte Metadatos de la CLI ). Cuando se carga el ensamblado, CLR utilizará la evidencia del ensamblado para crear un conjunto de permisos de uno o más permisos de acceso al código. Luego, CLR verificará para asegurarse de que este conjunto de permisos contenga los permisos requeridos especificados por el ensamblado.

El código CLI puede realizar una demanda de seguridad de acceso al código. Esto significa que el código realizará alguna acción privilegiada solo si todos los ensamblados de todos los métodos en la pila de llamadas tienen el permiso especificado. Si un ensamblado no tiene el permiso, se genera una excepción de seguridad.

El código CLI también puede realizar una demanda vinculada para obtener el permiso de la pila de llamadas. En este caso, CLR buscará solo un método en la pila de llamadas en la posición SUPERIOR para el permiso especificado. Aquí, el recorrido de la pila está vinculado a un método en la pila de llamadas mediante el cual CLR asume que todos los demás métodos en CALL STACK tienen el permiso especificado. El ensamblado es una combinación de archivos METADATA y MSIL.

Asambleas satélite

En general, las asambleas deben contener recursos culturalmente neutrales. Si desea localizar su ensamblaje (por ejemplo, usar diferentes cadenas para diferentes configuraciones regionales), debe usar ensamblajes satélite: ensamblajes especiales de solo recursos. Como sugiere el nombre, un satélite está asociado con un ensamblaje llamado ensamblaje principal. Ese ensamblado (digamos, lib.dll) contendrá los recursos neutrales (que Microsoft dice que es inglés internacional , pero implica que es inglés de EE. UU.). Cada satélite tiene el nombre de la biblioteca asociada junto con .resources (por ejemplo, lib.resources.dll). Al satélite se le asigna un nombre cultural no neutral, pero como los sistemas de archivos de Windows existentes (FAT32 y NTFS) lo ignoran, esto significaría que podría haber varios archivos con el mismo nombre PE en una carpeta. Como esto no es posible, los satélites deben almacenarse en subcarpetas bajo la carpeta de la aplicación. Por ejemplo, un satélite con recursos en inglés del Reino Unido tendrá un nombre CLI de "lib.resources Version=0.0.0.0 Culture=en-GB PublicKeyToken=null", un nombre de archivo PE de lib.resources.dll y se almacenará. en una subcarpeta llamada en-GB.

Los satélites se cargan mediante una clase CLI llamada System.Resources.ResourceManager. El desarrollador debe proporcionar el nombre del recurso e información sobre el ensamblaje principal (con los recursos neutrales). La clase ResourceManager leerá la configuración regional de la máquina y utilizará esta información y el nombre del ensamblado principal para obtener el nombre del satélite y el nombre de la subcarpeta que lo contiene. ResourceManagerLuego puede cargar el satélite y obtener el recurso localizado.

Conjuntos de referencia

Se puede hacer referencia a una biblioteca de código ejecutable utilizando el indicador /reference del compilador de C#.

Retrasar la firma de una asamblea

Los ensamblados compartidos deben dar un nombre seguro para identificar de forma única el ensamblado que podría compartirse entre las aplicaciones. La denominación segura consta del token de clave pública, la cultura, la versión y el nombre del archivo PE. Si es probable que se utilice un ensamblado para fines de desarrollo, que es un ensamblado compartido, el procedimiento de denominación segura contiene solo generación de clave pública. La clave privada no se genera en ese momento. Se genera solo cuando se implementa el ensamblaje.

Lenguaje de una asamblea.

El ensamblado se construye con el código CIL, que es un lenguaje intermedio. El marco convierte internamente el CIL ( código de bytes ) en código ensamblador nativo . Si tenemos un programa que imprime "Hello World", el código CIL equivalente para el método es:

 . método privado hidebysig estático vacío Principal ( cadena [] args ) cil administrado { . punto de entrada . instancia personalizada void [ mscorlib ] System . Atributo STAThread ::. ctor () = ( 01 00 00 00 ) // Tamaño del código 11 (0xb) . maxstack 1 IL_0000 : ldstr "Hola mundo" IL_0005 : llamada nula [ mscorlib ] Sistema . Consola :: WriteLine ( cadena ) IL_000a : ret } // fin del método Class1::Main                                   

El código CIL carga la cadena en la pila, luego llama a la función WriteLine y regresa.

Ver también

Referencias

  1. ^ "Dar un nombre fuerte a un ensamblado .NET". Archivado desde el original el 24 de febrero de 2012 . Consultado el 29 de marzo de 2007 .
  2. ^ Truche, Philippe (12 de agosto de 2008). "Ciclo de vida de control de versiones del ensamblado .NET". Archivado desde el original el 24 de octubre de 2008 . Consultado el 21 de septiembre de 2008 .
  3. ^ Pierson, Harry (17 de septiembre de 2008). "Simulacro de incendio por cambio de espacio de nombres DLR". Archivado desde el original el 1 de noviembre de 2008 . Consultado el 21 de septiembre de 2008 .