Llave electrónica - fichero Llave electrónica.doc. AntiHASP: emula una llave de protección de hardware HASP

(software) y datos procedentes de copia, uso ilegal y distribución no autorizada.

Una llave electrónica es un dispositivo de hardware de pequeño tamaño.

La base de esta tecnología es chip especializado, o protegido de la lectura microcontrolador, que son únicos para cada clave algoritmos trabajar. Los dongles también tienen seguridad memoria no volátil Los dispositivos de pequeño volumen y más complejos pueden tener un criptoprocesador incorporado (para implementación de hardware). cifrando algoritmos), reloj en tiempo real. Las claves de hardware pueden tener diferentes factores de forma, pero la mayoría de las veces están conectados a una computadora vía USB -, LPT -interfaces.

Instalación de llaves

Después de adjuntar la llave El Asistente para hardware nuevo encontrado estándar se iniciará en el puerto. el sistema operativo reconocerá esta clase de equipo, lo que será confirmado por la presencia en la consola Wizard del nombre Guardant Stealth/Net USB Key. Después de buscar y configurar el Asistente le informará que los conductores no están firmados Microsoft y le pedirá que cancele la instalación. Para continuar con la instalación de controladores, debe seleccionar la opción "De todas maneras, continúe" , después de lo cual se completará la instalación del controlador.

Principio de funcionamiento de la electrónica. Las claves son así.

La clave está adjunta a un específico interfaz computadora. A continuación, el programa protegido a través de un especial conductor le envía información, que se procesa de acuerdo con un algoritmo determinado y se devuelve. Si la respuesta de la clave es correcta, entonces el programa continúa su trabajo. De lo contrario, puede realizar cualquier acción especificada por los desarrolladores, por ejemplo, cambiar al modo de demostración o bloquear el acceso a determinadas funciones.

Para garantizar la seguridad del software de red, se utilizan claves electrónicas especiales. Para protección y Licencia(limitando el número de copias del programa que funciona en la red) producto de red, una clave es suficiente para todo red local. La clave se puede instalar en cualquier estación de trabajo o servidor redes.

Muchas empresas que operan en la zona. protección de la información, ofrecen sus puntos de vista sobre lo que debería ser una llave electrónica. Las siguientes líneas de productos son las más conocidas en el mercado ruso (en orden alfabético): Medidor de código de WIBU-SYSTEMS, guardián de la empresa "Activo" ALDABA de Aladdin, LOCK de Astroma Ltd., Rockey de Feitian, Bloqueo de sentido de Seculab, Sentinel de SafeNet, etc.

Historia

Proteger el software del uso sin licencia aumenta las ganancias del desarrollador. Hoy en día, existen varios enfoques para resolver este problema. La gran mayoría de los creadores de software utilizan varios módulos de software que controlan el acceso de los usuarios mediante claves de activación, números de serie, etc. Esta protección es una solución económica y no puede pretender ser fiable. Internet está repleto de programas que le permiten realizar ilegalmente generar clave de activación (generadores de claves) o bloquear la solicitud de un número de serie/clave de activación ( parches , grietas). Además, no se debe descuidar el hecho de que el propio usuario legal puede hacer público su número de serie.

Estas obvias deficiencias llevaron a la creación de protección de software basada en hardware en forma de llave electrónica. Se sabe que las primeras llaves electrónicas (es decir, dispositivos de hardware para proteger el software de copias ilegales) aparecieron a principios de la década de 1980, pero por razones obvias, es muy difícil establecer la primacía en la idea y la creación directa del dispositivo.

Protección del software mediante llave electrónica

^ Kit de desarrollo de software

Los dongles se clasifican como métodos de hardware para la protección de software, pero los dongles electrónicos modernos a menudo se definen como sistemas de herramientas de hardware y software multiplataforma para la protección de software. El caso es que además de la propia clave, las empresas que producen llaves electrónicas proporcionan SDK(Kit de desarrollador de software - kit de desarrollo de software). EN SDK incluye todo lo que necesita para comenzar a utilizar la tecnología presentada en sus propios productos de software: herramientas de desarrollo, completas documentación técnica, soporte para varios sistemas operativos, ejemplos detallados, fragmentos de código. El SDK también puede incluir claves de demostración para crear proyectos de prueba.

^ Tecnología de protección

La tecnología de protección contra el uso no autorizado del software se basa en la implementación de solicitudes de Archivo ejecutable o biblioteca dinámica a la clave con posterior recepción de la respuesta (y, si se proporciona, análisis de esta respuesta). Aquí algunas solicitudes típicas :


  • comprobar si la llave está conectada;

  • leer los datos necesarios para el programa de la clave como parámetro de inicio;

  • Solicitud de descifrado datos o código ejecutable necesarios para el funcionamiento del programa (el desarrollador de seguridad primero cifra parte del código del programa y, por supuesto, la ejecución directa de dicho código cifrado genera un error);

  • comprobar la integridad del código ejecutable comparando su estado actual suma de control con la suma de verificación original leída de la clave;

  • solicitud al reloj en tiempo real integrado en la llave (si está disponible), etc.
Vale la pena señalar que algunas claves modernas (llaves Senselock de Seculab, Rockey6 Smart de Feitian, Guardant Code de Aktiv Company) permiten al desarrollador almacenar partes individuales del código de la aplicación (por ejemplo, algoritmos no deterministas específicos del desarrollador que reciben una gran número de parámetros como entrada) y realizarlos en la misma clave por su cuenta microprocesador. Además de proteger el software del uso ilegal, este enfoque le permite proteger el algoritmo utilizado en el programa para que no sea estudiado y clonado por la competencia. Sin embargo, un algoritmo simple (y la mayoría de los que se pueden incluir allí) se puede criptoanalizar con éxito utilizando el método de análisis de "caja negra".

Como se desprende de lo anterior, el "corazón" de la clave electrónica es el algoritmo de cifrado. La tendencia es implementarlo en hardware, lo que dificulta la creación de una solución completa. emulador clave, porque Clave de encriptación nunca se transmite a la salida del dongle, lo que elimina la posibilidad de su interceptación.

El algoritmo de cifrado puede ser secreto o público. Los algoritmos secretos son desarrollados por el propio fabricante del equipo de seguridad, incluso individualmente para cada cliente. La principal desventaja de utilizar tales algoritmos es la incapacidad de estimar fuerza criptográfica. Fue posible decir con confianza qué tan confiable era el algoritmo solo después del hecho: fue pirateado o no. Un algoritmo público, o “código abierto”, tiene una fuerza criptográfica incomparablemente mayor. Estos algoritmos no son verificados por personas al azar, sino por una serie de expertos especializados en análisis. criptografía. Ejemplos de tales algoritmos incluyen el ampliamente utilizado GOST 28147-89 , AES , RSA , Elgamal y etc.

^Eludir la protección

Tarea intruso- hacer que un programa protegido funcione en ausencia de una clave legal conectada a la computadora. Sin entrar en detalles técnicos muy profundos, partiremos del supuesto de que el atacante tiene las siguientes capacidades:


  • Interceptar todo acceso a la clave;

  • Registrar y analizar estas solicitudes;

  • Envíe solicitudes a la clave y reciba respuestas;

  • Registre y analice estas respuestas;

  • Enviar respuestas en nombre de la clave, etc.
Las capacidades tan amplias del enemigo pueden explicarse por el hecho de que tiene acceso a todos los espacios abiertos. interfaces , documentación , conductores y poder analizarlos en la práctica por cualquier medio.

Para forzar programa funcione de la misma manera que funcionaría con una clave, puede hacer correcciones en el programa ( hackear su módulo de software), o emular la presencia de una clave.

^ Emulación de clave

En emulación no hay ningún impacto en el código del programa y el emulador, si se puede construir, simplemente repite todo el comportamiento de la clave real. Los emuladores se crean basándose en el análisis de las solicitudes de aplicaciones interceptadas y las respuestas de la clave a ellas. pueden ser como tabular(contiene todas las respuestas a las solicitudes de una clave electrónica necesaria para que el programa funcione), y lleno(Emulan completamente el funcionamiento de la clave, ya que los crackers se han dado cuenta del algoritmo interno de funcionamiento).

Construir un emulador completo de una llave electrónica moderna es un proceso bastante laborioso que requiere mucho tiempo y una inversión significativa. Anteriormente, los atacantes lo lograron: por ejemplo, la compañía Aladdin admite que en 1999, los atacantes lograron desarrollar un emulador de clave HASP3 que funcionaba bastante correctamente. Esto fue posible gracias al hecho de que los algoritmos codificación fueron implementados en software. La implementación de la codificación en hardware ha complicado significativamente la tarea, por lo que los atacantes prefieren atacar un producto protegido específico en lugar de un mecanismo de seguridad general. Sin embargo, las llaves de la serie HASP4 también eran susceptibles de piratería. Hasta el día de hoy, existen emuladores para HASP HL ​​​​(HASP 5) en la naturaleza, pero no en el llamado “público” (acceso público).

^ Hackear un módulo de software

El atacante examina la lógica del propio programa para, tras analizar todo el código de la aplicación, seleccionar un bloque de protección y desactivarlo. La piratería de programas se lleva a cabo utilizando depuración(o ejecución paso a paso), descompilación Y vertedero memoria de acceso aleatorio. Estos métodos de análisis de código de programa ejecutable suelen ser utilizados por los atacantes en combinación.

La depuración se lleva a cabo mediante un software especial: un depurador que le permite ejecutar cualquier aplicación paso a paso, emulando su entorno operativo. Una función importante de un depurador es la capacidad de establecer puntos o condiciones para detener la ejecución del código. Al usarlos, es más fácil para un atacante rastrear lugares en el código que acceden a la clave (por ejemplo, detener la ejecución ante un mensaje como "¡Falta la clave! Verifique la presencia de la clave en la interfaz USB").

El desmontaje es un método para convertir módulos ejecutables en un lenguaje de programación comprensible para los humanos. Ensamblador. En este caso, el atacante recibe una copia impresa ( listado) de lo que hace la aplicación.

La esencia del ataque de volcado de memoria es la siguiente. Los programas especiales (dumpers) leen el contenido de la RAM en el momento en que la aplicación comienza a ejecutarse normalmente y el atacante recibe el código de trabajo (o la parte que le interesa) en su forma pura. Lo principal para un atacante es elegir correctamente este momento. Por ejemplo, parte del código aparece en la RAM en forma abierta solo mientras dura su ejecución.

Tenga en cuenta que hay muchas formas de contrarrestar la depuración y los desarrolladores de seguridad las utilizan: no linealidad del código ( subprocesos múltiples), “ensuciar” el código con funciones esencialmente inútiles que realizan operaciones complejas para confundir al atacante, aprovechando las imperfecciones de los propios depuradores, etc.

Este artículo describe formas de eludir los sistemas de seguridad de hardware. Como ejemplo, consideremos la tecnología HASP (Hardware Against Software Piracy) desarrollada por Aladdin Knowledge Systems Ltd. En el pasado, esta tecnología era uno de los sistemas de protección de software de hardware más populares.

Muchos desarrolladores de software serios utilizan el poder de la protección de hardware HASP que no quieren que su producto se distribuya sin permiso. Hasp, por ejemplo, protege los paquetes "1C.Accounting" o "1C.Enterprise", sin los cuales ninguna empresa, más o menos organizada, puede sobrevivir. El popular directorio jurídico “ConsultantPlus” también protege el acceso a los datos mediante claves electrónicas. Para utilizar el software antes mencionado u otro igualmente costoso sin pagar un centavo a nadie, no basta con navegar por Internet en busca de una herramienta de texto con claves. Sin embargo, un hacker siempre sabrá qué hacer con la protección, incluso con el hardware. Y para esto no necesita un soldador.

Vamos a ver

Exagerando, podemos decir que HASP consta de dos partes: hardware y software. El hardware es una llave electrónica en forma de llavero USB, tarjeta PCMCIA, dispositivo LTP o incluso una tarjeta PCI interna. El software instalado sólo funcionará en la máquina en la que esté insertada la llave electrónica. En realidad, sería una buena idea quitarle al software un hábito tan desagradable para la billetera.

La parte de software consta de controladores de llaves electrónicas y varios programas que vinculan las llaves electrónicas con sus controladores directamente al producto protegido o a algunos datos cifrados. En este artículo veremos y eludiremos la protección mediante un llavero USB, probablemente la llave electrónica más popular en la actualidad.

Mecanismo del sistema de protección.

El llavero en sí casi no nos interesa, a diferencia del software incluido con él. El módulo hardlock.sys es el que más nos interesa. Sin entrar en detalles, señalaré que este controlador es responsable de interactuar con el dispositivo de seguridad de hardware. Tiene dos objetos de dispositivo, uno de los cuales se denomina simbólicamente DeviceFNT0. Utilizando este objeto, la aplicación protegida, a través del administrador de E/S, verifica la licencia para utilizar este software.

La principal desventaja de un sistema de protección de este tipo es la capacidad de interceptar llamadas al administrador de E/S y emular una llave de hardware. También existe la opción de desarrollar un controlador de clave virtual, pero se trata de una tarea técnica mucho más compleja que la interceptación de llamadas.
Como sabe, el modelo del controlador se describe en la estructura DRIVER_OBJECT cuando se carga el módulo. Almacena una serie de controladores de mensajes. Además, nadie le molesta en reescribir estas direcciones y obtener el control ejecutando nuestro código. Por tanto, es posible interceptar y reemplazar paquetes IRP sustituyendo los datos de la licencia. En otras palabras, si tiene una copia de la clave de seguridad, puede pasarla a un programa que verifique la exactitud de los datos de la licencia.

Para utilizar otro método, también se requiere un volcado de claves, pero la sustitución de datos se realiza de otra manera, concretamente en la emulación de software. Es decir, el controlador de seguridad podrá manejar la clave virtual de la misma forma que una física.

Interceptación y emulación

Como ya se señaló, la idea de la interceptación es sobrescribir los controladores de paquetes IRP. Para hacer esto, debe poder cambiar los campos de la estructura DRIVER_OBJECT. Afortunadamente, existe una función llamada IoGetDevicePointer que devuelve un puntero a la parte superior del objeto de pila del dispositivo nombrado y un puntero al objeto de archivo correspondiente. Aquí hay un fragmento de código para la función que establece el enlace:

UNICODE_STRING Nombre del dispositivo;
PDEVICE_OBJECT Objeto de dispositivo;
PFILE_OBJECT Objeto de archivo;

RtlInitUnicodeString(&NombreDeDispositivo, lpDevice);
IoGetDeviceObjectPointer(&DeviceName, 1u, &FileObject, &DeviceObject);

Habiendo recibido un puntero a la estructura DEVICE_OBJECT, tenemos un puntero a DRIVER_OBJECT. Ahora reemplacemos las direcciones de los controladores y las funciones de descarga de controladores por las nuestras:

NTSTATUS Dispositivo de gancho (LPWSTR lpDevice)

gDriverObject = DispositivoObjeto->DriverObject;

gDeviceControl = gDriverObject->MajorFunction;
gDriverObject->MajorFunction = HookDispatch;

gInternalDeviceControl = gDriverObject->MajorFunction;
gDriverObject->MajorFunction = HookDispatch;

gDriverUnload = gDriverObject->DriverUnload;
gDriverObject->DriverUnload = HookUnload;

ObfDereferenceObject(FileObject);

La última línea llama a la función ObfDereferenceObject, que reduce el número de referencias al objeto de archivo. Esto debe hacerse para descargar correctamente el controlador y evitar fugas de recursos y errores similares.

Dado que se guarda el puntero al objeto del controlador de protección, para eliminar la trampa, solo necesita restaurar los controladores de paquetes IRP anteriores:

anular Dispositivo de desenganche (anulo)

gDriverObject->MajorFunction = gDeviceControl;
gDriverObject->MajorFunction = gInternalDeviceControl;
gDriverObject->DriverUnload = gDriverUnload;

Por supuesto, necesitamos agregar controles apropiados para la validez de los punteros, etc.

Ahora necesitas implementar la descarga correcta de controladores. Dado que el sistema de protección por alguna razón puede terminar su trabajo antes que nuestro controlador, para evitar una falla del sistema debido a punteros no válidos, procesaremos este evento en la función HookUnload:

anular HookUnload(PDRIVER_OBJECT DrvObj)

DesengancharDispositivo();
gDriverUnload(DrvObj);

Aquí se restauran los campos de la estructura DRIVER_OBJECT y se transfiere el control al código original para descargar el controlador del dispositivo interceptado.

Hacemos lo mismo si nuestro conductor termina antes que el sistema de protección. Solo necesita liberar los recursos capturados y no llamar al gHookUnload guardado.

Cómo funciona el emulador

Interceptador

Conociendo los principios básicos de la interceptación más simple de paquetes IRP, pasemos a implementar solo el interceptor en sí para un análisis más detallado. Para hacer esto, crearemos un objeto controlador que contiene un nombre simbólico (por ejemplo, DosDevicesHook) y puntos de entrada CREAR, CERRAR, LEER.

IoCreateDevice(DriverObject, 0, &usDeviceName, FILE_DEVICE_NULL, 0, 0, &pDeviceObject);
IoCreateSymbolicLink(&usSymbolicDeviceName, &usDeviceName);

DriverObject->MajorFunction = DriverDispatch;
DriverObject->MajorFunction = DriverDispatch;
DriverObject->MajorFunction = DriverDispatch;
DriverObject->DriverUnload = DriverUnload;

Esto es necesario para poder trabajar con nuestro interceptor como un archivo, utilizando las funciones CreateFileReadFileCloseHandle. Con esta implementación del intercambio de datos entre la aplicación y el interceptor, es imposible enviarlos inmediatamente al programa de usuario, por lo que es necesario crear alguna estructura para almacenar los datos necesarios sobre el paquete capturado. Por ejemplo, una lista enlazada individualmente, tal como la implementé yo. Ahora debe decidir qué información debe almacenarse en el buffer. Esta es información general sobre el paquete (tipo, banderas, etc.) y, por supuesto, los buffers. También puedes agregar el tiempo de intercepción. Al copiar el contenido de los buffers, es necesario recordar su tipo; de lo contrario, fallará. De cara al futuro, notaré que el controlador de protección utiliza E/S almacenadas en búfer, lo que simplifica un poco el código.

Código de envío de gancho

si (idlTail->IrpData.InputLength)
{
idlTail->InputBuffer = ExAllocatePool(NonPaggedPool, idlTail->IrpData.InputLength);
RtlCopyMemory(idlTail->InputBuffer, Irp->AssociatedIrp.SystemBuffer, idlTail->IrpData.InputLength);
}

si (IoSL->Función principal == IRP_MJ_DEVICE_CONTROL)
Estado = pHookedDriverDispatch(DeviceObject, Irp);

si (idlTail->IrpData.OutputLength)
{
idlTail->OutputBuffer = ExAllocatePool(NonPaggedPool, idlTail->IrpData.OutputLength);
RtlCopyMemory(idlTail->OutputBuffer, lpBuffer, idlTail->IrpData.OutputLength);
}

Solo queda implementar la lectura del conductor. Dado que el paquete contiene buffers cuyo contenido es de interés, el tamaño de los mensajes no se conoce de antemano. Por tanto, procederemos de la siguiente manera: durante la primera lectura obtenemos información general sobre el paquete y el tamaño de los buffers; al repetir, leemos el contenido, eliminamos el enlace de la lista de paquetes y no nos olvidamos de los bloqueos de giro para el trabajo secuencial con datos:

Código de despacho del conductor

Longitud = IoSL->Parámetros.Leer.Longitud;
si (Longitud == tamaño de (IRP_DATA) && idlHead)
RtlCopyMemory(Irp->UserBuffer, &idlHead->IrpData, Longitud);
else if (idlHead && Longitud == (idlHead->IrpData.InputLength + idlHead->IrpData.OutputLength))
{
RtlCopyMemory(Irp->UserBuffer, idlHead->InputBuffer, idlHead->IrpData.InputLength);
RtlCopyMemory((PVOID)((ULONG)Irp->UserBuffer + idlHead->IrpData.InputLength), idlHead->OutputBuffer, idlHead->IrpData.OutputLength);
}
de lo contrario si (Longitud == 1 && idlHead)
{
si (idlHead->InputBuffer)
ExFreePool(idlHead->InputBuffer);
si (idlHead->OutputBuffer)
ExFreePool(idlHead->OutputBuffer);

idlTemp = idlHead->ldlNext;
ExFreePool(idlHead);
idlHead = idlTemp;
si (!idlTemp)
idlCola = NULL;
}

Cuando el interceptor esté listo, lo lanzamos primero y luego la aplicación protegida con y sin claves. De los registros recibidos queda claro qué códigos de control se envían y sus resultados. También puede ver que las solicitudes y respuestas a dos códigos diferentes (9c402450, 9c4024a0) no cambian. Parecería que es posible construir un emulador de tabla, pero después de una serie de lanzamientos estamos convencidos de que esto es imposible, ya que el contenido de los buffers es diferente y no se sabe cómo se forma.

Paquetes capturados sin clave

Paquetes interceptados con clave.

Luego hay varias opciones para acciones adicionales:

  • explorar la jungla del conductor de protección;
  • utilizar información de los propios desarrolladores del sistema.

Ambas opciones proporcionan la información necesaria. Entonces, resulta que el contenido de los paquetes se cifra utilizando el algoritmo público simétrico AES (Advanced Encryption Standard). El objetivo lógico es obtener la clave de cifrado.

Pero si profundizamos aún más en el estudio del diseño del sistema de seguridad, resulta que la clave de hardware tiene un número único y contiene toda la información necesaria, pero se requieren claves de software para acceder a ella.

Ejemplo de volcado de claves

Por tanto, lo primero que debes hacer es conseguir la clave. El problema se puede resolver mediante una simple fuerza bruta:

Clave corta sin firmar;
carácter sin firmar RefKey, VerKey;

para (Clave = 0; Clave<= 0x7fff, Key++)
{
si (!HL_LOGIN(Clave, 1, ClaveRef, ClaveVer))
{
HL_LOGOUT();
Romper;
}
}

Las funciones HL_LOGIN, HL_LOGOUT están disponibles desde el SDK de HASP para desarrolladores de aplicaciones protegidas en esta plataforma, y ​​cuentan con los siguientes prototipos:

WORD HL_LOGIN(WORD ModAd, Word Access, Byte *RefKey, Byt *VerKey);
WORD HL_LOGOUT(nulo);

La primera función se utiliza para abrir una sesión de trabajo con una clave de protección utilizando el controlador, la segunda finaliza la sesión. Estos son prototipos de versiones anteriores del HASP SDK, pero también funcionan con nuevos tipos de claves, ya que los desarrolladores se han asegurado de la compatibilidad con versiones anteriores.

La nueva API difiere poco de la anterior y esto no afecta de ninguna manera el principio de funcionamiento por fuerza bruta. Puede encontrar documentación detallada de la API de Hasp, implementaciones listas para usar de fuerza bruta y volcador de claves en.

Manipulador

Ahora tienes todo lo que necesitas para que el módulo funcione correctamente. Todo lo que queda es implementar la sustitución de la información de la licencia. Además, sólo se pueden interceptar algunos paquetes IRP. Aquí todo depende de la versión específica de la clave y del programa protegido.

Es mejor no incrustar el volcado de claves en el controlador, sino cargarlo dinámicamente desde el registro. Es mejor confiar en un interceptor de solicitudes ya preparado, esto facilitará la depuración del controlador enviando paquetes interceptados/sustituidos para su análisis a la aplicación del usuario. Básicamente, la lógica del interceptor se verá así:

NTSTATUS HookDispatch():

PIO_STACK_LOCATION Pila = Irp->Tail.Overlay.CurrentStackLocation;
Código de control Io ULONG;
si (Pila->Función principal == 14)
{
IoControlCode = Stack.DeviceIoControl.IoControlCode;
Si (IoControlCode! = 0x9c402458)
{
Devuelve gDeviceControl(DeviceObject, Irp);
}
demás
{
Cifrar(Irp->AssociatedIrp.SystemBuffer);
Cripta(Irp->AssociatedIrp.SystemBuffer, Clave, DumpMemory);
}
}

Devuelve STATUS_FAILED;

El paquete de solicitud del controlador está cifrado, por lo que acceder a su contenido requiere descifrarlo y luego cifrarlo. Surge la pregunta: ¿qué algoritmo y qué clave se utilizó para cifrar? Habiendo profundizado en el código fuente de los creadores del sistema, puede obtener el siguiente algoritmo de cifrado de paquetes primario:

cifrar() código

Cifrado vacío (BYTE * Búfer)
{
Semilla de PALABRA = ((PALABRA)Búfer + 0x5e);
PALABRA Ver = ((PALABRA)Búfer + 0xba);

si (Ver)
{
para (int i = 0; i< 0xB9; i++) {
(PALABRA)(Buffer + i) += Semilla;
Semilla = (Semilla >> 15) | (Semilla<< 1);
Semilla -= (PALABRA)(Búfer + i) ^ i;
}

para (int i = 0xBE; i< 0xFF; i++) {
(PALABRA)(Buffer + i) -= Semilla;
Semilla = (Semilla >> 15) | (Semilla<< 1);
Semilla += (PALABRA)(Búfer + i) ^ i;
}

((PALABRA)Buffer + 0xba) = Semilla;
}
}

Se puede ver que el algoritmo es mucho más complejo que el habitual cambio y exclusiva "o". Y aquí está el algoritmo de descifrado:

Descifrar código()

descifrado vacío (BYTE* búfer)
{
Semilla de PALABRA = ((PALABRA)Búfer + 0x5e);
PALABRA Ver = ((PALABRA)Búfer + 0xba);

si (Ver) (
para (int i = 0xFE; i > 0xBD; i—) (
Semilla -= (PALABRA)(Búfer + i) ^ i;
Semilla = (Semilla<< 15) | (Seed >> 1);
(PALABRA)(Buffer + i) += Semilla;
}

para (int i = 0xB8; i >= 0; i—) (
Semilla += (PALABRA)(Búfer + i) ^ i;
Semilla = (Semilla<< 15) | (Seed >> 1);
(PALABRA)(Buffer + i) -= Semilla;
}

((PALABRA)Buffer + 0xba) = Semilla;
}
}

Luego sigue otra etapa de conversión de datos, más compleja y completamente dependiente de la estructura de la solicitud. No puedes hacer esto sin un desensamblador; tendrás que hurgar en la papelera y pedir prestado algo de código a los creadores. Esto no es fácil, ya que el código del controlador de seguridad está muy ofuscado, pero no tiene una variedad de trucos. Bastará con descompilar el controlador no por completo, sino sólo algunos fragmentos de código.

En conclusión, observo que construir un emulador de tablas basado en la interceptación de DeviceIoControl es una tarea bastante difícil. Pero este principio del emulador se puede utilizar en otro nivel de interacción: para crear un bus USB virtual.

Conclusión

Ésta no es la única forma de deshacerse del sistema de seguridad. Existen otros métodos más avanzados. Los principios descritos en el artículo también se pueden utilizar para analizar el funcionamiento de los controladores mediante la interceptación de paquetes IRP. De esta forma podrás añadir una buena herramienta a tu kit hecho en tu rodilla. ¡Buena suerte!

Para combatir la piratería informática, además de software especial, también se utilizan hardware y software. Se basan en el uso de dispositivos electrónicos conectados ya sea al bus interno del ordenador o a sus conectores externos. Si evaluamos el grado de confiabilidad de la protección por la cantidad de trabajo requerido para "romperla", entonces el hardware y el software son "más fuertes" que el software puro.

De hecho, para revelar tal defensa no basta con desentrañar los trucos del programa. Es necesario restablecer los protocolos y contenidos del intercambio de programas con equipos adicionales. La solución de estos problemas suele requerir el uso de hardware especial, como analizadores lógicos.

Una llave electrónica es un dispositivo compacto que se conecta a los puertos paralelo o serie de una computadora y no afecta la interacción de la computadora con dispositivos externos. La idea de proteger mediante una clave electrónica es utilizar un algoritmo especial para interactuar con la clave en el programa protegido, que no permite que el programa se ejecute sin ella. En este caso, cada copia del programa se entrega con una clave electrónica. Criterios para evaluar la calidad de una llave electrónica: la llave debe ser algún tipo de generador de funciones, y no solo una memoria de constantes; la clave debe realizarse sobre la base de un circuito integrado personalizado, lo que excluye la posibilidad de su reproducción legal.

Las llaves electrónicas se pueden utilizar para resolver las siguientes tareas:

  • protección de programas contra distribución no autorizada;
  • protección de datos contra la divulgación de la información contenida en ellos;
  • proteger las computadoras del acceso de personas no autorizadas

1. Los programas están protegidos de dos maneras. El primer método (llamémoslo manual) consiste en que el propio desarrollador integre en su programa fragmentos que interactúan con la llave electrónica. El segundo método se basa en la inclusión automática de intercambios de claves en el archivo protegido. En este caso, un programa especial suministrado con la clave procesa automáticamente los archivos ejecutables de tal manera que dejan de funcionar sin la clave. La ventaja de la protección automática sobre la protección manual es la intensidad de mano de obra casi nula de este procedimiento. Además, el programa de protección automática es creado por especialistas altamente calificados, lo que asegura su mayor confiabilidad.

2. La protección de los datos frente a la divulgación de la información contenida en ellos se consigue mediante cifrado. Existen métodos de cifrado bastante efectivos, como el algoritmo DES. Sin embargo, la seguridad del cifrado no puede ser mayor que el almacenamiento y la transmisión seguros de la clave de cifrado. En este caso, no es necesario recordar ni anotar la clave de cifrado y, lo que es muy importante, no es necesario introducirla en la computadora desde el teclado. Los datos almacenados en una computadora solo se pueden descifrar si la clave está disponible. Además, para aumentar la confiabilidad, el propio programa de cifrado/descifrado se puede proteger utilizando la misma clave.


3. Proteger su computadora de personas no autorizadas implica cargar el sistema operativo solo para usuarios autorizados, así como garantizar que cada usuario tenga acceso solo a los recursos asignados, que pueden incluir unidades lógicas, directorios y archivos individuales. La implementación de dicha protección está relacionada con la identificación del usuario. Para ello se pueden utilizar llaves electrónicas. En este caso, son posibles dos enfoques.

El primer enfoque supone que cada usuario autorizado tiene a su disposición una clave electrónica única. El reconocimiento de usuario se realiza sin introducir ninguna contraseña después de conectar la llave al conector. En este caso, se puede argumentar que la clave de los secretos del usuario se guarda en su bolsillo. Pero, si la computadora se utiliza en una organización, entonces la administración, por regla general, quiere tener acceso a todos los archivos y controlar el trabajo de todos los usuarios. Para hacer esto, debe tener al menos dos juegos de llaves idénticos, uno de los cuales lo conservará el director de la organización.

El segundo enfoque reduce el costo de la protección al utilizar una sola clave para todos los usuarios. La clave es administrada por el administrador del sistema designado por la dirección de la organización. El sistema operativo sólo se puede cargar cuando el dongle está conectado. La identificación del usuario se realiza mediante la introducción de contraseñas.

Preguntas de autoevaluación

  1. ¿Qué se entiende por el concepto de “amenaza” a la información?
  2. Características de las amenazas accidentales e intencionales.
  3. Canales de acceso intencional a la información
  4. Fuentes de violaciones de información.
  5. Principales canales de fuga de información.
  6. Clasificación de las medidas de protección de la información y sus características.
  7. ¿Cuál es la estrategia y táctica para proteger la información en la etapa de diseño y operación de sistemas?
  8. Concepto de autenticación. Tipos de autenticación
  9. Métodos y medios para proteger la información en los canales de comunicación.
  10. Propósito de una firma digital y métodos de su construcción.
  11. Áreas de aplicación de la firma digital.
  12. Finalidad y clasificación de las contraseñas. Ventajas y desventajas de cada grupo de contraseñas
  13. Medidas de seguridad biométricas. Sus características y áreas de aplicación.
  14. Ventajas y desventajas de las medidas de seguridad biométricas
  15. Cesión de llaves electrónicas. Áreas de su aplicación.

La integridad de los datos se refiere a un sistema de reglas de Microsoft Access que permite, cuando se cambia un objeto, cambiar automáticamente todos los objetos relacionados y brindar protección contra la eliminación o modificación accidental de datos relacionados.

La lista de valores se puede especificar mediante un conjunto fijo de valores que ingresa el usuario cuando se crea el campo, o mediante una lista de valores de una tabla de referencia o consulta.

Index es una herramienta de Microsoft Access que acelera la búsqueda y clasificación en una tabla. El campo clave de la tabla se indexa automáticamente. No puede crear índices en campos MEMO e Hipervínculo ni en campos de objetos OLE.

Un índice único es un índice definido para la propiedad Campo indexado con el valor "Sí (no se permiten coincidencias)". En este caso, resulta imposible ingresar valores duplicados en el campo indexado. Se crea automáticamente un índice único para los campos clave.

En el mundo de las tecnologías de la información en rápido desarrollo, la complejidad de las tareas de seguridad de la información es obvia; esto se ve confirmado por la aparición de cada vez más tipos nuevos de amenazas, actores y estándares de seguridad.
Los medios de protección pueden ser físicos o software. Las principales ventajas de las soluciones de software son el bajo coste y la velocidad. El uso de medios de protección criptográfica de hardware proporciona un mayor nivel de protección de la información confidencial, a diferencia del software. Sólo la protección física elimina la posibilidad de que los datos se vean comprometidos, incluso en caso de que los atacantes accedan directamente a los equipos y al almacenamiento de información.

Soluciones de hardware:

  • garantizar la seguridad de los datos frente a amenazas tanto externas como internas,
  • implementar protección a nivel físico,
  • Permitir el uso de normas adecuadas para el trabajo con información confidencial, basadas en los principios de responsabilidad colegiada y control mutuo.

Cifrado de hardware

El cifrado de hardware es el proceso de cifrado implementado por los dispositivos informáticos.
Como resultado, todas las transformaciones de datos se llevan a cabo en un entorno que no está controlado por depuradores y otras herramientas. Un producto de este tipo se puede presentar en forma de una "caja negra": los datos originales se suministran como entrada, los datos transformados se reciben como salida, mientras que el algoritmo de conversión en sí permanece desconocido (o conocido, pero luego la clave de cifrado, que se almacena en la memoria del dispositivo, y el acceso a él sigue siendo desconocido e imposible de obtener).

Ventajas del cifrado de hardware

Los cifradores de hardware tienen una serie de ventajas:

  • forma llaves confiables cifrado y firma digital: un sensor de números aleatorios de hardware crea números verdaderamente aleatorios,
  • preservar la integridad del algoritmo: está garantizada por la implementación del hardware,
  • El cifrado y el almacenamiento de claves se llevan a cabo en la propia placa codificadora, lo que dificulta el acceso.
  • cargue claves en el dispositivo de cifrado desde llaves electrónicas y tarjetas inteligentes Touch Memory (i-Button) directamente, y no a través del bus del sistema informático y la RAM; esto elimina la posibilidad de interceptar claves.
  • permitirle implementar sistemas de control de acceso informático,
  • utilice un procesador especializado para realizar todos los cálculos; esto alivia el procesador central de la computadora,
  • prever la posibilidad de utilizar buses parafásicos: esto elimina la amenaza de leer información clave sobre las fluctuaciones de la radiación electromagnética al crear un procesador de cifrado.
  • puede ser utilizado por una persona no capacitada: el dispositivo de cifrado simplemente se conecta a una computadora o módem, mientras que la implementación discreta de funciones de cifrado en el sistema operativo es un proceso bastante laborioso realizado por profesionales.

Soporte de hardware para mecanismos criptográficos.

Existen varios dispositivos que admiten mecanismos criptográficos.

Dispositivos de cifrado de hardware

El mercado moderno ofrece 3 tipos de hardware de cifrado de información a compradores potenciales.

Bloques de cifrado

Son dispositivos finales integrados en canales de comunicación: hardware de cifrado.

Módulos de cifrado autosuficientes

Los módulos de cifrado autosuficientes hacen todo el trabajo de claves por sí mismos. Por ejemplo, dispositivo USB ruToken, SHIPKA PCDST.

Tarjetas de expansión de cifrado

Figura 1 - Estructura de una placa de expansión de cifrado real

La versión clásica de un cifrador de hardware para una computadora personal es una tarjeta de expansión insertada en la ranura PCI de la placa base de la PC. Como regla general, un cifrador de hardware incluye una unidad de control, un procesador de cifrado, un sensor de números aleatorios de hardware, un controlador, chips de memoria, interruptores de modo de funcionamiento e interfaces para conectar medios clave.

Funciones adicionales de los cifradores de hardware

Muy a menudo, se añaden cifradores de hardware. funciones adicionales para justificar en parte su elevado coste.
Por ejemplo:

  • Generador de números aleatorios. Es necesario principalmente para generar claves criptográficas, pero no solo; por ejemplo, al calcular una firma de acuerdo con GOST R 34.10 - 2001, cada vez se utiliza un nuevo número aleatorio.
Es un control de inicio de sesión de computadora. Cada vez que el usuario enciende la computadora personal, el dispositivo le pedirá que ingrese información personal; por ejemplo, inserte un token. El sistema continuará arrancándose sólo si el dispositivo reconoce las claves proporcionadas y las considera "propias".
  • Monitorear la integridad de los archivos del sistema operativo. El cifrador almacena en su memoria una lista de todos los archivos importantes con sumas de comprobación previamente calculadas (o valores hash) para cada uno, y la computadora se bloqueará si la suma de comprobación de al menos uno de los archivos no coincide durante el siguiente arranque.
  • Tarjetas inteligentes

    Las tarjetas inteligentes son tarjetas de plástico con un microchip incorporado. A menudo tienen la capacidad de realizar cálculos criptográficos. En la mayoría de los casos, las tarjetas inteligentes contienen:

    • microprocesador,
    • un sistema operativo que controla el dispositivo y el acceso a los objetos en su memoria.

    Las tarjetas inteligentes se utilizan en diversas áreas, desde sistemas de descuento acumulativo hasta tarjetas de crédito y débito, teléfonos GSM, etc. El propósito de las tarjetas inteligentes es la autenticación de usuario de uno y dos factores, almacenando información clave y realizando operaciones criptográficas en un entorno confiable.

    Tipos de tarjetas inteligentes

    Las tarjetas inteligentes se pueden dividir según el método de intercambio con el lector en:

    • tarjetas inteligentes de contacto con interfaz ISO 7816,
    • tarjetas inteligentes de contacto con interfaz USB,
    • Tarjetas inteligentes sin contacto (RFID).

    Hay tarjetas que incluyen interfaces tanto de contacto como sin contacto.

    Las tarjetas inteligentes se pueden dividir por funcionalidad en: tarjetas de memoria (contienen una cierta cantidad de datos y un mecanismo para restringir el acceso a ellos), tarjetas inteligentes (contienen un microprocesador y la capacidad de administrar datos en la tarjeta).

    Tarjetas inteligentes de contacto con interfaz ISO 7816

    Las tarjetas inteligentes de contacto tienen un área de contacto que contiene varias pestañas de contacto pequeñas. Cuando la tarjeta se inserta en el lector, el chip entra en contacto con conectores eléctricos y el lector puede leer y/o escribir información del chip.
    Las tarjetas inteligentes de contacto más comunes son las tarjetas SIM y algunas tarjetas bancarias.

    Tarjetas inteligentes de contacto con interfaz USB

    Por lo general, son un chip de una tarjeta ISO 7816 normal, combinado con un lector USB en una carcasa en miniatura. Este tipo es muy conveniente para la autenticación informática.

    Tarjetas inteligentes sin contacto

    En las tarjetas inteligentes sin contacto, la comunicación con el lector se produce mediante tecnología RFID: es necesario acercar las tarjetas lo suficiente al lector. A menudo se utilizan en áreas donde la operación debe realizarse rápidamente, por ejemplo, en el transporte público. El estándar para las tarjetas inteligentes sin contacto es ISO/IEC 14443, menos comúnmente ISO/IEC 15693. Al igual que las tarjetas inteligentes con contacto, las tarjetas sin contacto no tienen baterías. Tienen un inductor incorporado para almacenar energía para el pulso de RF inicial, que luego se rectifica y se utiliza para operar la tarjeta. Ejemplos de tarjetas inteligentes sin contacto ampliamente utilizadas son las tarjetas de viaje en el metro y el transporte terrestre, los pasaportes electrónicos (“biométricos”) y algunos tipos de tarjetas en los sistemas de control de acceso (ACS).

    Tarjetas de memoria

    Contienen una cierta cantidad de datos y un mecanismo fijo para restringir el acceso a ellos. Por regla general, se trata de tarjetas para micropagos en transporte, parques recreativos, tarjetas de fidelización de clientes, etc. Los mecanismos de restricción de acceso pueden ser muy simples (entrada única, contraseña, número único) o más complejos (autenticación mutua mediante criptoalgoritmos simétricos estándar). AES,DES). Este es el tipo más común de tarjeta inteligente.

    Tarjetas inteligentes

    Contienen un microprocesador y la posibilidad de descargar algoritmos para su funcionamiento. Las posibles acciones de dichas tarjetas incluyen acciones de autenticación complejas, protocolos de intercambio complejos, registro de datos de acceso, etc. Además de la criptografía simétrica (AES, DES), conocen la criptografía asimétrica (RSA), los algoritmos de infraestructura de clave pública (PKI) y tienen Generadores de números aleatorios de hardware, protección mejorada contra ataques físicos. Por regla general, funcionan bajo un sistema operativo (por ejemplo, JCOP o MULTOS) y están equipados con un paquete de certificados adecuado. Algunos ejemplos son los pasaportes y visas electrónicos (“biométricos”) y las tarjetas SIM.

    fichas

    Token (también token de hardware, llave USB, token criptográfico) es un dispositivo compacto diseñado para garantizar la seguridad de la información del usuario, también se utiliza para identificar a su propietario, proteger acceso remoto a recursos de información, etc. Por regla general, se trata de un dispositivo físico que se utiliza para simplificar la autenticación.
    Los tokens están destinados a la identificación electrónica y se pueden utilizar en lugar de una contraseña o junto con ella. Por lo general, las fichas de hardware son pequeñas y caben fácilmente en el bolsillo como llavero. Algunos están diseñados para almacenar claves criptográficas, como una firma electrónica o datos biométricos (como detalles del patrón de huellas dactilares). Algunos tienen protección incorporada contra piratería, otros tienen un mini teclado para ingresar un código PIN o simplemente un botón para iniciar el procedimiento de generación y una pantalla para mostrar la clave generada. Los tokens tienen un conector USB, funcionalidad RFID o una interfaz inalámbrica Bluetooth para transmitir la secuencia de claves generada al sistema cliente.

    Tipos de contraseña

    Todos los tokens contienen información secreta que se utiliza para verificar la identidad. Hay varias maneras de utilizar esta información:

    • Un token con una contraseña estática. El dispositivo contiene una contraseña físicamente oculta (no visible para el propietario), pero que se transmite en cada autenticación. Este tipo es vulnerable a ataques de repetición.
    • Un token con una contraseña dinámica sincrónica. El dispositivo genera una nueva contraseña única en un intervalo de tiempo determinado. El token y el servidor deben estar sincronizados para que la contraseña se acepte correctamente.
    • Token con contraseña asíncrona. Una contraseña de un solo uso se genera sin el uso de un reloj, utilizando el cifrado Vernam u otro algoritmo criptográfico.
    • Token de desafío-respuesta. Usando criptografía con Llave pública, es posible demostrar la propiedad de una clave privada sin revelarla. El servidor de autenticación cifra el desafío (normalmente un número aleatorio, o al menos datos con algunas partes aleatorias) utilizando una clave pública. El dispositivo demuestra que tiene una copia de la clave privada correspondiente proporcionando un desafío descifrado.
    • Contraseñas de un solo uso sincronizadas con el tiempo. Las contraseñas de un solo uso sincronizadas cambian constantemente en fijar tiempo, por ejemplo, una vez por minuto. Para hacer esto, debe haber sincronización entre el token del cliente y el servidor de autenticación. Para dispositivos no conectados a la red, esta sincronización se realiza antes de que el cliente haya comprado el token. Otros tipos de tokens se sincronizan cuando el token se inserta en un dispositivo de entrada.
    • Contraseñas de un solo uso basadas en un algoritmo matemático. Otro tipo de contraseña de un solo uso utiliza un algoritmo matemático complejo, como una cadena hash, para crear una serie de contraseñas de un solo uso a partir de una clave secreta. Ninguna de las contraseñas se puede adivinar, incluso si se conocen las contraseñas anteriores. Existe un algoritmo OATH estandarizado y disponible públicamente; Otros algoritmos están cubiertos por patentes estadounidenses. Cada nueva contraseña debe ser única, por lo que un usuario no autorizado no podrá adivinar cuál podría ser la nueva contraseña basándose en las contraseñas utilizadas anteriormente.

    tipos de fichas

    Fichas sin conexión

    Los tokens sin conexión no tienen conexión física o lógica con la computadora del cliente. Por lo general, no requieren un dispositivo de entrada especial, sino que utilizan una pantalla integrada para mostrar los datos de autenticación generados, que el usuario a su vez ingresa manualmente usando un teclado. Los tokens sin conexión son el tipo más común de token utilizado (normalmente en combinación con una contraseña) en la autenticación de dos factores para la identificación en línea.

    Fichas con conexión

    Los tokens de conexión deben estar asociados físicamente con la computadora en la que se autentica al usuario. Los tokens de este tipo transfieren automáticamente información de autenticación a la computadora del cliente tan pronto como se establece una conexión física. Esto evita que el usuario tenga que introducir datos de autenticación manualmente. Para utilizar un token conectado, se debe instalar el dispositivo de entrada adecuado. Los tokens de conectividad más comunes son las tarjetas inteligentes y los USB, que requieren un lector de tarjetas inteligentes y un puerto USB, respectivamente.

    Tokens que utilizan tecnología de tarjeta inteligente

    Muchos tokens conectados utilizan tecnologías de tarjetas inteligentes. Las tarjetas inteligentes son económicas y contienen mecanismos de seguridad probados. Sin embargo, el rendimiento informático de las tarjetas inteligentes es bastante limitado debido al bajo consumo de energía y a la necesidad de formas ultrafinas. Las tarjetas inteligentes basadas en tokens USB, que contienen un chip de tarjeta inteligente en su interior, proporcionan funcionalidad tanto USB como de tarjeta inteligente. No requieren un dispositivo de entrada único, pero aun así contienen varias soluciones de seguridad diferentes y brindan la protección de una tarjeta inteligente tradicional.

    Fichas inalámbricas

    A diferencia de los tokens de conexión, los tokens inalámbricos forman una conexión lógica con la computadora del cliente y no requieren una conexión física. La falta de contacto físico requerido los hace más convenientes que los tokens conectados y los tokens no conectados. Como resultado, este tipo de token es una opción popular para sistemas de pago electrónico y entrada sin llave como Mobil Speedpass, que utilizan RFID para transmitir información de autenticación desde el token del llavero. Sin embargo, existen varias preocupaciones de seguridad después de que una investigación de la Universidad Johns Hopkins y los Laboratorios RSA descubrieran que las etiquetas RFID se pueden piratear fácilmente. Otro problema es que los tokens inalámbricos tienen una vida útil relativamente corta (de 3 a 5 años), mientras que los tokens USB pueden durar hasta 10 años.

    fichas bluetooth

    Los tokens Bluetooth suelen incluir un conector USB, es decir. Si no hay conexión Bluetooth, puede utilizar la entrada USB. La autenticación Bluetooth funciona a una distancia de unos 10 metros.

    Generadores de secuencias binarias pseudoaleatorias.

    Para resolver el problema de generar secuencias binarias impredecibles de gran longitud utilizando una clave aleatoria corta, se utilizan ampliamente los generadores correspondientes. Se utilizan en la mayoría de los algoritmos de cifrado, especialmente en los de transmisión.
    El generador de secuencia de claves produce un flujo de bits que parece aleatorio, pero que en realidad es determinista y puede reproducirse exactamente en el extremo receptor. Cuanto más similar sea el flujo generado al azar, más tiempo le llevará a un criptoanalista descifrar el cifrado. Sin embargo, si el generador produce la misma secuencia cada vez que se enciende, entonces será fácil piratear el criptosistema. Por ejemplo, en el caso de utilizar cifrado de flujo, después de haber interceptado dos textos cifrados, un atacante puede agregarlos en módulo 2 y obtener dos textos originales, también agregados en módulo 2.
    Todos los generadores de secuencias aleatorias dependen de la clave.

    Estructura del generador

    La estructura del generador de secuencia de claves se puede representar como una máquina de estados finitos con memoria, que consta de tres bloques:

    • un bloque de memoria que almacena información sobre el estado del generador,
    • función de salida que genera un bit de secuencia de clave dependiendo del estado,
    • una función de transición que especifica un nuevo estado al que el generador pasará en el siguiente paso.

    Actualmente, existen varios miles de versiones diferentes de generadores de números pseudoaleatorios.

    Métodos para obtener secuencias pseudoaleatorias.

    Un generador lineal congruente (LCG) es una secuencia de números de 0 a m−1 que satisface la siguiente expresión recurrente, X0 es el valor inicial, a es el multiplicador, b es el incremento, m es el módulo. Un generador de este tipo tiene un período inferior a m. Si a, b, m se eligen correctamente, entonces el generador es un generador de longitud máxima y tiene un período m (por ejemplo, mcd(m, b) = 1). La principal ventaja de los generadores lineales congruentes es su velocidad, debido al pequeño número de operaciones por byte, y su facilidad de implementación. Desafortunadamente, estos generadores rara vez se utilizan en criptografía porque son predecibles. Desafortunadamente, LCG no se puede utilizar para construir cifrados de flujo: son predecibles y Joan Boyar los descifró por primera vez. También hackeó osciladores cuadráticos. Generadores congruentes no lineales A veces se utilizan generadores congruentes cuadráticos y cúbicos, que son más resistentes al pirateo. El generador de congruencias cuadráticas tiene la forma. El generador cúbico se especifica de manera similar. Para aumentar el tamaño del período de repetición de generadores congruentes, a menudo se utiliza su unión (superposición) mediante una transformación (función) no lineal. Esto no reduce la seguridad criptográfica, pero dichos generadores tienen un mejor rendimiento en algunas pruebas estadísticas. registro lineal con comentario(LFSR) consta de dos partes: un registro de desplazamiento y una secuencia de tap. Un registro de desplazamiento es una secuencia de bits. Tan pronto como necesitamos el siguiente bit, todos los bits del registro de desplazamiento se desplazan hacia la derecha y el LFSR genera el bit más significativo. En este caso, el bit menos significativo se determina calculando XOR a partir de los demás bits del registro, según la secuencia de bifurcación. En teoría, un LFSR de n bits puede generar una secuencia pseudoaleatoria de 2n-1 bits de longitud antes del bucle. Para hacer esto, el registro de desplazamiento debe visitar todos los 2n−1 estados internos (el número de estados es exactamente 2n−1, no 2n, ya que un registro de desplazamiento que consta de ceros provocará una secuencia infinita de ceros, lo cual no es particularmente conveniente) . Solo algunas secuencias de derivaciones pasan por todos los estados 2n-1; los LFSR con tales secuencias de derivaciones se denominan LFSR de longitud máxima.

    Utilizando sensores físicos de procesos aleatorios.

    Los datos de varios procesos físicos se utilizan como parámetro aleatorio. Los parámetros para generar secuencias se leen mediante sensores físicos. Una ventaja al utilizar sensores físicos es la capacidad de generar secuencias aleatorias que no están correlacionadas durante un largo período, que no pueden reproducirse en iteraciones posteriores.

    sensor biológico

    El elemento aleatorio son los momentos de tiempo registrados en los momentos de uso de los dispositivos de entrada. Toma mucho tiempo.

    sensor de ruido

    Un elemento aleatorio es una secuencia de pulsos de dispositivos electrónicos, ruido de radioteléfono, etc.

    Coprocesadores criptográficos

    Un coprocesador es un procesador especializado que amplía las capacidades del procesador central de un sistema informático, pero está diseñado como un módulo funcional independiente. Físicamente, el coprocesador puede ser un chip separado o puede estar integrado en el procesador central. La seguridad, y especialmente la seguridad de la red, es otra área donde los coprocesadores se utilizan ampliamente. Cuando se establece una conexión entre un cliente y un servidor, normalmente necesitan autenticarse entre sí. Usando una conexión segura (cifrada) establecida de esta manera, puede transferir datos y no pensar en intrusos escuchando la línea. El problema aquí es que la seguridad la proporciona la criptografía, un área que requiere mucha computación. En criptografía, actualmente se consideran dos enfoques principales para la protección de datos: el cifrado de clave privada y el cifrado de clave pública. El primero se basa en una mezcla muy cuidadosa de bits. El segundo enfoque se basa en multiplicar y exponenciar números grandes (1024 bits), lo que requiere mucho tiempo.

    Cifrado con clave secreta

    El cifrado de clave privada se basa en el principio de que sólo el personal autorizado tiene acceso a la clave.
    Esta clave debe mantenerse en secreto. Si no se mantiene la confidencialidad, un extraño podría obtener acceso no autorizado a información cifrada.
    El algoritmo de clave privada más utilizado es el Estándar de cifrado de datos (DES). Este algoritmo, desarrollado por IBM en la década de 1970, ha sido adoptado como estándar estadounidense para comunicaciones gubernamentales comerciales y no clasificadas. Las velocidades de computación modernas son un orden de magnitud más rápidas que las de los años setenta, por lo que el algoritmo DES se considera obsoleto desde al menos 1998. Otros sistemas de cifrado de clave privada conocidos son RC2, RC4, RC5, triple DES e IDEA. El triple algoritmo DES proporciona un grado suficiente de protección. Este algoritmo utiliza el mismo método de cifrado que DES, pero lo aplica tres veces, utilizando hasta tres claves diferentes. El texto sin formato se cifra con la primera clave, se descifra con la segunda clave y luego se cifra con la tercera clave.
    La desventaja obvia de los algoritmos de clave privada es que para enviar un mensaje seguro a alguien, debe tener una forma segura de transmitir la clave privada a esa persona.

    Cifrado de clave pública

    El cifrado de clave pública se basa en dos claves diferentes, una clave pública y una clave privada. La clave pública se utiliza para cifrar mensajes, la clave privada se utiliza para descifrarlos. La ventaja de este enfoque es que, como su nombre indica, la clave pública se puede distribuir libremente. Cualquier persona a la que le hayas dado tu clave pública puede enviarte un mensaje seguro. Pero como sólo usted tiene la clave privada, sólo usted puede descifrar el mensaje.
    El algoritmo de clave pública más famoso es el algoritmo RSA, desarrollado por Rivest, Shamir y Adelman en el Instituto Tecnológico de Michigan (MIT) y publicado en 1978.
    A menudo se pueden encontrar sistemas híbridos. En tales sistemas, se utiliza un algoritmo de clave pública para transmitir una clave privada, que se utiliza para comunicarse hasta el final de la comunicación. Esta complejidad adicional se ve compensada por el hecho de que los algoritmos de clave privada son tres órdenes de magnitud más rápidos que los algoritmos de clave pública.
    Muchas empresas han lanzado coprocesadores criptográficos que le permiten cifrar datos para una transmisión segura y luego descifrarlos. Suelen ser tarjetas de expansión que se insertan en una ranura PCI. Gracias a un hardware especial, estos procesadores pueden realizar los cálculos criptográficos necesarios mucho más rápido que una unidad central de procesamiento.

    Conclusión

    Principales conclusiones:

    • la mayor seguridad de los datos se logra cuando todos los medios y métodos utilizados se combinan en un mecanismo único e integral de protección de la información,
    • el mecanismo de protección debe diseñarse en paralelo con la creación de los sistemas de procesamiento de datos, a partir del momento en que se desarrolla el diseño general del sistema,
    • el funcionamiento del mecanismo de protección debe planificarse y garantizarse junto con la planificación y provisión de procesos básicos de procesamiento automatizado de información,
    • Es necesario controlar constantemente el funcionamiento del mecanismo de protección.

    Tener algoritmos de funcionamiento únicos para cada tecla. Los dongles también tienen una memoria no volátil pequeña y segura; los dispositivos más complejos pueden tener un criptoprocesador incorporado (para la implementación de algoritmos de cifrado en el hardware) y un reloj en tiempo real. Los dongles de hardware pueden venir en una variedad de factores de forma, pero la mayoría de las veces se conectan a una computadora a través de USB. También se encuentra con interfaces LPT o PCMCIA.

    Principio de funcionamiento de las llaves electrónicas.. La clave está adjunta a una interfaz de computadora específica. A continuación, el programa protegido le envía información a través de un controlador especial, que se procesa de acuerdo con un algoritmo determinado y se devuelve. Si la respuesta de la clave es correcta, entonces el programa continúa su trabajo. De lo contrario, puede realizar acciones especificadas por los desarrolladores, por ejemplo, cambiar al modo de demostración o bloquear el acceso a determinadas funciones.

    Existen claves especiales que pueden otorgar licencia (limitar la cantidad de copias de programas que se ejecutan en la red) de una aplicación protegida a través de la red. En este caso, una clave es suficiente para toda la red local. La clave se instala en cualquier estación de trabajo o servidor de la red. Las aplicaciones protegidas acceden a la clave a través de la red local. La ventaja es que no necesitan llevar consigo una llave electrónica para trabajar con la aplicación dentro de la red local.

    Historia

    Proteger el software del uso sin licencia aumenta las ganancias del desarrollador. Hoy en día, existen varios enfoques para resolver este problema. La gran mayoría de los creadores de software utilizan varios módulos de software que controlan el acceso de los usuarios mediante claves de activación, números de serie, etc. Esta protección es una solución económica y no puede pretender ser fiable. Internet está repleto de programas que le permiten generar ilegalmente una clave de activación (generadores de claves) o bloquear una solicitud de un número de serie/clave de activación (parches, cracks). Además, no se debe descuidar el hecho de que el propio usuario legal puede hacer público su número de serie.

    Estas obvias deficiencias llevaron a la creación de protección de software basada en hardware en forma de llave electrónica. Se sabe que las primeras llaves electrónicas (es decir, dispositivos de hardware para proteger el software de copias ilegales) aparecieron a principios de la década de 1980, pero, por razones obvias, es muy difícil establecer la primacía en la idea y la creación directa del dispositivo.

    Protección del software mediante llave electrónica

    Kit de desarrollo de software

    Los dongles se clasifican como métodos de hardware para la protección de software, pero los dongles electrónicos modernos a menudo se definen como sistemas de herramientas de hardware y software multiplataforma para la protección de software. El caso es que, además de la propia clave, las empresas que producen claves electrónicas proporcionan un SDK (Software Developer Kit). El SDK incluye todo lo que necesita para comenzar a utilizar la tecnología presentada en sus propios productos de software: herramientas de desarrollo, documentación técnica completa, soporte para varios sistemas operativos, ejemplos detallados, fragmentos de código y herramientas de protección automática. El SDK también puede incluir claves de demostración para crear proyectos de prueba.

    Tecnología de protección

    La tecnología de protección contra el uso no autorizado de software se basa en implementar solicitudes de un archivo ejecutable o biblioteca dinámica en una clave, seguido de recibir y, si se proporciona, analizar la respuesta. A continuación se muestran algunas consultas típicas:

    • comprobar si la llave está conectada;
    • leer los datos que necesita el programa de la clave como parámetro de inicio (se usa principalmente solo cuando se busca una clave adecuada, pero no para protección);
    • una solicitud para descifrar datos o código ejecutable necesarios para el funcionamiento del programa, cifrado al proteger el programa (permite la "comparación con el estándar"; en el caso del cifrado de código, la ejecución de código no descifrado genera un error);
    • una solicitud para descifrar datos previamente cifrados por el propio programa (le permite enviar diferentes solicitudes a la clave cada vez y, por lo tanto, protegerse de la emulación de bibliotecas API/la clave misma)
    • verificar la integridad del código ejecutable comparando su suma de verificación actual con la suma de verificación original leída de la clave (por ejemplo, ejecutando la firma digital del código u otros datos transmitidos mediante el algoritmo de la clave y verificando esta firma digital dentro de la aplicación; desde la firma digital siempre es diferente - una característica del algoritmo criptográfico - esto también ayuda a proteger contra la emulación de API/clave);
    • una solicitud al reloj de tiempo real integrado en la llave (si está disponible; se puede realizar automáticamente si el tiempo de funcionamiento de los algoritmos de hardware de la llave está limitado por su temporizador interno);
    • etc.

    Vale la pena señalar que algunas claves modernas (Guardant Code de Aktiv Company, LOCK de Astroma Ltd., Rockey6 Smart de Feitian, Senselock de Seculab) permiten al desarrollador almacenar sus propios algoritmos o incluso partes separadas del código de la aplicación (por ejemplo , algoritmos de desarrollador específicos que reciben una gran cantidad de parámetros en la entrada) y realizarlos en la misma clave en su propio microprocesador. Además de proteger el software del uso ilegal, este enfoque le permite proteger el algoritmo utilizado en el programa para que no sea estudiado, clonado y utilizado en sus aplicaciones por parte de la competencia. Sin embargo, para un algoritmo simple (y los desarrolladores a menudo cometen el error de elegir un algoritmo que no es lo suficientemente complejo para cargar), el criptoanálisis se puede realizar utilizando el método de análisis de caja negra.

    Como se desprende de lo anterior, el "corazón" de la clave electrónica es el algoritmo de conversión (criptográfico u otro). En las claves modernas, se implementa en hardware; esto prácticamente elimina la creación de un emulador de clave completo, ya que la clave de cifrado nunca se transmite a la salida del dongle, lo que elimina la posibilidad de su interceptación.

    El algoritmo de cifrado puede ser secreto o público. Los algoritmos secretos son desarrollados por el propio fabricante del equipo de seguridad, incluso individualmente para cada cliente. La principal desventaja de utilizar tales algoritmos es la imposibilidad de evaluar la solidez criptográfica. Fue posible decir con confianza qué tan confiable era el algoritmo solo después del hecho: fue pirateado o no. Un algoritmo público, o “código abierto”, tiene una fuerza criptográfica incomparablemente mayor. Estos algoritmos no son probados por personas al azar, sino por una serie de expertos especializados en análisis de criptografía. Ejemplos de tales algoritmos son los ampliamente utilizados GOST 28147-89, AES, RSA, Elgamal, etc.

    Protección automatizada

    Para la mayoría de las familias de claves de hardware, se han desarrollado herramientas automáticas (incluidas en el SDK) que le permiten proteger el programa "con unos pocos clics del mouse". En este caso, el archivo de la aplicación está "envuelto" en el propio código del desarrollador. La funcionalidad implementada por este código varía según el fabricante, pero la mayoría de las veces el código verifica la presencia de una clave, controla la política de licencia (establecida por el proveedor de software), implementa un mecanismo para proteger el archivo ejecutable contra la depuración y descompilación ( por ejemplo, comprimir el archivo ejecutable), etc.

    Lo importante es que utilizar la herramienta de protección automática no requiere acceso al código fuente de la aplicación. Por ejemplo, al localizar productos extranjeros (cuando no hay posibilidad de interferir con el código fuente del software), dicho mecanismo de protección es indispensable, pero no permite aprovechar todo el potencial de las llaves electrónicas e implementar una protección flexible e individual.

    Implementación de protección mediante funciones API

    Además de utilizar la protección automática, el desarrollador de software tiene la oportunidad de desarrollar la protección de forma independiente integrando el sistema de protección en la aplicación a nivel del código fuente. Para ello, el SDK incluye bibliotecas para varios lenguajes de programación que contienen una descripción de la funcionalidad API para una clave determinada. La API es un conjunto de funciones diseñadas para intercambiar datos entre la aplicación, el controlador del sistema (y el servidor en el caso de claves de red) y la clave misma. Las funciones API proporcionan diversas operaciones con la clave: buscar, leer y escribir en la memoria, cifrar y descifrar datos mediante algoritmos de hardware, licenciar software de red, etc.

    La aplicación hábil de este método garantiza un alto nivel de seguridad de la aplicación. Es bastante difícil neutralizar la protección integrada en la aplicación debido a su singularidad y naturaleza "difusa" en el cuerpo del programa. La mera necesidad de estudiar y modificar el código ejecutable de una aplicación protegida para eludir la protección es un serio obstáculo para piratearla. Por lo tanto, la tarea del desarrollador de seguridad, en primer lugar, es protegerse contra posibles métodos de piratería automatizados implementando su propia protección mediante la API de administración de claves.

    Protección de derivación

    No hay información sobre la emulación completa de claves Guardant modernas. Los emuladores de tablas existentes se implementan sólo para aplicaciones específicas. La posibilidad de su creación se debió a la no utilización (o uso analfabeto) de la funcionalidad básica de las claves electrónicas por parte de los desarrolladores de seguridad.

    Tampoco hay información sobre la emulación total o al menos parcial de las teclas LOCK, ni sobre otras formas de eludir esta protección.

    Hackear un módulo de software

    El atacante examina la lógica del propio programa para, tras analizar todo el código de la aplicación, seleccionar un bloque de protección y desactivarlo. La piratería de programas se logra mediante la depuración (o ejecución paso a paso), la descompilación y el volcado de RAM. Estos métodos de análisis de código de programa ejecutable suelen ser utilizados por los atacantes en combinación.

    La depuración se lleva a cabo mediante un programa especial: el depurador, que le permite ejecutar cualquier aplicación paso a paso, emulando su entorno operativo. Una característica importante del depurador es la capacidad de instalar puntos de parada (o condiciones) ejecución de código. Utilizándolos, es más fácil para un atacante rastrear lugares en el código en los que se implementa el acceso a la clave (por ejemplo, detener la ejecución en un mensaje como "¡Falta la clave! Verifique la presencia de la clave en la interfaz USB ”).

    Desmontaje- un método para convertir el código de módulos ejecutables en un lenguaje de programación comprensible para los humanos: ensamblador. En este caso, el atacante obtiene una copia impresa (lista) de lo que hace la aplicación.

    Descompilación- convertir el módulo ejecutable de la aplicación en código de programa en un lenguaje de alto nivel y obtener una representación de la aplicación cercana al código fuente. Solo se puede realizar para algunos lenguajes de programación (en particular, para aplicaciones .NET creadas en C# y distribuidas en código de bytes, un lenguaje interpretado de nivel relativamente alto).

    La esencia del ataque usando. volcado de memoria Consiste en leer el contenido de la RAM en el momento en que la aplicación comienza a ejecutarse con normalidad. Como resultado, el atacante recibe el código de trabajo (o la parte de interés) en su "forma pura" (si, por ejemplo, el código de la aplicación estaba cifrado y solo se descifra parcialmente durante la ejecución de una u otra sección). Lo principal para un atacante es elegir el momento adecuado.

    Tenga en cuenta que hay muchas formas de contrarrestar la depuración y los desarrolladores de seguridad las utilizan: no linealidad del código (multiproceso), secuencia de ejecución no determinista, "ensuciar" el código (con funciones inútiles que realizan operaciones complejas en orden). para confundir al atacante), utilizando las imperfecciones de los propios depuradores, etc.



    Compartir