[译] 什么是 WebAssembly table imports


title: 什么是 WebAssembly table importsjavascript

date: 2018-3-22 23:58:00java

categories: 翻译web

tags: WebAssembly数组

source: 原文地址安全

auther: Lin Clark闭包


什么是 WebAssembly table imports


这是此系列的第三篇文章:函数


第一篇文章中,我介绍了WebAssembly模块实例能够具备的四种不一样类型的导入:布局

  • values - 值
  • function imports - 函数及其闭包
  • memory - 内存对象
  • table - 表

最后一个可能有点不熟悉。什么是table imports,它能干什么?翻译

有时在一个程序中,你但愿可以有一个指向函数的变量,好比回调函数。而后你能够用它作一些事情,好比将它传递给另外一个函数。3d

在C中,这些被称为函数指针。该函数驻留在内存中。指向函数的变量,即函数指针只是指向那个内存地址。

若是须要,稍后能够将变量指向另外一个函数。这应该是一个熟悉的概念。

在网页中,全部函数都只是JavaScript对象。并且由于它们是JavaScript对象,因此它们驻留在WebAssembly内存地址以外的内存中。

若是咱们想要一个指向这些函数之一的变量,咱们须要把它的地址写入咱们的记忆中。

但做为网页安全的一部分,保持这些内存地址隐藏是必要的。你不会但愿页面上的代码可以查看或操纵该内存地址。若是页面上存在恶意代码,它能够利用内存中的布局位置信息建立漏洞。

例如,它能够改变你已使用的一个内存地址,指向一个不一样的内存位置。

而后,当您尝试调用该函数时,实际加载的就是攻击者给予您的内存地址中的任何内容。

恶意代码可能以某种方式插入到内存中,好比嵌入在字符串中。

tables使使用函数指针成为可能,可是以一种不易受到这类攻击的方式。

table是一个数组,它位于WebAssembly的内存以外。这些值具备对函数的引用。

在内部,这些引用包含内存地址,但因为它不在WebAssembly的内存中,所以WebAssembly没法看到这些地址。

不过,它能够访问数组索引。

若是WebAssembly模块想要调用其中一个函数,它会将索引传递给名为call_indirect的操做,它会帮忙调用目标函数。

如今table的用例很是有限。它们被添加到规范中以支持这些函数指针,由于 C/C++ 很是依赖这些函数指针。

正由于如此,目前你能够放入table中的惟一引用是对函数的引用。可是,随着WebAssembly功能的扩展(例如,添加直接访问DOM的功能),除了call_indirect以外,你还可能会在table中存储其余类型的引用以及可以使用table中的其余操做。

相关文章
相关标签/搜索