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 el razonamiento deductivo cómo un dispositivo, proceso, sistema o pieza de software creado previamente realiza una tarea con muy poco (si es que tiene alguno) una idea de cómo lo hace exactamente. Dependiendo del sistema que se considere y de 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 sobre 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]
Hay 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, es posible que el proceso de ingeniería inversa no siempre se centre en crear una copia o cambiar el artefacto de alguna manera. Puede usarse 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 los sistemas heredados . [6] : 15 [7] Incluso cuando el producto sometido a 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 estrictas de los Estados Unidos y la Unión Europea, la legalidad del uso de técnicas específicas de ingeniería inversa para ese propósito ha sido fuertemente cuestionada en los tribunales de todo el mundo durante más de dos décadas. [9]
La ingeniería inversa del software puede ayudar a mejorar la comprensión del código fuente subyacente para el mantenimiento y mejora del software, se puede extraer información relevante para tomar una decisión para el desarrollo de software y las representaciones gráficas del código pueden proporcionar vistas alternativas con respecto al código fuente. que puede ayudar a detectar y corregir un error o vulnerabilidad de software. Con frecuencia, a medida que se desarrolla algún software, su información de diseño y sus mejoras se pierden 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, reduciendo así el coste total 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 inversió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 previsto su uso o revelar cómo se creó el producto de un competidor. [11] Ese proceso se utiliza comúnmente para "craquear" software y medios para eliminar su protección contra 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 hacker. . [11] : 8
Los desarrolladores de malware suelen utilizar 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 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
Hay otros usos de la ingeniería inversa:
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 pieza física existente para su uso en CAD , CAM , CAE u otro software 3D . [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, normalmente representados como una nube de puntos , carecen de información topológica y de intención de diseño. El primero se puede recuperar convirtiendo la nube de puntos en una malla de caras triangulares . La ingeniería inversa pretende ir más allá de producir dicha malla y recuperar la intención del diseño en términos de superficies analíticas simples cuando corresponda ( 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 comúnmente utilizado cuando NURBS y el modelado paramétrico se implementan juntos. El uso de una combinación de superficies geométricas y de forma libre puede proporcionar un poderoso método de modelado 3D . Se pueden combinar áreas de datos de forma libre 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 crear 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 de reducción de costes.
La ingeniería inversa de placas de circuito impreso implica recrear datos de fabricación para una placa de circuito 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.
Los PCB obsoletos suelen estar sujetos a ingeniería inversa, especialmente cuando realizan 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 realiza alguna tarea crucial, así como encontrar alternativas que proporcionen la misma función o actualizar la PCB antigua. [16]
Los PCB de ingeniería inversa siguen en gran medida la misma serie de pasos. Primero, las imágenes se crean dibujando, escaneando o tomando fotografías de la PCB. Luego, estas imágenes se trasladan 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. Los PCB más complicados requieren fotografías bien iluminadas sobre fondos oscuros, mientras que los 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 al inicial. Luego, finalmente se generan los esquemas del circuito utilizando una herramienta adecuada. [17]
En 1990, el Instituto de Ingenieros Eléctricos y Electrónicos (IEEE) definió la ingeniería inversa (de software) (SRE) como "el proceso de analizar un sistema en cuestión para identificar los componentes del sistema y sus interrelaciones y crear representaciones del sistema en otra forma o en un nivel superior de abstracción" en el que el "sistema objeto" es el producto final del desarrollo de software. La ingeniería inversa es un proceso únicamente de examen y el sistema de software bajo consideració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]
Hay dos componentes en la ingeniería inversa: redocumentación y 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. Mientras tanto, 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 completamente la funcionalidad del producto. [10] También puede verse como "un retroceso en el ciclo de desarrollo". [18] En este modelo, el resultado de la fase de implementación (en forma de código fuente) se aplica ingeniería inversa a la fase de análisis, en una inversión del modelo de cascada tradicional . Otro término para esta técnica es comprensión de programas . [7] La Conferencia de Trabajo sobre Ingeniería Inversa (WCRE) se lleva a cabo anualmente para explorar y ampliar las técnicas de ingeniería inversa. [11] [19] La ingeniería de software asistida por computadora (CASE) y la generación automatizada de código han contribuido en gran medida en el 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 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 ningún código fuente disponible para el software y cualquier esfuerzo por 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 la gente. La ingeniería inversa del software puede utilizar 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 generalmente 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 auditorías de seguridad, eliminación de protección contra copia (" craqueo "), elusión de restricciones de acceso a menudo presentes en la electrónica de consumo , personalización de sistemas integrados (como sistemas de gestión de motores), reparaciones o adaptaciones internas, habilitación de características adicionales en hardware "lisiado" 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 de código inverso 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 del BIOS de PC no realizada por IBM , que lanzó la histórica industria de compatibilidad con PC de IBM que ha sido la plataforma de hardware de computadora abrumadoramente dominante durante muchos años. La ingeniería inversa del software está protegida en Estados Unidos por la excepción de uso legítimo de 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 aplicar ingeniería inversa a información no publicada sobre cómo El uso compartido de archivos de Windows funcionó para que las computadoras sin 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 una sala limpia mediante ingeniería inversa. homólogo de software libre ( GPL ). WindowsSCOPE permite realizar ingeniería inversa en 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 que en 1987 los Laboratorios Bell aplicaron ingeniería inversa al sistema Mac OS 4.1, que originalmente se ejecutaba en Apple Macintosh SE , para que pudiera ejecutarlo en sus propias máquinas RISC . [24]
La ingeniería inversa del software se puede lograr mediante varios métodos. Los tres grupos principales de ingeniería inversa de software son
La clasificación de software es el proceso de identificar similitudes entre diferentes binarios de software (como dos versiones diferentes del mismo binario) que se utiliza para detectar relaciones de código entre muestras de software. Tradicionalmente, la tarea se realizaba manualmente 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 una gran cantidad de muestras.
Este método se utiliza principalmente para tareas largas y exhaustivas de ingeniería inversa (análisis completo de un algoritmo complejo o una gran pieza de software). En general, la clasificación estadística se considera un problema difícil, lo que también se aplica a la clasificación de software, y hay muy pocas soluciones/herramientas que manejen bien esta tarea.
Varias herramientas UML se refieren al proceso de importar y analizar el código fuente para generar diagramas UML como "ingeniería inversa". 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 del Conocimiento (KDM). El estándar ofrece una ontología para la representación intermedia (o abstracta) de construcciones de lenguajes de programación y sus interrelaciones. Como estándar del Object Management Group (en camino de convertirse también en un estándar ISO), [ cita necesaria ] 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 código de bytes. Para el análisis de código fuente, la arquitectura de estándares granulares de KDM permite la extracción de flujos de sistemas 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 distintas capas de conocimiento del sistema para análisis detallados (como causa raíz, impacto) o análisis derivados (como extracción de procesos de negocio). Aunque los esfuerzos para representar construcciones de lenguajes 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 soportar el amplio conjunto de lenguajes, así como también evolución. KDM es compatible con UML, BPMN, RDF y otros estándares que permiten 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.
Los protocolos son conjuntos de reglas que describen los formatos de los mensajes y cómo se intercambian los mensajes: la máquina de estado del protocolo . En consecuencia, el problema de la ingeniería inversa de protocolos se puede dividir en dos subproblemas: formato de mensaje e ingeniería inversa de la máquina de estados.
Tradicionalmente, los formatos de los mensajes se han sometido a ingeniería inversa mediante un tedioso proceso manual, que implicaba el análisis de cómo las implementaciones de protocolos procesan los mensajes, pero investigaciones recientes propusieron una serie de soluciones automáticas. [25] [26] [27] Normalmente, los enfoques automáticos agrupan los mensajes en grupos mediante el uso de varios análisis de agrupamiento , o emulan la implementación del protocolo rastreando el procesamiento de mensajes.
Ha habido menos trabajo en ingeniería inversa de máquinas de estado de protocolos. En general, las máquinas de estados 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 estados más general que acepte todas las secuencias de mensajes observadas, y de aprendizaje en línea , que permite la generación interactiva de sondeo. secuencias de mensajes y escuchar las respuestas a esas secuencias de sondeo. En general, se sabe que el aprendizaje fuera de línea de pequeñas máquinas de estados es NP-completo , [28] pero el aprendizaje en línea se puede realizar en tiempo polinomial. [29] Comparetti et al. han demostrado un enfoque automático fuera de línea. [27] y un enfoque en línea de Cho et al. [30]
Otros componentes de los protocolos típicos, como el cifrado y las funciones hash, también se pueden aplicar ingeniería inversa automáticamente. Normalmente, los enfoques automáticos rastrean la ejecución de las implementaciones de protocolos e intentan detectar buffers 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 productos químicos 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 descubrir cómo funciona. Los fabricantes de la tarjeta intentan ocultar claves y operaciones mezclando posiciones de memoria, por ejemplo codificando el bus. [32] [33]
En algunos casos, incluso es posible conectar una sonda para medir voltajes mientras la tarjeta inteligente aún 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 equipos especiales que generalmente solo están disponibles para los grandes fabricantes de chips. Además, la rentabilidad de este ataque es baja, ya que a menudo se utilizan otras técnicas de seguridad, como cuentas ocultas. Todavía no está claro si los ataques contra tarjetas con chip y PIN para replicar datos cifrados y luego descifrar los 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 las imágenes con un SEM es unirlas, lo cual es necesario porque cada capa no se puede capturar con una sola toma. Un SEM 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 correctamente superpuesta de la capa completa.
A continuación, las capas cosidas deben alinearse porque la muestra, después del grabado, no se puede colocar exactamente en la misma posición en relación con el SEM cada vez. Por lo tanto, las versiones cosidas no se superpondrán de la forma correcta, como en el circuito real. Normalmente se seleccionan tres puntos correspondientes y en base a ellos se aplica una transformación.
Para extraer la estructura del circuito, es necesario segmentar las imágenes alineadas y unidas, 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 redes del circuito, que contiene toda la información del circuito.
La gente suele utilizar la ingeniería inversa para copiar tecnologías, dispositivos o información de otras naciones que han sido obtenidos por tropas regulares en el campo o mediante operaciones de inteligencia . Se utilizó a menudo durante la Segunda Guerra Mundial y la Guerra Fría . A continuación se muestran ejemplos bien 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 las perturbaciones. Por lo tanto, comprender la estructura y el comportamiento dinámico de las redes genéticas es uno de los principales desafíos 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 en redes reguladoras de genes mediante el uso de métodos de biología molecular y ciencia de datos. Generalmente se han dividido en seis clases: [43]
A menudo, la confiabilidad de la red genética se prueba mediante experimentos de perturbación genética seguidos de modelos dinámicos, basados en el principio de que eliminar 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 redes genéticas van desde la comprensión de los mecanismos de la fisiología de las plantas [45] hasta el descubrimiento de nuevos objetivos para la terapia contra el cáncer. [46]
La ingeniería inversa se aplica principalmente para comprender un proceso o artefacto en el que su creador no ha aclarado la forma de su construcción, uso o procesos internos.
Los artículos patentados no necesitan por sí mismos someterse a ingeniería inversa para ser estudiados, ya que la esencia de una patente es que los inventores proporcionen ellos mismos una divulgación pública detallada 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 infringe patentes o derechos de autor .
En los Estados Unidos, incluso si un artefacto o proceso está protegido por secretos comerciales , aplicar ingeniería inversa al artefacto o proceso suele ser legal si se ha obtenido legítimamente. [47]
La ingeniería inversa de software informático a menudo se incluye tanto en el derecho contractual como en el incumplimiento de contrato, así como en cualquier otra ley pertinente. Esto se debe a que la mayoría de los acuerdos de licencia de usuario final lo prohíben específicamente, y los tribunales estadounidenses han dictaminado que, si dichos términos están presentes, anulan la ley de derechos de autor que lo permite expresamente (ver 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", una término que cubre ampliamente otros dispositivos y programas que pueden interactuar con él, hacer uso de él y usar y transferir datos hacia y desde él de manera útil. Existe una exención limitada que permite compartir y utilizar el conocimiento así adquirido con fines de interoperabilidad. [a]
La Directiva de la UE 2009/24 sobre la protección legal de programas informáticos, que reemplazó a una directiva anterior (1991), [50] rige la ingeniería inversa en la Unión Europea . [51] [b]
La reproducción, traducción, adaptación o transformación no autorizada de la forma del código en el que se ha puesto a disposición una copia de un programa de ordenador constituye una infracción de los derechos exclusivos del autor. Sin embargo, pueden existir 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 lo tanto, debe considerarse que, únicamente en estas circunstancias limitadas, la realización de actos de reproducción y traducción por o en nombre de una persona que tiene derecho a utilizar una copia del programa es legítima y compatible con el uso leal y, por lo tanto, debe ser se considerará que no requiere la autorización del titular del derecho. Un objetivo de esta excepción es permitir conectar todos los componentes de un sistema informático, incluidos los de diferentes fabricantes, para que puedan trabajar juntos. Esta excepción a los derechos exclusivos del autor no podrá utilizarse de manera que perjudique los intereses legítimos del titular de los derechos o entre en conflicto con la explotación normal del programa.