Articulo de referencia

Análisis del programa

En informática , el análisis de programas [ 1 ] es el proceso de analizar el comportamiento de los programas informáticos en relación con propiedades como la corrección, la robu...

En informática , el análisis de programas [ 1 ] es el proceso de analizar el comportamiento de los programas informáticos en relación con propiedades como la corrección, la robustez, la seguridad y la vivacidad. El análisis de programas se centra en dos áreas principales: la optimización de programas y la corrección de programas . La primera se centra en mejorar el rendimiento del programa reduciendo el uso de recursos, mientras que la segunda se centra en garantizar que el programa haga lo que se supone que debe hacer.

El análisis de programas puede realizarse sin ejecutar el programa ( análisis estático de programas ), durante su ejecución ( análisis dinámico de programas ) o mediante una combinación de ambos.

Análisis estático de programas

En el contexto de la corrección del programa, el análisis estático puede descubrir vulnerabilidades durante la fase de desarrollo del programa. [ 2 ] Estas vulnerabilidades son más fáciles de corregir que las encontradas durante la fase de pruebas, ya que el análisis estático conduce a la raíz de la vulnerabilidad.

Debido a que muchas formas de análisis estático son computacionalmente indecidibles , los mecanismos para realizarlo no siempre arrojan la respuesta correcta. Esto puede resultar en falsos negativos ("no se encontraron problemas" cuando el código sí los tiene) o falsos positivos , o bien, puede que nunca devuelvan una respuesta incorrecta, pero tampoco terminen nunca. A pesar de estas limitaciones, el análisis estático puede seguir siendo valioso: el primer tipo de mecanismo podría reducir el número de vulnerabilidades, mientras que el segundo a veces puede proporcionar una sólida garantía de la ausencia de ciertas clases de vulnerabilidades.

Las optimizaciones incorrectas son altamente indeseables. Por lo tanto, en el contexto de la optimización de programas, existen dos estrategias principales para abordar el análisis computacionalmente indecidible:

  1. Un optimizador que se espera que se complete en un tiempo relativamente corto, como el optimizador de un compilador optimizador , puede utilizar una versión truncada de un análisis que garantiza su finalización en un tiempo finito y que garantiza que solo encontrará optimizaciones correctas.
  2. Una herramienta de optimización de terceros puede implementarse de forma que nunca genere una optimización incorrecta, pero también de manera que, en ciertas situaciones, pueda seguir ejecutándose indefinidamente hasta encontrar una (lo cual puede que nunca ocurra). En este caso, el desarrollador que utilice la herramienta tendría que detenerla y evitar ejecutarla de nuevo en ese fragmento de código (o posiblemente modificar el código para evitar que la herramienta falle).

Sin embargo, también existe una tercera estrategia que a veces se aplica a lenguajes que no están completamente especificados, como C. Un compilador optimizador tiene la libertad de generar código que haga cualquier cosa en tiempo de ejecución , incluso que falle , si encuentra código fuente cuya semántica no está especificada por el estándar del lenguaje en uso.  

Flujo de control

El objetivo del análisis de flujo de control es obtener información sobre qué funciones pueden invocarse en distintos puntos de la ejecución de un programa. La información recopilada se representa mediante un grafo de flujo de control (GFC), donde los nodos son las instrucciones del programa y las aristas representan el flujo de control. Al identificar bloques de código y bucles, un GFC se convierte en un punto de partida para las optimizaciones realizadas por el compilador.

Análisis del flujo de datos

El análisis de flujo de datos es una técnica diseñada para recopilar información sobre los valores en cada punto del programa y cómo cambian con el tiempo. Esta técnica suele ser utilizada por los compiladores para optimizar el código. Uno de los ejemplos más conocidos de análisis de flujo de datos es la verificación de datos contaminados , que consiste en considerar todas las variables que contienen datos proporcionados por el usuario ( considerados "contaminados", es decir, inseguros ) e impedir su uso hasta que se hayan sanitizado. Esta técnica se utiliza a menudo para prevenir ataques de inyección SQL . La verificación de datos contaminados puede realizarse de forma estática o dinámica.  

Interpretación abstracta

La interpretación abstracta permite extraer información sobre una posible ejecución de un programa sin necesidad de ejecutarlo realmente. Esta información puede ser utilizada por los compiladores para buscar posibles optimizaciones o para certificar que un programa está libre de ciertos tipos de errores.

Sistemas de tipos

Los sistemas de tipos asocian tipos a programas que cumplen ciertos requisitos. Su propósito es seleccionar un subconjunto de programas de un lenguaje que se consideran correctos según una propiedad.

La comprobación de tipos se utiliza en programación para limitar el uso de los objetos y sus funcionalidades. Esta tarea la realiza el compilador o el intérprete . La comprobación de tipos también ayuda a prevenir vulnerabilidades al garantizar que no se asigne un valor con signo a una variable sin signo. Puede realizarse de forma estática (en tiempo de compilación), dinámica (en tiempo de ejecución) o mediante una combinación de ambas.

La información de tipo estático (ya sea inferida o proporcionada explícitamente mediante anotaciones de tipo en el código fuente) también se puede utilizar para realizar optimizaciones, como reemplazar matrices empaquetadas por matrices no empaquetadas.

Sistemas de efectos

Los sistemas de efectos son sistemas formales diseñados para representar los efectos que puede tener la ejecución de una función o método. Un efecto codifica lo que se está haciendo y con qué se está haciendo ; generalmente se denominan tipo de efecto y región de efecto , respectivamente. 

Verificación de modelos

La verificación de modelos se refiere a métodos estrictos, formales y automatizados para comprobar si un modelo (que en este contexto significa un modelo formal de un fragmento de código, aunque en otros contextos puede ser un modelo de un componente de hardware) cumple con una especificación dada. Debido a la naturaleza inherentemente finita del código, y a que tanto la especificación como el código son convertibles en fórmulas lógicas , es posible comprobar si el sistema incumple la especificación mediante métodos algorítmicos eficientes.

Análisis dinámico de programas

El análisis dinámico puede utilizar el conocimiento del programa en tiempo de ejecución para aumentar la precisión del análisis, a la vez que proporciona protección en tiempo de ejecución, pero solo puede analizar una única ejecución del problema y podría degradar el rendimiento del programa debido a las comprobaciones en tiempo de ejecución.

Pruebas

El software debe someterse a pruebas para garantizar su calidad y un funcionamiento fiable, evitando conflictos con otros programas que puedan ejecutarse simultáneamente. Estas pruebas consisten en ejecutar el programa con una entrada y evaluar su comportamiento y el resultado obtenido. Incluso si no se especifican requisitos de seguridad, se deben realizar pruebas adicionales para asegurar que un atacante no pueda manipular el software, robar información, interrumpir su funcionamiento normal ni utilizarlo como plataforma para atacar a sus usuarios.

Escucha

El monitoreo de programas registra información diversa sobre el programa, como el uso de recursos, eventos e interacciones, para poder analizarla y detectar las causas de comportamientos anómalos. Además, se puede utilizar para realizar auditorías de seguridad. El monitoreo automatizado de programas a veces se denomina verificación en tiempo de ejecución .

Segmentación de programas

Para un subconjunto dado del comportamiento de un programa, la segmentación de programas consiste en reducir el programa a la forma mínima que aún produce el comportamiento seleccionado. El programa reducido se denomina «segmento» y es una representación fiel del programa original dentro del dominio del subconjunto de comportamiento especificado. Generalmente, encontrar un segmento es un problema irresoluble, pero al especificar el subconjunto de comportamiento objetivo mediante los valores de un conjunto de variables, es posible obtener segmentos aproximados utilizando un algoritmo de flujo de datos. Estos segmentos suelen ser utilizados por los desarrolladores durante la depuración para localizar el origen de los errores.

Véase también

Referencias

  1. Nielson, F., Nielson, HR y Hankin, C. (2015). Principios del análisis de programas . Springer.
  2. Jovanovic, N., Kruegel, C., & Kirda, E. (2006, mayo). Pixy: Una herramienta de análisis estático para detectar vulnerabilidades en aplicaciones web. En Security and Privacy, 2006 IEEE Symposium on (pp. 6-pp). IEEE.

Lecturas adicionales

  • Agrawal, Hiralal; Horgan, Joseph R. Segmentación dinámica de programas (PDF) .
  • Chunlei, Wang; Gang, Zhao; Yiqi, Dai (2009). "Un enfoque eficiente para el análisis de seguridad del flujo de control en ejecutables binarios". 2.ª Conferencia Internacional IEEE de 2009 sobre Ciencias de la Computación y Tecnologías de la Información . págs. 272-276 . doi : 10.1109/ICCSIT.2009.5234950 . ISBN  978-1-4244-4519-6. S2CID 10551500 . 
  • Nielson, Flemming; Nielson, Hanne Riis ; Hankin, Chris (2005). Principios del análisis de programas . Springer Science+Business Media .
  • Logotipo de Wikimedia CommonsContenido multimedia relacionado con el análisis del programa en Wikimedia Commons.