stringtranslate.com

Análisis del programa

En informática , el análisis de programas [1] es el proceso de analizar automáticamente el comportamiento de los programas de computadora con respecto a una propiedad como la corrección, la robustez, la seguridad y la vivacidad. El análisis de programas se centra en dos áreas principales: optimización y corrección del programa . El primero se centra en mejorar el rendimiento del programa y al mismo tiempo reducir el uso de recursos, mientras que el segundo se centra en garantizar que el programa haga lo que se supone que debe hacer.

El análisis del programa se puede realizar sin ejecutar el programa ( análisis estático del programa ), durante el tiempo de ejecución ( análisis dinámico del programa ) o en una combinación de ambos.

Análisis estático del programa.

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 prueba, 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 terminarán con la respuesta correcta, ya sea porque a veces devuelven un falso negativo ("no se encontraron problemas" cuando el código en realidad tiene problemas) o un falso positivo, o porque nunca devuelven una respuesta incorrecta pero a veces nunca terminan. A pesar de sus limitaciones, el primer tipo de mecanismo podría reducir el número de vulnerabilidades, mientras que el segundo a veces puede ofrecer una gran seguridad de la falta de una determinada clase de vulnerabilidades.

Las optimizaciones incorrectas son altamente indeseables. Entonces, en el contexto de la optimización de programas, existen dos estrategias principales para manejar análisis computacionalmente indecidibles:

  1. Un optimizador que se espera que se complete en un período de tiempo relativamente corto, como el optimizador en un compilador de optimización , puede usar una versión truncada de un análisis que se garantiza que se completará en un período de tiempo finito y que solo encontrará resultados correctos. optimizaciones.
  2. Una herramienta de optimización de terceros se puede implementar de tal manera que nunca produzca una optimización incorrecta, pero también para que, en algunas situaciones, pueda continuar ejecutándose indefinidamente hasta que encuentre una (lo que puede que nunca suceda). En este caso, el desarrollador que utiliza la herramienta tendría que detenerla y evitar ejecutarla nuevamente en ese fragmento de código (o posiblemente modificar el código para evitar que la herramienta tropiece).

Sin embargo, también existe una tercera estrategia que a veces es aplicable 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 fallar) si encuentra código fuente cuya semántica no está especificada por el estándar de lenguaje en uso.

Flujo de control

El propósito del análisis de flujo de control es obtener información sobre qué funciones se pueden llamar en varios puntos durante la ejecución de un programa. La información recopilada se representa mediante un gráfico de flujo de control (CFG) donde los nodos son instrucciones del programa y los bordes representan el flujo de control. Al identificar bloques de código y bucles, un CFG se convierte en un punto de partida para optimizaciones realizadas por el compilador.

Análisis de 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. Los compiladores suelen utilizar esta técnica para optimizar el código. Uno de los ejemplos más conocidos de análisis de flujo de datos es la verificación de contaminación , que consiste en considerar todas las variables que contienen datos proporcionados por el usuario (que se consideran "contaminados", es decir, inseguros) y evitar que esas variables se utilicen hasta que hayan sido desinfectado. Esta técnica se utiliza a menudo para prevenir ataques de inyección SQL . La verificación de contaminación se puede realizar 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 ejecutar realmente el programa. Los compiladores pueden utilizar esta información para buscar posibles optimizaciones o para certificar un programa contra ciertas clases de errores.

Sistemas de tipos

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

La verificación de tipos se utiliza en programación para limitar cómo se utilizan los objetos de programación y qué pueden hacer. Esto lo hace el compilador o intérprete . La verificación de tipos también puede ayudar a prevenir vulnerabilidades al garantizar que un valor con signo no se atribuya a una variable sin signo. La verificación de tipos se puede realizar de forma estática (en tiempo de compilación), dinámicamente (en tiempo de ejecución) o 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 en cajas con matrices sin cajas.

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 lo que se está haciendo (generalmente denominado tipo de efecto y región de efecto , respectivamente). [ se necesita aclaración ]

Comprobación de modelos

La verificación de modelos se refiere a formas estrictas, formales y automatizadas de verificar 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 una pieza de hardware) cumple con un determinado especificación. Debido a la naturaleza inherente de estado finito 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 viola la especificación utilizando métodos algorítmicos eficientes.

Análisis dinámico del programa.

El análisis dinámico puede utilizar el conocimiento del tiempo de ejecución del programa para aumentar la precisión del análisis y, al mismo tiempo, proporcionar 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 del tiempo de ejecución.

Pruebas

El software debe probarse para garantizar su calidad y que funcione como se supone que debe hacerlo de manera confiable, y que no cree conflictos con otro software que pueda funcionar junto con él. Las pruebas se realizan ejecutando el programa con una entrada y evaluando su comportamiento y la salida producida. Incluso si no se especifican requisitos de seguridad, se deben realizar pruebas de seguridad adicionales para garantizar que un atacante no pueda alterar el software y robar información, interrumpir las operaciones normales del software o utilizarlo como pivote para atacar a sus usuarios.

Supervisión

La supervisión del programa registra y registra diferentes tipos de información sobre el programa, como el uso de recursos, eventos e interacciones, de modo que pueda revisarse para encontrar o identificar causas de comportamiento anormal. Además, se puede utilizar para realizar auditorías de seguridad. La supervisión automatizada de programas a veces se denomina verificación del tiempo de ejecución .

corte de programa

Para un subconjunto dado del comportamiento de un programa, la división del programa consiste en reducir el programa a la forma mínima que todavía produce el comportamiento seleccionado. El programa reducido se denomina "porción" y es una representación fiel del programa original dentro del dominio del subconjunto de comportamiento especificado. Generalmente, encontrar una porción es un problema sin solución, pero al especificar el subconjunto de comportamiento objetivo mediante los valores de un conjunto de variables, es posible obtener porciones aproximadas usando un algoritmo de flujo de datos. Los desarrolladores suelen utilizar estos sectores durante la depuración para localizar el origen de los errores.

Ver también

Referencias

  1. ^ Nielson, F., Nielson, HR y Hankin, C. (2015). Principios del análisis de programas. Saltador.
  2. ^ Jovanovic, N., Kruegel, C. y Kirda, E. (mayo de 2006). Pixy: una herramienta de análisis estático para detectar vulnerabilidades de aplicaciones web. En Seguridad y Privacidad, Simposio IEEE de 2006 sobre (págs. 6-pp). IEEE.

Otras lecturas

enlaces externos