346 Caza de corrupciones de memoria con Goshawk

Find AI Tools
No difficulty
No complicated process
Find ai tools

346 Caza de corrupciones de memoria con Goshawk

Tabla de contenido

  1. Introducción
  2. Descripción del problema
  3. Características de las funciones de gestión de memoria personalizadas
  4. Introducción al concepto de MOS
  5. Diseño e implementación de Goshawk
  6. Fase 1: Clasificación asistida por NLP y análisis de flujo de datos
  7. Fase 2: Análisis de flujo de datos y validación de funciones de gestión de memoria
  8. Fase 3: Generación de MOS y detección de errores de memoria
  9. Integración de Goshawk con Clang Static Analyzer y Z3 Solver
  10. Evaluación de Goshawk en proyectos de código abierto
  11. Comparación con otras herramientas de detección de errores de memoria
  12. Demostración de Goshawk en nasm
  13. Conclusiones
  14. Próximos pasos
  15. Recursos

👉 Introducción

¡Hola a todos! Soy Yunlong Lyu de China. En este artículo, presentaré nuestro trabajo de investigación titulado "Goshawk". Este es un trabajo en colaboración con la Universidad de Shanghai Jiao Tong, la Universidad de Ciencia y Tecnología de China, la Universidad Purdue, la Universidad de Minnesota, la Universidad de New South Wales y Feiyu Security. En este artículo, abordaremos el problema de detectar errores de corrupción de memoria, como el "use-after-free" y el "double-free", y presentaremos Goshawk, un sistema de detección de errores de memoria que ofrece una detección más precisa y completa de estos errores en proyectos de software. A lo largo de este artículo, exploraremos el concepto de MOS (sinopsis de operaciones de memoria), su aplicación en el diseño y la implementación de Goshawk, nuestra metodología de tres fases para detectar errores de memoria y los resultados de la evaluación de Goshawk en proyectos de código abierto. Empecemos.

Descripción del problema

Antes de sumergirnos en los detalles de Goshawk, es importante comprender el problema que abordamos. En proyectos de software, es crucial detectar y corregir errores de corrupción de memoria, ya que pueden llevar a fallos del sistema, comportamiento inesperado y vulnerabilidades de seguridad. Los errores de corrupción de memoria, como el "use-after-free" y el "double-free", ocurren cuando se accede o se libera una parte de la memoria después de que se haya liberado o desasignado. Estos errores pueden ser difíciles de detectar y solucionar, especialmente en proyectos grandes y complejos. En nuestro trabajo, nos centraremos en mejorar la detección de estos errores utilizando un enfoque basado en el concepto de MOS.

👉 Características de las funciones de gestión de memoria personalizadas

Antes de profundizar en el concepto de MOS, es importante comprender algunas características clave de las funciones de gestión de memoria personalizadas. A diferencia de las funciones de gestión de memoria clásicas, como "malloc" y "free", estas funciones personalizadas se utilizan para administrar objetos de memoria con características más sofisticadas.

Una de las características notables de estas funciones personalizadas es la asignación de múltiples objetos y la asignación de objetos anidados en estructuras. Esto significa que en lugar de asignar y liberar memoria para un solo objeto, estas funciones se encargan de asignar y liberar memoria para múltiples objetos o asignar y liberar memoria para objetos anidados en estructuras.

Además, otra característica importante de la gestión de memoria personalizada es que un operador de asignación y un operador de desasignación no siempre trabajan en pares. En otras palabras, un objeto con una estructura compuesta puede ser liberado invocando un desasignador personalizado correspondiente una vez o invocando un desasignador estándar varias veces para liberar cada subobjeto por separado.

Estas características de las funciones de gestión de memoria personalizadas presentan desafíos adicionales para la detección de errores de memoria. En nuestro trabajo, abordamos estos desafíos introduciendo el concepto de MOS, un resumen de operaciones de memoria que nos ayuda a describir y analizar de manera más precisa y completa los objetos de memoria gestionados por estas funciones personalizadas.

👉 Introducción al concepto de MOS

El concepto de MOS (sinopsis de operaciones de memoria) es una parte clave de nuestro enfoque para mejorar la detección de errores de memoria. MOS es una representación estructurada y centrada en objetos de las funciones de gestión de memoria personalizadas. Resume dos propiedades principales de una función de gestión de memoria: su interfaz y su flujo de asignación y desasignación interna.

La interfaz de una función de gestión de memoria determina cómo interactúa con las funciones externas. Por otro lado, el flujo de asignación y desasignación interno determina la estructura de los objetos gestionados por la función. La representación MOS resume estas dos propiedades y nos permite implementar un análisis centrado en objetos y consciente de la estructura de los objetos de memoria gestionados.

Con la ayuda de MOS, diseñamos e implementamos Goshawk, un sistema de detección de errores de memoria que captura de manera eficiente una amplia gama de errores de corrupción de memoria. A continuación, exploraremos en detalle el diseño y la implementación de Goshawk.

👉 Diseño e implementación de Goshawk

Goshawk es un sistema de detección de errores de memoria basado en el análisis estático del código fuente. Se basa en el motor de análisis estático Clang Static Analyzer y utiliza la representación MOS para mejorar la precisión y la eficiencia de la detección de errores de corrupción de memoria.

El proceso de detección de errores de memoria de Goshawk consta de tres fases principales: clasificación asistida por NLP y análisis de flujo de datos, validación de funciones de gestión de memoria y generación de MOS, y detección de errores de memoria mejorada por MOS.

En la primera fase, Goshawk utiliza el procesamiento de lenguaje natural (NLP) para clasificar y filtrar rápidamente las funciones de gestión de memoria en proyectos grandes. Normaliza los prototipos de funciones y utiliza una red Siamesa para convertirlos en vectores numéricos. Luego, calcula la similitud entre estos vectores numéricos y un conjunto de referencia predefinido que incluye funciones de asignación, desasignación y otros tipos de funciones. Según las puntuaciones de similitud, Goshawk clasifica la función dada como uno de los tipos mencionados anteriormente. Aunque esta clasificación asistida por NLP es rápida, puede generar falsos positivos al clasificar incorrectamente las funciones que no son de gestión de memoria. Para evitar esto, Goshawk realiza un análisis de flujo de datos interprocedural y descendente para validar cada candidato a función de gestión de memoria. Este análisis verifica si el candidato o uno de sus subrutinas utiliza una función de gestión de memoria oficial, como "malloc" o "free". También confirma si existe un objeto de memoria asignado o desasignado conectado al parámetro o valor de retorno del candidato. Este proceso de validación nos permite identificar con Alta confianza las funciones de gestión de memoria.

En la segunda fase, Goshawk utiliza el análisis de flujo de datos y la información de estructura para rastrear la propagación de objetos de memoria asignados y desasignados desde las funciones de gestión de memoria oficiales. También mantiene las relaciones anidadas de los elementos de la estructura. Una vez recopilada toda la información de flujo de datos y estructura de los objetos de memoria involucrados, Goshawk utiliza la definición de MOS para generar la representación MOS asociada para cada función de gestión de memoria. Esta representación MOS es esencial para lograr una detección precisa de errores de memoria.

En la tercera fase, Goshawk implementa una detección de errores de memoria mejorada por MOS. Utiliza el Clang Static Analyzer actualizado con el modelo de memoria compatible con MOS para realizar un análisis estático exhaustivo del código fuente. Al encontrar un función de gestión de memoria, Goshawk utiliza la información MOS para comprender los comportamientos detallados de la gestión de memoria y actualiza el estado de los objetos de memoria en consecuencia. Al utilizar este modelo más abstracto para describir los objetos de memoria gestionados dinámicamente, Goshawk reduce el alcance de la exploración del código y logra una detección de errores escalable y precisa.

👉 Fase 1: Clasificación asistida por NLP y análisis de flujo de datos

La primera fase de Goshawk se centra en la clasificación asistida por NLP y el análisis de flujo de datos. Esta fase se encarga de identificar las funciones de gestión de memoria personalizadas en proyectos grandes y verificar su validad mediante un análisis de flujo de datos.

Para clasificar rápidamente las funciones de gestión de memoria, Goshawk utiliza técnicas de procesamiento de lenguaje natural (NLP). Normaliza los prototipos de funciones y los convierte en vectores numéricos utilizando una red Siamesa. Luego, utiliza estos vectores y un conjunto de referencia predefinido para calcular la similitud entre las funciones y determinar si son funciones de gestión de memoria personalizadas o no. Si obtiene un puntaje alto de similitud, Goshawk clasifica la función como una función de gestión de memoria personalizada. Sin embargo, esta clasificación asistida por NLP puede generar falsos positivos al clasificar incorrectamente las funciones que no son de gestión de memoria.

Para evitar estos falsos positivos, Goshawk realiza un análisis de flujo de datos interprocedural y descendente sobre cada función identificada como candidata a función de gestión de memoria personalizada. Esto implica seguir los flujos de asignación y desasignación de memoria y verificar si se utilizan funciones de gestión de memoria oficiales, como "malloc" o "free". Además, se comprueba si los objetos de memoria asignados o desasignados están conectados a los parámetros o valores de retorno de la función. Este análisis de flujo de datos permite validar con alta confianza las funciones de gestión de memoria identificadas.

👉 Fase 2: Análisis de flujo de datos y validación de funciones de gestión de memoria

La segunda fase de Goshawk se basa en el análisis de flujo de datos y la validación de funciones de gestión de memoria. En esta fase, Goshawk sigue los flujos de asignación y desasignación de memoria, y valida la coherencia de las funciones de gestión de memoria personalizadas identificadas en la fase anterior.

En primer lugar, Goshawk utiliza el análisis de flujo de datos y la información de estructura para rastrear la propagación de los objetos de memoria asignados y desasignados desde las funciones de gestión de memoria oficiales. Este análisis permite comprender cómo se asignan y desasignan los objetos de memoria en el proyecto y proporciona una visión general de la gestión de memoria en el código fuente.

Además, Goshawk también mantiene las relaciones de anidamiento de los elementos de la estructura. Esto es especialmente importante cuando se asignan y desasignan objetos de memoria anidados en estructuras. El seguimiento de estas relaciones de anidamiento nos permite comprender la estructura de los objetos de memoria y su relación con las funciones de gestión de memoria personalizadas.

Una vez completado el análisis de flujo de datos y la recopilación de información de estructura, Goshawk utiliza la definición de MOS para generar la representación MOS asociada para cada función de gestión de memoria personalizada. Esta representación MOS es una representación estructurada y centrada en objetos que resume las propiedades clave de una función de gestión de memoria. Este paso es esencial para poder llevar a cabo una detección precisa de errores de memoria en la fase 3.

👉 Fase 3: Generación de MOS y detección de errores de memoria mejorada por MOS

La tercera fase de Goshawk se centra en la generación de MOS y la detección de errores de memoria mejorada por MOS. Utilizando la información recopilada en las fases anteriores, Goshawk implementa un análisis estático exhaustivo del código fuente para detectar de manera eficiente una amplia gama de errores de corrupción de memoria.

Al encontrar una función de gestión de memoria personalizada en el código fuente, Goshawk utiliza la información de MOS para comprender cómo se manejan los objetos de memoria en esa función. Esta información incluye detalles sobre la interfaz de la función y su flujo de asignación y desasignación interna. Al utilizar esta información más abstracta y centrada en objetos, Goshawk puede reducir el alcance de la exploración del código y lograr una detección de errores de memoria escalable y precisa.

Además, Goshawk se integra con Clang Static Analyzer, un motor de análisis estático bien desarrollado. Actualizamos el modelo de memoria de Clang Static Analyzer para que sea compatible con MOS. Esta actualización nos permite aprovechar la funcionalidad existente de Clang Static Analyzer y aplicarla a nuestro análisis mejorado por MOS.

Para eliminar falsos positivos y verificar aún más los errores de memoria encontrados, Goshawk utiliza el solucionador Z3 para reanalizar los caminos involucrados en los errores de memoria. Este análisis adicional nos permite verificar condiciones específicas de asignación y desasignación de memoria y eliminar posibles falsos positivos causados por asignaciones o desasignaciones condicionales de memoria.

En resumen, Goshawk implementa una detección de errores de memoria basada en MOS que es escalable, precisa y eficiente. Utiliza un enfoque de tres fases que involucra clasificación asistida por NLP, análisis de flujo de datos y validación, generación de MOS y detección mejorada de errores de memoria. Los resultados de la evaluación demuestran que Goshawk supera a otras herramientas de detección de errores de memoria en términos de precisión, cobertura y eficiencia.

En la siguiente sección, evaluaremos Goshawk en proyectos de código abierto populares y compararemos su rendimiento con otras herramientas de detección de errores de memoria.

Most people like

Are you spending too much time looking for ai tools?
App rating
4.9
AI Tools
100k+
Trusted Users
5000+
WHY YOU SHOULD CHOOSE TOOLIFY

TOOLIFY is the best ai tool source.