Tablas de importación de WebAssembly … ¿Qué son?

22 febrero, 2018 1:47 por

Esta es una traducción del artículo original publicado en el blog de Mozilla Hacks.

En un artículo anterior, te introducimos a las cuatro formas de importación que puede poseer una instancia de WebAssembly:

  • Valores (values)
  • Funciones de cierre (function imports)
  • Memoria (memory)
  • Tablas (tables)

La última probablemente era un poco desconocida. ¿Qué es una tabla de importación y para qué se usa?

A veces en un programa te gustaría tener una variable que apunta a una función, por ejemplo para que se ejecute luego de una acción, como los callbacks. Entonces puedes así pasarla a otra función.

En C, esto se llama punteros de funciones. La función reside en memoria. La variable, el puntero a la función, solo apunta a esa dirección de memoria.

Y si lo necesitas, puedes apuntar a la variable a otra función. Este concepto debería ser familiar.

En las páginas web, todas las funciones son solo objetos de JavaScript. Y por ello, residen en direcciones de memoria que están fuera de la memoria de WebAssembly.

Si quieres tener una variable que apunte a una de estas funciones, necesitamos tomar su dirección y ponerla en nuestra memoria.

Pero parte de mantener las páginas web seguras es asegurarse de esconder esas direcciones. No quieres que el código de la página tenga posibilidad de ver o manipular las direcciones de memoria. Si hay código malicioso, se puede usar para conocer cosas que estén en memoria y crearía una vulnerabilidad.

Por ejemplo, se podría cambiar la dirección que tienes de una función y apuntarla a otro lugar. Entonces cuando intentes llamar a esa función, en vez de cargarla ejecutaría la dirección que tu atacante te modificó.

Esto podría permitir que código malicioso se inserte en memoria, tal vez dentro de una cadena de texto. Las tablas hacen posible tener punteros de función, pero de una forma que no sean vulnerables a este tipo de ataques.

Una tabla es un arreglo que vive fuera de la memoria de WebAssembly, donde los valores son referencias a funciones.

Internamente, estas referencias contienen direcciones de memoria, pero como no están dentro de la memoria de WebAssembly, WebAssembly no puede ver esas direcciones. Solo tiene acceso a los índices del arreglo.

Si el módulo de WebAssembly desea llamar a una de estas funciones, pasa el índice a una operación llamada call_indirect. Ésta llamará a la función.

Actualmente el uso para las tablas es un poco limitado. Fueron añadidas a la especificación para soportar los punteros de funciones, porque normalmente C y C++ suelen usar este tipo de cosas. Por ello, los únicos tipos de referencias que puedes colocar en una tabla son referencias a funciones. Pero conforme las posibilidades de WebAssembly se expandan, por ejemplo, cuando se añada el acceso directo al DOM, podrás ver otro tipo de referencias almacenadas en las tablas y otras operaciones en las tablas, adicionalmente a call_indirect.

The following two tabs change content below.
Colaborador de Mozilla Venezuela e Hispano en las áreas de desarrollo y medios sociales, entre otros. También soy desarrollador Web, Skateboarder, Profesor universitario, jugador de Playstation y PC, usuario Linux, Blogger, Geek, entre otros.

Compartir artículo:

Join the discussion at foro.mozilla-hispano.org

  • ¡Participa!

    Firefox Friends »
    Agrega botones de Firefox en tu sitio web y comparte tu amor por Mozilla Firefox.
    Armada alucinante »
    Ayuda a otros usuarios en Twitter.
    Colabora con la comunidad »
    En Mozilla lo importante son las personas. Descubre cómo puedes colaborar.

    Boletín Firefox

    Suscríbete al boletín de novedades de Firefox.

  • Descargas

    Descarga los programas de Mozilla.

    Lo más visto

    cc-by-sa