← Últimos artículos
💻 computer science

CHC-based Automated Verification of WebAssembly Programs

Este artículo propone un método de verificación estática automatizada para un subconjunto de WebAssembly utilizando cláusulas de Horn restringidas, el cual maneja eficazmente las llamadas a funciones indirectas mediante el filtrado basado en tipos y gestiona los manejadores de pánico extensos mediante la sumarización del análisis de flujo de control.

Autores originales: Akihisa Yagi, Ken Sakayori, Naoki Kobayashi

Publicado 2026-07-21
📖 6 min de lectura🧠 Análisis profundo

Autores originales: Akihisa Yagi, Ken Sakayori, Naoki Kobayashi

Artículo original bajo licencia CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). Esta es una explicación generada por IA del artículo a continuación. No ha sido escrita ni avalada por los autores. Para mayor precisión técnica, consulte el artículo original. Leer descargo de responsabilidad completo

Imagina que el internet es una ciudad gigante y bulliciosa donde cada edificio es un sitio web. Durante años, estos edificios fueron construidos con un conjunto de planos específicos y pesados que los hacían seguros pero, a veces, lentos de construir. Entonces, llegó WebAssembly, un nuevo lenguaje súper eficiente. Es como un sistema de drones de entrega universales y de alta velocidad que puede volar a cualquier parte de la web, transportando cargas pesas de código para ejecutar juegos, herramientas y aplicaciones directamente en tu navegador. Debido a que estos drones son tan rápidos y potentes, debemos asegurarnos de que nunca choquen contra un edificio o suelten su carga en el lugar equivocado. Este es el trabajo de la "verificación": una palabra elegante para demostrar matemáticamente que un programa es seguro antes de que se ejecute.

Para hacer esto, los científicos de la computación suelen utilizar una herramienta llamada "Solucionador de Satisfacibilidad" (Satisfiability Solver). Piensa en este solucionador como un detective súper inteligente que puede mirar un conjunto de reglas y decirte instantáneamente si un escenario es posible o imposible. Si las reglas dicen "El dron debe estar en el cielo" y "El dron debe estar en el suelo" al mismo tiempo, el detective sabe que eso es una contradicción y que el plan no es seguro. Este artículo toma a ese detective y le enseña cómo entender las reglas específicas y complicadas de WebAssembly, especialmente las partes que involucran llamar a otras funciones de forma indirecta y el manejo de mensajes de error masivos.


El misterio de la llamada metamórfica

Los autores, Akihisa Yagi, Ken Sakayori y Naoki Kobayashi de la Universidad de Tokio, se enfrentaron a un rompecabezas difícil. Los programas de WebAssembly son como una biblioteca masiva donde los libros (funciones) pueden ser extraídos de los estantes de forma dinámica. A veces, el código no dice "Abra el Libro A"; en su lugar, dice "Abra el libro en el estante número 5". Esto se llama una llamada de función indirecta.

El problema es que si intentas revisar cada uno de los libros de la biblioteca para ver qué podría haber en el estante número 5, el detective (el solucionador) se siente abrumado. Es como intentar revisar todas las combinaciones posibles de un millón de cerraduras para encontrar la llave correcta. El enfoque ingenuo sería enumerar cada posibilidad, pero eso crea una montaña de papeleo que ningún ordenador puede resolver en un tiempo razonable.

La solución de los autores fue actuar como un bibliotecario muy estricto. Se dieron cuenta de que WebAssembly tiene una regla: solo puedes extraer un libro de un estante si coincide con el género (tipo) que estás buscando. Por lo tanto, en lugar de revisar cada libro de la biblioteca, su método mira el "género" requerido en el lugar de la llamada y filtra todos los libros que no encajan. Esto reduce drásticamente la lista de candidatos, haciendo que el trabajo del detective sea mucho más fácil. También añadieron un segundo truco: si los estantes de la biblioteca están bloqueados y nunca cambian (de solo lectura), pueden precalcular exactamente qué libro está en cada lugar, convirtiendo un puzzle complejo en una simple lista de reglas de "si esto, entonces aquello".

El botón de pánico gigante

El segundo desafío fue el "manejador de pánico" (panic handler). Imagina un programa que, cuando comete un error, no solo se detiene; sino que lanza un discurso masivo de 10,000 pasos explicando exactamente qué salió mal, completo con tablas de diagnóstico y códigos de error, antes de finalmente rendirse. En WebAssembly, estos manejadores de pánico son enormes bloques de código que se activan cuando algo sale mal.

Para el verificador de seguridad, estos discursos masivos son una distracción. Lo único que importa es que el programa eventualmente deje de ejecutarse de forma segura (alcance una instrucción "unreachable"). El largo y sinuoso camino de construir el mensaje de error no cambia realmente el hecho de que el programa está fallando. Sin embargo, si el detective intenta rastrear cada uno de los pasos de ese discurso de 10,000 pasos, se queda estancado.

Los autores introdujeron una técnica de "resumen" (summarization). Se dieron cuenta de que si un bloque de código solo conduce a un fallo, pueden eliminar al intermediario. Utilizaron un análisis de flujo de control para identificar estos caminos largos y sinuosos y los reemplazaron con un atajo simple: "Si entras en esta habitación, eventualmente fallarás". Es como decirle a un guía turístico: "Sáltate la conferencia de 50 minutos sobre la historia del vestíbulo; solo dinos que la salida está bloqueada". Esto mantiene la verificación enfocada en los problemas de seguridad críticos sin perderse en el ruido del mensaje de error.

Los resultados: Un trabajo en progreso

Para probar sus ideas, el equipo construyó una herramienta prototipo llamada WASMVERIFIER. Les entregaron 90 programas diferentes, incluyendo algunos escritos en Rust y C, y les pidieron que demostraran que eran seguros.

Los resultados fueron prometedores pero no perfectos. Utilizando dos solucionadores de detectives diferentes (Z3 Spacer y Eldarica), la herramienta verificó o desmintió con éxito la seguridad de unos 54 a 56 programas. Sin embargo, se topó con un muro en unos 20 a 22 programas, agotando el tiempo (un "timeout") o la memoria. En unos 11 a 12 casos, dio una "falsa alarma", pensando que un programa era inseguro cuando en realidad estaba bien. Los autores explican que estas falsas alarmas ocurrieron porque su herramienta tuvo que reemplazar algunas instrucciones no soportadas con un marcador de posición de "fallo" (crash), lo que hizo que la verificación de seguridad fuera demasiado cautelosa.

El artículo sugiere que, si bien este enfoque es un paso sólido hacia las comprobaciones de seguridad totalmente automatizadas, aún no es una varita mágica. Los autores señalan que el método todavía se está refinando, particularmente en cómo maneja las operaciones matemáticas complejas sobre bits (vectores de bits) y cómo lidiar con instrucciones que aún no comprenden por completo. Sospechan que el método es sólido y completo, pero aún no han escrito la prueba matemática formal para ello, dejando eso como una tarea para el futuro.

En resumen, el artículo muestra que, siendo más inteligentes en la forma en que filtramos las llamadas indirectas y resumiendo las partes desordenadas del manejo de errores, podemos hacer que las comprobaciones de seguridad automatizadas para WebAssembly sean mucho más prácticas. Es una base sólida, pero el detective aún necesita más entrenamiento para resolver todos los casos.

¿Ahogado en artículos de tu campo?

Recibe resúmenes diarios de los artículos más novedosos que coincidan con tus palabras clave de investigación — con resúmenes técnicos, en tu idioma.

Probar Digest →