Communitygithub.com

AddressSanitizer (ASan)

AddressSanitizer detecta errores de memoria durante el fuzzing. Úsalo al hacer fuzzing de código C/C++ para encontrar desbordamientos de búfer y errores de uso después de liberación.

¿Qué es AddressSanitizer (ASan)?

AddressSanitizer (ASan) es una herramienta ampliamente adoptada para la detección de errores de memoria, utilizada principalmente durante pruebas de software, especialmente fuzzing. Ayuda a identificar errores de corrupción de memoria que de otro modo pasarían desapercibidos, como desbordamientos de búfer, uso después de liberación (use-after-free) y otras violaciones de seguridad de memoria. ASan instrumenta el código en tiempo de compilación para rastrear asignaciones y accesos a memoria, detectando operaciones ilegales en tiempo de ejecución. Es compatible con principales motores de fuzzing como libFuzzer, AFL++, cargo-fuzz (Rust) y honggfuzz, y se utiliza tanto en C/C++ como en Rust inseguro (unsafe) o interfaces FFI. Su uso es estándar en fuzzing debido a su efectividad para descubrir vulnerabilidades de memoria, aunque introduce una ralentización de 2 a 4 veces y requiere aproximadamente 20 TB de memoria virtual.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/SamuelChien/mega-skills-collection/tree/HEAD/address-sanitizer

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

¿Qué hace AddressSanitizer (ASan)?

AddressSanitizer (ASan) es una herramienta ampliamente adoptada para la detección de errores de memoria, utilizada extensamente durante pruebas de software, especialmente fuzzing. Ayuda a detectar errores de corrupción de memoria que de otro modo pasarían desapercibidos, como desbordamientos de búfer, errores de uso después de liberación y otras violaciones de seguridad de memoria.

Descripción general

ASan es una práctica estándar en fuzzing debido a su efectividad para identificar vulnerabilidades de memoria. Instrumenta el código en tiempo de compilación para rastrear asignaciones y accesos a memoria, detectando operaciones ilegales en tiempo de ejecución.

Conceptos clave

ConceptoDescripción
InstrumentaciónASan añade comprobaciones en tiempo de ejecución a las operaciones de memoria durante la compilación
Memoria sombraAsigna 20 TB de memoria virtual para rastrear el estado de asignación
Coste de rendimientoAproximadamente 2-4 veces más lento en comparación con código no instrumentado
Alcance de detecciónEncuentra desbordamientos de búfer, uso después de liberación, doble liberación y fugas de memoria

Cuándo aplicarlo

Aplica esta técnica cuando:

  • Hagas fuzzing de código C/C++ para vulnerabilidades de seguridad de memoria
  • Pruebes código Rust con bloques inseguros (unsafe)
  • Depures fallos relacionados con corrupción de memoria
  • Ejecutes pruebas unitarias donde se sospechen errores de memoria

Omite esta técnica cuando:

  • Ejecutes código en producción (ASan puede reducir la seguridad)
  • La plataforma sea Windows o macOS (soporte limitado de ASan)
  • El costo de rendimiento sea inaceptable para tu caso de uso
  • Hagas fuzzing de lenguajes puramente seguros sin FFI (por ejemplo, Go puro, Java puro)

Referencia rápida

TareaComando/Patrón
Habilitar ASan (Clang/GCC)-fsanitize=address
Habilitar verbosidadASAN_OPTIONS=verbosity=1
Deshabilitar detección de fugasASAN_OPTIONS=detect_leaks=0
Forzar aborto en errorASAN_OPTIONS=abort_on_error=1
Múltiples opcionesASAN_OPTIONS=verbosity=1:abort_on_error=1

Paso a paso

Paso 1: Compilar con ASan

Compila y enlaza tu código con la bandera -fsanitize=address:

clang -fsanitize=address -g -o mi_programa mi_programa.c

Se recomienda la bandera -g para obtener mejores trazas de pila cuando ASan detecta errores.

Paso 2: Configurar opciones de ASan

Establece la variable de entorno ASAN_OPTIONS para configurar el comportamiento de ASan:

export ASAN_OPTIONS=verbosity=1:abort_on_error=1:detect_leaks=0

Paso 3: Ejecutar tu programa

Ejecuta el binario instrumentado con ASan. Cuando se detecten errores de memoria, ASan imprimirá informes detallados:

./mi_programa

Paso 4: Ajustar límites de memoria del fuzzer

ASan requiere aproximadamente 20 TB de memoria virtual. Deshabilita las restricciones de memoria del fuzzer:

  • libFuzzer: -rss_limit_mb=0
  • AFL++: -m none

Patrones comunes

Patrón: Integración básica de ASan

Caso de uso: Configuración estándar de fuzzing con ASan

Antes:

clang -o objetivo_fuzzing objetivo_fuzzing.c
./objetivo_fuzzing

Después:

clang -fsanitize=address -g -o objetivo_fuzzing objetivo_fuzzing.c
ASAN_OPTIONS=verbosity=1:abort_on_error=1 ./objetivo_fuzzing

Patrón: ASan con pruebas unitarias

Caso de uso: Habilitar ASan para un conjunto de pruebas unitarias

Antes:

gcc -o suite_pruebas suite_pruebas.c -lcheck
./suite_pruebas

Después:

gcc -fsanitize=address -g -o suite_pruebas suite_pruebas.c -lcheck
ASAN_OPTIONS=detect_leaks=1 ./suite_pruebas

Uso avanzado

Consejos y trucos

ConsejoPor qué ayuda
Usa la bandera -gProporciona trazas de pila detalladas para depuración
Configura verbosity=1Confirma que ASan está habilitado antes de que el programa comience
Deshabilita detección de fugas durante fuzzingLa detección de fugas no causa fallos inmediatos, satura la salida
Habilita abort_on_error=1Algunos fuzzers requieren abort() en lugar de _exit()

Cómo interpretar informes de ASan

Cuando ASan detecta un error de memoria, imprime un informe detallado que incluye:

  • Tipo de error: Desbordamiento de búfer, uso después de liberación, etc.
  • Traza de pila: Dónde ocurrió el error
  • Trazas de asignación/liberación: Dónde se asignó/liberó la memoria
  • Mapa de memoria: Estado de la memoria sombra alrededor del error

Ejemplo de informe de ASan:

==12345==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60300000eff4 at pc 0x00000048e6a3
READ of size 4 at 0x60300000eff4 thread T0
    #0 0x48e6a2 in main /ruta/al/archivo.c:42

Combinar sanitizadores

ASan se puede combinar con otros sanitizadores para una detección integral:

clang -fsanitize=address,undefined -g -o objetivo_fuzzing objetivo_fuzzing.c

Consideraciones específicas de plataforma

Linux: Soporte completo de ASan con el mejor rendimiento macOS: Soporte limitado, algunas características pueden no funcionar Windows: Soporte experimental, no recomendado para fuzzing en producción

Antipatrones

AntipatrónProblemaEnfoque correcto
Usar ASan en producciónPuede hacer que las aplicaciones sean menos segurasUsa ASan solo para pruebas
No deshabilitar límites de memoriaEl fuzzer puede matar el proceso debido a 20 TB de memoria virtualConfigura -rss_limit_mb=0 o -m none
Ignorar informes de fugasLas fugas de memoria indican problemas de gestión de recursosRevisa los informes de fugas al final de la campaña de fuzzing

Guía específica de herramientas

libFuzzer

Compila con el fuzzer y el sanitizador de direcciones:

clang++ -fsanitize=fuzzer,address -g harness.cc -o fuzz

Ejecuta con RSS ilimitado:

./fuzz -rss_limit_mb=0

Consejos de integración:

  • Siempre combina -fsanitize=fuzzer con -fsanitize=address
  • Usa -g para trazas de pila detalladas en informes de fallos
  • Considera ASAN_OPTIONS=abort_on_error=1 para un mejor manejo de fallos

Ver: libFuzzer: AddressSanitizer

AFL++

Usa la variable de entorno AFL_USE_ASAN:

AFL_USE_ASAN=1 afl-clang-fast++ -g harness.cc -o fuzz

Ejecuta con memoria ilimitada:

afl-fuzz -m none -i dir_entrada -o dir_salida ./fuzz

Consejos de integración:

  • AFL_USE_ASAN=1 añade automáticamente las banderas de compilación adecuadas
  • Usa -m none para deshabilitar el límite de memoria de AFL++
  • Considera AFL_MAP_SIZE para programas con mapas de cobertura grandes

Ver: AFL++: AddressSanitizer

cargo-fuzz (Rust)

Usa la bandera --sanitizer=address:

cargo fuzz run objetivo_fuzzing --sanitizer=address

O configura en fuzz/Cargo.toml:

[profile.release]
opt-level = 3
debug = true

Consejos de integración:

  • ASan es útil para fuzzing de código Rust inseguro (unsafe) o límites FFI
  • El código Rust seguro puede no beneficiarse tanto (el compilador ya previene muchos errores)
  • Concéntrate en bloques unsafe, punteros crudos y enlaces con bibliotecas C

Ver: cargo-fuzz: AddressSanitizer

honggfuzz

Compila con ASan y enlaza con honggfuzz:

honggfuzz -i dir_entrada -o dir_salida -- ./objetivo_fuzzing_asan

Compila el objetivo:

hfuzz-clang -fsanitize=address -g objetivo.c -o objetivo_fuzzing_asan

Consejos de integración:

  • honggfuzz funciona bien con ASan directamente
  • Usa el modo guiado por retroalimentación para mejor cobertura con sanitizadores
  • Monitorea el uso de memoria, ya que ASan aumenta la huella de memoria

Solución de problemas

ProblemaCausaSolución
El fuzzer mata el proceso inmediatamenteLímite de memoria demasiado bajo para los 20 TB de memoria virtual de ASanUsa -rss_limit_mb=0 (libFuzzer) o -m none (AFL++)
"ASan runtime not initialized"Orden de enlace incorrecto o runtime faltanteAsegura que -fsanitize=address se use tanto en compilación como en enlace
Informes de fugas saturan la salidaLeakSanitizer habilitado por defectoConfigura ASAN_OPTIONS=detect_leaks=0
Rendimiento pobre (>4x de ralentización)Modo debug o compilación no optimizadaCompila con -O2 o -O3 junto a -fsanitize=address
ASan no detecta errores obviosBinario no instrumentadoVerifica con ASAN_OPTIONS=verbosity=1 que ASan imprime información de inicio
Falsos positivosConflictos de interceptoresConsulta las FAQ de ASan para problemas conocidos con bibliotecas específicas

Habilidades relacionadas

Herramientas que usan esta técnica

HabilidadCómo se aplica
libfuzzerCompila con -fsanitize=fuzzer,address para fuzzing integrado con detección de errores de memoria
aflppUsa la variable de entorno AFL_USE_ASAN=1 durante la compilación
cargo-fuzzUsa la bandera --sanitizer=address para habilitar ASan en objetivos de fuzzing de Rust
honggfuzzCompila el objetivo con -fsanitize=address para fuzzing instrumentado con ASan

Técnicas relacionadas

HabilidadRelación
undefined-behavior-sanitizerA menudo se usa junto con ASan para detección integral de errores (comportamiento indefinido + errores de memoria)
fuzz-harness-writingLos harnesses deben diseñarse para manejar fallos detectados por ASan y evitar falsos positivos
coverage-analysisEl fuzzing guiado por cobertura ayuda a ejecutar rutas de código donde ASan puede detectar errores de memoria

Recursos

Recursos externos clave

AddressSanitizer en Google Sanitizers Wiki

La documentación oficial de ASan cubre:

  • Algoritmo y detalles de implementación
  • Lista completa de tipos de errores detectados
  • Características de rendimiento y sobrecarga
  • Comportamiento específico de plataforma
  • Limitaciones e incompatibilidades conocidas

SanitizerCommonFlags

Banderas de configuración comunes compartidas por todos los sanitizadores:

  • verbosity: Controla el nivel de salida de diagnóstico
  • log_path: Redirige la salida del sanitizador a archivos
  • symbolize: Habilita/deshabilita la resolución de símbolos en informes
  • external_symbolizer_path: Usa un simbolizador personalizado

AddressSanitizerFlags

Opciones de configuración específicas de ASan:

  • detect_leaks: Controla la detección de fugas de memoria
  • abort_on_error: Llama a abort() vs _exit() en caso de error
  • detect_stack_use_after_return: Detecta errores de uso después de retorno en la pila
  • check_initialization_order: Encuentra errores de orden de inicialización

AddressSanitizer FAQ

Problemas comunes y soluciones:

  • Problemas de orden de enlace
  • Conflictos con otras herramientas
  • Problemas específicos de plataforma
  • Consejos de ajuste de rendimiento

Documentación de Clang sobre AddressSanitizer

Guía específica de Clang:

  • Banderas y opciones de compilación
  • Interacción con otras características de Clang
  • Plataformas y arquitecturas compatibles

Opciones de instrumentación de GCC

Documentación de ASan específica de GCC:

  • Banderas y comportamiento específicos de GCC
  • Diferencias con la implementación de Clang
  • Soporte de plataforma en GCC

AddressSanitizer: A Fast Address Sanity Checker (Artículo USENIX)

Artículo de investigación original con detalles técnicos:

  • Algoritmo de memoria sombra
  • Requisitos de memoria virtual (históricamente 16 TB, ahora ~20 TB)
  • Evaluaciones comparativas de rendimiento
  • Decisiones de diseño y compensaciones

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

SamuelChien/mega-skills-collection

Security audit, hardening, threat modeling (STRIDE/PASTA), Red/Blue Team, OWASP checks, code review, incident response, and infrastructure security for any project.

SamuelChien/mega-skills-collection

Arquitecto de Soluciones Principal y Consultor Tecnológico de Andru.ia. Diagnostica y traza la hoja de ruta óptima para proyectos de IA en español.

SamuelChien/mega-skills-collection

Ingeniero de Sistemas de Andru.ia. Diseña, redacta y despliega nuevas habilidades (skills) dentro del repositorio siguiendo el Estándar de Diamante.

SamuelChien/mega-skills-collection

Estratega de Inteligencia de Dominio de Andru.ia. Analiza el nicho específico de un proyecto para inyectar conocimientos, regulaciones y estándares únicos del sector. Actívalo tras definir el nicho.

SamuelChien/mega-skills-collection

2D game development principles. Sprites, tilemaps, physics, camera.

SamuelChien/mega-skills-collection

3D game development principles. Rendering, shaders, physics, cameras.

SamuelChien/mega-skills-collection

Expert in building 3D experiences for the web - Three.js, React Three Fiber, Spline, WebGL, and interactive 3D scenes. Covers product configurators, 3D portfolios, immersive websites, and bringing depth to web experiences.

SamuelChien/mega-skills-collection

Accessibility audit skill for scanning, fixing, and verifying WCAG 2.2 Level A and AA compliance across React, Next.js, Vue, Angular, Svelte, and plain HTML codebases. Use when auditing accessibility, fixing a11y violations, checking color contrast, generating compliance reports, or integrating accessibility checks into CI/CD pipelines.

SamuelChien/mega-skills-collection

Ab Test Analyzer - Auto-activating skill for Data Analytics. Triggers on: ab test analyzer, ab test analyzer Part of the Data Analytics skill category.

SamuelChien/mega-skills-collection

A B Test Config Creator - Auto-activating skill for ML Deployment. Triggers on: a b test config creator, a b test config creator Part of the ML Deployment skill category.

SamuelChien/mega-skills-collection

When the user wants to plan, design, or implement an A/B test or experiment. Also use when the user mentions "A/B test," "split test," "experiment," "test this change," "variant copy," "multivariate test," "hypothesis," "conversion experiment," "statistical significance," or "test this." For tracking implementation, see analytics-tracking.

SamuelChien/mega-skills-collection

Acceptance Criteria Creator - Auto-activating skill for Enterprise Workflows. Triggers on: acceptance criteria creator, acceptance criteria creator Part of the Enterprise Workflows skill category.

SamuelChien/mega-skills-collection

Use when a coding task should be driven end-to-end from issue intake through implementation, review, deployment, and acceptance verification with minimal human re-intervention.

SamuelChien/mega-skills-collection

Accessibility Audit Runner - Auto-activating skill for Frontend Development. Triggers on: accessibility audit runner, accessibility audit runner Part of the Frontend Development skill category.

SamuelChien/mega-skills-collection

You are an accessibility expert specializing in WCAG compliance, inclusive design, and assistive technology compatibility. Conduct audits, identify barriers, and provide remediation guidance.

SamuelChien/mega-skills-collection

Web accessibility patterns for WCAG 2.2 compliance including ARIA, keyboard navigation, screen readers, and testing

SamuelChien/mega-skills-collection

Manage Discord channel access — approve pairings, edit allowlists, set DM/group policy. Use when the user asks to pair, approve someone, check who's allowed, or change policy for the Discord channel.

SamuelChien/mega-skills-collection

Create unified specification packages across Business, Development, and Design teams. Staged elaboration (L0 Vision → L1 Requirements → L2 Team Detail → L3 Acceptance Criteria) to build shared understanding. Does not write code.

SamuelChien/mega-skills-collection

Research a company or person and get actionable sales intel. Works standalone with web search, supercharged when you connect enrichment tools or your CRM. Trigger with "research [company]", "look up [person]", "intel on [prospect]", "who is [name] at [company]", or "tell me about [company]".

SamuelChien/mega-skills-collection

Validate messaging consistency across website, GitHub repos, and local documentation generating read-only discrepancy reports. Use when checking content alignment or finding mixed messaging. Trigger with phrases like "check consistency", "validate documentation", or "audit messaging".

Skills relacionados