Ensamblaje (CLI) - Assembly (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 usa para implementación, control de versiones y seguridad. Hay dos tipos: ensamblajes de proceso ( EXE ) y ensamblajes de biblioteca ( DLL ). Un ensamblado 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 se compila en lenguaje máquina en tiempo de ejecución por el compilador Just-In-Time . 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 ensamblado

El nombre de un conjunto consta de cuatro partes

  1. El nombre corto. En Windows, este es el nombre del archivo ejecutable portátil (PE) sin la extensión.
  2. La cultura. Este es un identificador RFC 1766 de la configuración regional para el ensamblado. En general, los ensambles de bibliotecas y procesos deben ser neutrales en cuanto a cultura; la cultura solo debe usarse para ensamblajes satélite .
  3. La versión. Este es un número punteado compuesto por cuatro valores: mayor, menor, construcció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 el ensamblado. Se dice que una asamblea firmada tiene un nombre fuerte .

El token de clave pública se utiliza para hacer que el nombre del ensamblado sea único. Por lo tanto, dos ensamblajes con nombre seguro pueden tener el mismo nombre de archivo PE y, sin embargo, la CLI los reconocerá como ensamblajes diferentes. El sistema de archivos de Windows ( FAT32 y NTFS ) solo reconoce el nombre de archivo PE, por lo que dos ensamblajes 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 el GAC ( caché de ensamblado global ) que se trata como una sola carpeta en tiempo de ejecución, pero que en realidad se implementa mediante carpetas anidadas del sistema de archivos.

Para evitar ataques de suplantación de identidad , en los que un pirata intentaría hacer pasar un ensamblado que aparece como otra cosa, el ensamblado se firma con una clave privada. El desarrollador del ensamblado previsto mantiene la clave privada en secreto, por lo que un pirata no puede tener acceso a ella ni simplemente adivinarla. Por tanto, el cracker no puede hacer que su montaje se haga pasar por otra cosa, careciendo de la posibilidad de firmarlo correctamente después del cambio. Firmar el ensamblado implica tomar un hash de partes importantes del ensamblaje y luego encriptar 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 ensamblado con un nombre fuerte, generará un hash a partir del ensamblado 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 ensamblado. 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.

Versiones de ensamblaje

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. Sin embargo, esto no elimina todos los posibles conflictos de versiones entre ensamblados.

Ensamblados y seguridad CLI

La seguridad de acceso del código CLI se basa en ensamblajes y pruebas . La evidencia puede ser cualquier cosa que se deduzca del ensamblaje, pero normalmente se crea a partir de la fuente del ensamblaje, ya sea que el ensamblaje se descargó de Internet, una intranet o se instaló en la máquina local (si el ensamblaje se descarga de otra máquina, lo hará). almacenarse en una ubicación de espacio aislado dentro del GAC y, por lo tanto, no se trata como si se instalara 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 (ver metadatos CLI ). Cuando se carga el ensamblado, CLR usará la evidencia del ensamblado para crear un conjunto de permisos de uno o más permisos de acceso al código. El CLR luego 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 lanza 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 la PILA DE LLAMADAS tienen el permiso especificado. El ensamblaje es una combinación de archivos METADATA y MSIL.

Asambleas satélite

En general, las asambleas deben contener recursos culturales neutrales. Si desea localizar su ensamblado (por ejemplo, usar diferentes cadenas para diferentes configuraciones regionales), debe usar ensamblajes satélite: ensamblajes especiales solo de recursos. Como sugiere el nombre, un satélite está asociado con un ensamblado llamado ensamblado principal. Ese ensamblado (por ejemplo, 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 adjunta con .resources (por ejemplo, lib.resources.dll). El satélite recibe un nombre de cultura no neutral, pero dado que 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. Dado que esto no es posible, los satélites deben almacenarse en subcarpetas en 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 ensamblado principal (con los recursos neutrales). La clase ResourceManager leerá la configuración regional de la máquina y usará 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. ResourceManager luego puede cargar el satélite y obtener el recurso localizado.

Hacer referencia a ensamblajes

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

Firma retrasada de una asamblea

Los ensamblados compartidos deben proporcionar un nombre seguro para identificar de forma única el ensamblado que podría compartirse entre las aplicaciones. La nomenclatura 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 con fines de desarrollo, que es un ensamblado compartido, el procedimiento de nomenclatura fuerte solo contiene la generación de claves públicas. La clave privada no se genera en ese momento. Se genera solo cuando se implementa el ensamblado.

Idioma de una asamblea

El ensamblado está construido 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:

 .method private hidebysig static void  Main(string[] args) cil managed {
  .entrypoint
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
  // Code size       11 (0xb)
  .maxstack  1
  IL_0000:  ldstr      "Hello World"
  IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000a:  ret } // end of method Class1::Main

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

Ver también

Referencias