La ingeniería inversa (también conocida como ingeniería inversa o ingeniería inversa ) es un proceso o método mediante el cual se intenta comprender mediante razonamiento deductivo cómo un dispositivo, proceso, sistema o pieza de software previamente creado realiza una tarea con muy poca (o ninguna) comprensión de cómo lo hace exactamente. Dependiendo del sistema en consideración y las tecnologías empleadas, el conocimiento adquirido durante la ingeniería inversa puede ayudar a reutilizar objetos obsoletos, realizar análisis de seguridad o aprender cómo funciona algo. [1] [2] [3]
Aunque el proceso es específico del objeto en el que se realiza, todos los procesos de ingeniería inversa constan de tres pasos básicos: extracción de información, modelado y revisión. La extracción de información es la práctica de recopilar toda la información relevante para realizar la operación. El modelado es la práctica de combinar la información recopilada en un modelo abstracto, que puede usarse como guía para diseñar el nuevo objeto o sistema. La revisión es la prueba del modelo para garantizar la validez del resumen elegido. [1] La ingeniería inversa es aplicable en los campos de la ingeniería informática , la ingeniería mecánica , el diseño , la ingeniería electrónica , la ingeniería de software , la ingeniería química , [4] y la biología de sistemas . [5]
Existen muchas razones para realizar ingeniería inversa en diversos campos. La ingeniería inversa tiene su origen en el análisis de hardware para obtener ventajas comerciales o militares. [6] : 13 Sin embargo, el proceso de ingeniería inversa no siempre se ocupa de crear una copia o cambiar el artefacto de alguna manera. Puede utilizarse como parte de un análisis para deducir características de diseño de productos con poco o ningún conocimiento adicional sobre los procedimientos involucrados en su producción original. [6] : 15
En algunos casos, el objetivo del proceso de ingeniería inversa puede ser simplemente una redocumentación de sistemas heredados . [6] : 15 [7] Incluso cuando el producto diseñado mediante ingeniería inversa es el de un competidor, el objetivo puede no ser copiarlo sino realizar un análisis de la competencia . [8] La ingeniería inversa también se puede utilizar para crear productos interoperables y, a pesar de algunas leyes de los Estados Unidos y la Unión Europea estrictamente adaptadas, la legalidad de utilizar técnicas específicas de ingeniería inversa para ese propósito ha sido objeto de acalorados debates en tribunales de todo el mundo durante más de dos décadas. [9]
La ingeniería inversa de software puede ayudar a mejorar la comprensión del código fuente subyacente para el mantenimiento y la mejora del software, se puede extraer información relevante para tomar una decisión sobre el desarrollo de software y las representaciones gráficas del código pueden proporcionar vistas alternativas con respecto al código fuente, lo que puede ayudar a detectar y corregir un error o vulnerabilidad del software. Con frecuencia, a medida que se desarrolla un software, su información de diseño y mejoras suelen perderse con el tiempo, pero esa información perdida generalmente se puede recuperar con ingeniería inversa. El proceso también puede ayudar a reducir el tiempo necesario para comprender el código fuente, lo que reduce el costo general del desarrollo del software. [10] La ingeniería inversa también puede ayudar a detectar y eliminar un código malicioso escrito en el software con mejores detectores de código. La reversión de un código fuente se puede utilizar para encontrar usos alternativos del código fuente, como detectar la replicación no autorizada del código fuente donde no estaba destinado a ser utilizado, o revelar cómo se construyó el producto de un competidor. [11] Ese proceso se utiliza comúnmente para "craquear" software y medios para eliminar su protección de copia , [11] : 7 o para crear una copia posiblemente mejorada o incluso una imitación , que suele ser el objetivo de un competidor o un pirata informático. [11] : 8
Los desarrolladores de malware a menudo utilizan técnicas de ingeniería inversa para encontrar vulnerabilidades en un sistema operativo y crear un virus informático que pueda explotar las vulnerabilidades del sistema. [11] : 5 La ingeniería inversa también se utiliza en el criptoanálisis para encontrar vulnerabilidades en el cifrado de sustitución , el algoritmo de clave simétrica o la criptografía de clave pública . [11] : 6
La ingeniería inversa tiene otros usos:
A medida que el diseño asistido por computadora (CAD) se ha vuelto más popular, la ingeniería inversa se ha convertido en un método viable para crear un modelo virtual 3D de una parte física existente para su uso en CAD 3D , CAM , CAE u otro software . [14] El proceso de ingeniería inversa implica medir un objeto y luego reconstruirlo como un modelo 3D. El objeto físico se puede medir utilizando tecnologías de escaneo 3D como CMM , escáneres láser , digitalizadores de luz estructurada o escaneo CT industrial (tomografía computarizada). Los datos medidos por sí solos, generalmente representados como una nube de puntos , carecen de información topológica e intención de diseño. La primera se puede recuperar convirtiendo la nube de puntos en una malla de caras triangulares . La ingeniería inversa tiene como objetivo ir más allá de la producción de dicha malla y recuperar la intención de diseño en términos de superficies analíticas simples cuando sea apropiado ( planos , cilindros , etc.) así como posiblemente superficies NURBS para producir un modelo CAD de representación de límites . La recuperación de dicho modelo permite modificar un diseño para satisfacer nuevos requisitos, generar un plan de fabricación, etc.
El modelado híbrido es un término que se utiliza con frecuencia cuando se implementan conjuntamente NURBS y modelado paramétrico . El uso de una combinación de superficies geométricas y de forma libre puede proporcionar un método poderoso de modelado 3D . Las áreas de datos de forma libre se pueden combinar con superficies geométricas exactas para crear un modelo híbrido. Un ejemplo típico de esto sería la ingeniería inversa de una culata de cilindro, que incluye características de fundición de forma libre, como camisas de agua y áreas mecanizadas de alta tolerancia. [15]
Las empresas también utilizan la ingeniería inversa para incorporar la geometría física existente a entornos de desarrollo de productos digitales, para realizar un registro digital en 3D de sus propios productos o para evaluar los productos de la competencia. Se utiliza para analizar cómo funciona un producto, qué hace, qué componentes tiene, estimar costos, identificar posibles infracciones de patentes , etc.
La ingeniería de valor , una actividad relacionada que también utilizan las empresas, implica deconstruir y analizar productos. Sin embargo, el objetivo es encontrar oportunidades para reducir costos.
La ingeniería inversa de placas de circuitos impresos implica recrear los datos de fabricación de una placa de circuitos en particular. Esto se hace principalmente para identificar un diseño y conocer las características funcionales y estructurales de un diseño. También permite descubrir los principios de diseño detrás de un producto, especialmente si esta información de diseño no está fácilmente disponible.
Las PCB obsoletas suelen ser objeto de ingeniería inversa, especialmente cuando cumplen funciones muy críticas, como alimentar maquinaria u otros componentes electrónicos. La ingeniería inversa de estas piezas antiguas puede permitir la reconstrucción de la PCB si cumple alguna tarea crucial, así como la búsqueda de alternativas que proporcionen la misma función o la actualización de la PCB antigua. [16]
La ingeniería inversa de las PCB sigue en gran medida la misma serie de pasos. Primero, se crean imágenes dibujando, escaneando o tomando fotografías de la PCB. Luego, estas imágenes se transfieren a un software de ingeniería inversa adecuado para crear un diseño rudimentario para la nueva PCB. La calidad de estas imágenes, necesaria para una ingeniería inversa adecuada, es proporcional a la complejidad de la propia PCB. Las PCB más complicadas requieren fotos bien iluminadas sobre fondos oscuros, mientras que las PCB bastante simples se pueden recrear simplemente con un dimensionamiento básico. Cada capa de la PCB se recrea cuidadosamente en el software con la intención de producir un diseño final lo más parecido posible al inicial. Luego, los esquemas del circuito se generan finalmente utilizando una herramienta adecuada. [17]
En 1990, el Instituto de Ingenieros Eléctricos y Electrónicos (IEEE) definió la ingeniería inversa (SRE) (software) como "el proceso de analizar un sistema objeto para identificar los componentes del sistema y sus interrelaciones y crear representaciones del sistema en otra forma o en un nivel más alto de abstracción" en el que el "sistema objeto" es el producto final del desarrollo de software. La ingeniería inversa es un proceso de examen únicamente, y el sistema de software en cuestión no se modifica, lo que de otro modo sería una reingeniería o reestructuración. La ingeniería inversa se puede realizar desde cualquier etapa del ciclo del producto, no necesariamente desde el producto final funcional. [10]
La ingeniería inversa tiene dos componentes: la redocumentación y la recuperación del diseño. La redocumentación es la creación de una nueva representación del código informático para que sea más fácil de entender. Por su parte, la recuperación del diseño es el uso de la deducción o el razonamiento a partir del conocimiento general o la experiencia personal del producto para comprender por completo su funcionalidad. [10] También puede considerarse como "retroceder a través del ciclo de desarrollo". [18] En este modelo, el resultado de la fase de implementación (en forma de código fuente) se somete a ingeniería inversa para volver a la fase de análisis, en una inversión del modelo tradicional en cascada . Otro término para esta técnica es comprensión del programa . [7] La Conferencia de trabajo sobre ingeniería inversa (WCRE) se ha celebrado anualmente para explorar y ampliar las técnicas de ingeniería inversa. [11] [19] La ingeniería de software asistida por ordenador (CASE) y la generación automática de código han contribuido en gran medida al campo de la ingeniería inversa. [11]
La tecnología antimanipulación de software, como la ofuscación, se utiliza para impedir tanto la ingeniería inversa como la reingeniería de software propietario y de sistemas basados en software. En la práctica, surgen dos tipos principales de ingeniería inversa. En el primer caso, el código fuente del software ya está disponible, pero se descubren aspectos de nivel superior del programa, que tal vez estén mal documentados o documentados pero ya no sean válidos. En el segundo caso, no hay código fuente disponible para el software y cualquier intento de descubrir un posible código fuente para el software se considera ingeniería inversa. El segundo uso del término es más familiar para la mayoría de las personas. La ingeniería inversa del software puede hacer uso de la técnica de diseño de sala limpia para evitar la infracción de derechos de autor.
En una nota relacionada, las pruebas de caja negra en ingeniería de software tienen mucho en común con la ingeniería inversa. El evaluador normalmente tiene la API , pero su objetivo es encontrar errores y características no documentadas atacando el producto desde afuera. [20]
Otros propósitos de la ingeniería inversa incluyen la auditoría de seguridad, la eliminación de la protección contra copias (" craqueo "), la elusión de restricciones de acceso a menudo presentes en la electrónica de consumo , la personalización de sistemas integrados (como los sistemas de gestión de motores), reparaciones o modernizaciones internas, la habilitación de características adicionales en hardware "limitado" de bajo costo (como algunos conjuntos de chips de tarjetas gráficas) o incluso la mera satisfacción de la curiosidad.
La ingeniería inversa binaria se realiza si el código fuente de un software no está disponible. [11] Este proceso a veces se denomina ingeniería inversa de código o RCE. [21] Por ejemplo, la descompilación de binarios para la plataforma Java se puede lograr utilizando Jad. Un caso famoso de ingeniería inversa fue la primera implementación no IBM del BIOS de PC , que lanzó la histórica industria compatible con IBM PC que ha sido la plataforma de hardware de computadora abrumadoramente dominante durante muchos años. La ingeniería inversa de software está protegida en los EE. UU. por la excepción de uso justo en la ley de derechos de autor . [22] El software Samba , que permite que los sistemas que no ejecutan sistemas Microsoft Windows compartan archivos con sistemas que lo ejecutan, es un ejemplo clásico de ingeniería inversa de software [23] ya que el proyecto Samba tuvo que realizar ingeniería inversa de información no publicada sobre cómo funcionaba el intercambio de archivos de Windows para que las computadoras que no eran de Windows pudieran emularlo. El proyecto Wine hace lo mismo para la API de Windows , y OpenOffice.org es una de las partes que lo hace para los formatos de archivo de Microsoft Office . El proyecto ReactOS es aún más ambicioso en sus objetivos al esforzarse por proporcionar compatibilidad binaria (ABI y API) con los sistemas operativos Windows actuales de la rama NT, lo que permite que el software y los controladores escritos para Windows se ejecuten en un software libre ( GPL ) de ingeniería inversa en una sala limpia . WindowsSCOPE permite realizar ingeniería inversa de todo el contenido de la memoria activa de un sistema Windows, incluida una ingeniería inversa gráfica a nivel binario de todos los procesos en ejecución.
Otro ejemplo clásico, aunque no muy conocido, es el de 1987, cuando los Laboratorios Bell realizaron ingeniería inversa del sistema operativo Mac OS 4.1, que originalmente se ejecutaba en el Apple Macintosh SE , para poder ejecutarlo en sus propias máquinas RISC . [24]
La ingeniería inversa de software se puede realizar mediante varios métodos. Los tres grupos principales de ingeniería inversa de software son:
La clasificación de software es el proceso de identificación de similitudes entre distintos binarios de software (como dos versiones diferentes del mismo binario) que se utiliza para detectar relaciones de código entre muestras de software. La tarea se hacía tradicionalmente de forma manual por varias razones (como el análisis de parches para la detección de vulnerabilidades y la infracción de derechos de autor ), pero ahora se puede realizar de forma algo automática para grandes cantidades de muestras.
Este método se utiliza principalmente para tareas de ingeniería inversa extensas y exhaustivas (análisis completo de un algoritmo complejo o de un software de gran tamaño). En general, se considera que la clasificación estadística es un problema difícil, lo que también es cierto para la clasificación de software, por lo que existen pocas soluciones o herramientas que se encarguen bien de esta tarea.
Varias herramientas UML denominan "ingeniería inversa" al proceso de importación y análisis de código fuente para generar diagramas UML. Consulte Lista de herramientas UML .
Aunque UML es un enfoque para proporcionar "ingeniería inversa", los avances más recientes en las actividades de estándares internacionales han dado como resultado el desarrollo del Metamodelo de Descubrimiento de Conocimiento (KDM). El estándar proporciona una ontología para la representación intermedia (o abstracta) de las construcciones del lenguaje de programación y sus interrelaciones. Un estándar del Object Management Group (en camino de convertirse también en un estándar ISO), [ cita requerida ] KDM ha comenzado a afianzarse en la industria con el desarrollo de herramientas y entornos de análisis que pueden ofrecer la extracción y el análisis de código fuente, binario y de bytes. Para el análisis del código fuente, la arquitectura de estándares granulares de KDM permite la extracción de flujos del sistema de software (datos, control y mapas de llamadas), arquitecturas y conocimiento de la capa empresarial (reglas, términos y procesos). El estándar permite el uso de un formato de datos común (XMI) que permite la correlación de las diversas capas de conocimiento del sistema para un análisis detallado (como causa raíz, impacto) o análisis derivado (como extracción de procesos empresariales). Aunque los esfuerzos por representar construcciones de lenguaje pueden ser interminables debido a la cantidad de lenguajes, la evolución continua de los lenguajes de software y el desarrollo de nuevos lenguajes, el estándar permite el uso de extensiones para respaldar el amplio conjunto de lenguajes, así como la evolución. KDM es compatible con UML, BPMN, RDF y otros estándares, lo que permite la migración a otros entornos y, por lo tanto, aprovechar el conocimiento del sistema para esfuerzos como la transformación del sistema de software y el análisis de la capa empresarial empresarial.
Los protocolos son conjuntos de reglas que describen los formatos de los mensajes y cómo se intercambian: la máquina de estados del protocolo . En consecuencia, el problema de la ingeniería inversa de protocolos se puede dividir en dos subproblemas: formato de mensajes e ingeniería inversa de la máquina de estados.
Los formatos de los mensajes han sido tradicionalmente diseñados a la inversa mediante un tedioso proceso manual, que implicaba el análisis de cómo las implementaciones de protocolo procesan los mensajes, pero investigaciones recientes propusieron una serie de soluciones automáticas. [25] [26] [27] Normalmente, el grupo de enfoques automáticos observa los mensajes en grupos mediante el uso de varios análisis de agrupamiento , o emula la implementación del protocolo rastreando el procesamiento del mensaje.
Se ha trabajado menos en ingeniería inversa de máquinas de estado de protocolos. En general, las máquinas de estado de protocolo se pueden aprender a través de un proceso de aprendizaje fuera de línea , que observa pasivamente la comunicación e intenta construir la máquina de estado más general que acepte todas las secuencias observadas de mensajes, y aprendizaje en línea , que permite la generación interactiva de secuencias de sondeo de mensajes y la escucha de respuestas a esas secuencias de sondeo. En general, se sabe que el aprendizaje fuera de línea de pequeñas máquinas de estado es NP-completo , [28] pero el aprendizaje en línea se puede realizar en tiempo polinomial. [29] Comparetti et al. [27] han demostrado un enfoque automático fuera de línea y Cho et al. [30] un enfoque en línea.
Otros componentes de los protocolos típicos, como las funciones de cifrado y hash, también pueden ser sometidos a ingeniería inversa de forma automática. Normalmente, los métodos automáticos rastrean la ejecución de las implementaciones de protocolos e intentan detectar los búferes en la memoria que contienen paquetes no cifrados. [31]
La ingeniería inversa es una forma invasiva y destructiva de analizar una tarjeta inteligente . El atacante utiliza sustancias químicas para eliminar capa tras capa de la tarjeta inteligente y toma fotografías con un microscopio electrónico de barrido (SEM). Esa técnica puede revelar la parte completa de hardware y software de la tarjeta inteligente. El principal problema para el atacante es poner todo en el orden correcto para averiguar cómo funciona todo. Los fabricantes de la tarjeta intentan ocultar claves y operaciones mezclando posiciones de memoria, como por ejemplo mediante la codificación de bus. [32] [33]
En algunos casos, incluso es posible conectar una sonda para medir voltajes mientras la tarjeta inteligente todavía está operativa. Los fabricantes de la tarjeta emplean sensores para detectar y prevenir ese ataque. [34] Ese ataque no es muy común porque requiere una gran inversión en esfuerzo y equipo especial que generalmente solo está disponible para los grandes fabricantes de chips. Además, la recompensa de este ataque es baja ya que a menudo se utilizan otras técnicas de seguridad como las cuentas ocultas. Todavía no se sabe con certeza si los ataques contra tarjetas con chip y PIN para replicar datos de cifrado y luego descifrar PIN proporcionarían un ataque rentable a la autenticación multifactor.
La ingeniería inversa completa se desarrolla en varios pasos importantes.
El primer paso después de tomar imágenes con un microscopio electrónico de barrido es unirlas, lo cual es necesario porque no es posible capturar cada capa con una sola toma. Un microscopio electrónico de barrido debe recorrer el área del circuito y tomar varios cientos de imágenes para cubrir toda la capa. La unión de imágenes toma como entrada varios cientos de imágenes y genera una única imagen superpuesta correctamente de la capa completa.
A continuación, es necesario alinear las capas unidas, ya que la muestra, después del grabado, no se puede colocar exactamente en la misma posición con respecto al SEM cada vez. Por lo tanto, las versiones unidas no se superpondrán de la manera correcta, como en el circuito real. Por lo general, se seleccionan tres puntos correspondientes y se aplica una transformación en función de eso.
Para extraer la estructura del circuito, las imágenes alineadas y unidas deben segmentarse, lo que resalta los circuitos importantes y los separa del fondo poco interesante y de los materiales aislantes.
Finalmente, se pueden rastrear los cables de una capa a la siguiente y se puede reconstruir la lista de conexiones del circuito, que contiene toda la información del circuito.
La ingeniería inversa se utiliza a menudo para copiar tecnologías, dispositivos o información de otras naciones que han sido obtenidos por tropas regulares en el campo o en operaciones de inteligencia . Se utilizó a menudo durante la Segunda Guerra Mundial y la Guerra Fría . A continuación se presentan ejemplos conocidos de la Segunda Guerra Mundial y posteriores:
Los conceptos de ingeniería inversa también se han aplicado a la biología , específicamente a la tarea de comprender la estructura y función de las redes reguladoras de genes . Regulan casi todos los aspectos del comportamiento biológico y permiten que las células lleven a cabo procesos fisiológicos y respuestas a perturbaciones. Por lo tanto, comprender la estructura y el comportamiento dinámico de las redes de genes es uno de los desafíos primordiales de la biología de sistemas, con repercusiones prácticas inmediatas en varias aplicaciones que van más allá de la investigación básica. [42] Existen varios métodos para realizar ingeniería inversa de redes reguladoras de genes mediante el uso de métodos de biología molecular y ciencia de datos. En general, se han dividido en seis clases: [43]
A menudo, la confiabilidad de las redes genéticas se prueba mediante experimentos de perturbación genética seguidos de un modelado dinámico, basado en el principio de que la eliminación de un nodo de la red tiene efectos predecibles en el funcionamiento de los nodos restantes de la red. [44] Las aplicaciones de la ingeniería inversa de las redes genéticas van desde la comprensión de los mecanismos de la fisiología vegetal [45] hasta la identificación de nuevos objetivos para la terapia contra el cáncer. [46]
La ingeniería inversa se aplica principalmente a la comprensión de un proceso o artefacto en el cual la forma de su construcción, uso o procesos internos no ha sido explicada por su creador.
Los artículos patentados no tienen por qué ser sometidos a ingeniería inversa para ser estudiados, ya que la esencia de una patente es que los inventores proporcionen una divulgación pública detallada por sí mismos y, a cambio, reciban protección legal de la invención en cuestión. Sin embargo, un artículo producido bajo una o más patentes también podría incluir otra tecnología que no esté patentada ni divulgada. De hecho, una motivación común de la ingeniería inversa es determinar si el producto de un competidor contiene una infracción de patente o de derechos de autor .
En los Estados Unidos, incluso si un artefacto o proceso está protegido por secretos comerciales , la ingeniería inversa del artefacto o proceso suele ser legal si se ha obtenido legítimamente. [47]
La ingeniería inversa de software de computadora a menudo cae dentro del ámbito de aplicación tanto del derecho contractual como de cualquier otra ley pertinente. Esto se debe a que la mayoría de los contratos de licencia de usuario final la prohíben específicamente, y los tribunales estadounidenses han dictaminado que si existen tales cláusulas, prevalecen sobre la ley de derechos de autor que la permite expresamente (véase Bowers v. Baystate Technologies [48] [49] ). Según la Sección 103(f) de la Ley de Derechos de Autor del Milenio Digital (17 USC § 1201 (f)), una persona en posesión legal de un programa puede realizar ingeniería inversa y eludir su protección si eso es necesario para lograr la "interoperabilidad", un término que cubre ampliamente otros dispositivos y programas que pueden interactuar con él, hacer uso de él y utilizar y transferir datos hacia y desde él de maneras útiles. Existe una exención limitada que permite que el conocimiento así obtenido se comparta y utilice con fines de interoperabilidad. [a]
La Directiva 2009/24 de la UE sobre la protección jurídica de los programas de ordenador, que sustituyó a una directiva anterior (1991), [50] regula la ingeniería inversa en la Unión Europea . [51] [b]
La reproducción, traducción, adaptación o transformación no autorizadas de la forma del código en que se ha puesto a disposición una copia de un programa de ordenador constituye una infracción de los derechos exclusivos del autor. No obstante, pueden darse circunstancias en las que dicha reproducción del código y traducción de su forma sean indispensables para obtener la información necesaria para lograr la interoperabilidad de un programa creado de forma independiente con otros programas. Por tanto, debe considerarse que, únicamente en estas circunstancias limitadas, la realización de los actos de reproducción y traducción por o en nombre de una persona que tenga derecho a utilizar una copia del programa es legítima y compatible con los usos leales y, por tanto, debe considerarse que no requiere la autorización del titular del derecho. Un objetivo de esta excepción es hacer posible la conexión de todos los componentes de un sistema informático, incluidos los de diferentes fabricantes, de modo que puedan funcionar juntos. Esta excepción a los derechos exclusivos del autor no puede utilizarse de forma que perjudique los intereses legítimos del titular del derecho o que entre en conflicto con la explotación normal del programa.