[譯]什麼是 WebAssembly table imports?

原文連接: https://fanmingfei.com/posts/...html

這是系列文章第三篇:web


在第一篇文章中,我介紹了 WebAssembly 能夠導入的四中不一樣的類型。函數

  • valuespost

  • functionspa

  • memory.net

  • tables指針

最後一個可能有點陌生。什麼是 table import,它有什麼用呢?

有時在程序中,你想要有一個變量指向一個函數,就像一個回調。而後你能夠把它傳遞給其餘的方法。

Defining a callback and passing it into a function

在 C 語言中,這叫作函數指針。函數存在內存中。變量,函數指針,只是指向該內存地址。

Function pointer at memory address 4 points to the callback at memory address 1

若是須要,之後能夠將變量指向一個不一樣的函數。這應該是一個熟悉的概念。

Function pointer at memory address 4 changes to point to callback2 at memory address 4

在 web 頁面中,全部的方法都是 JavaScript 對象並且因爲它們是 JavaScript 對象,因此它們存在於 WebAssembly 內存以外的內存地址中。

JS function living in JS managed memory

若是咱們想要一個指向其中一個函數的變量,咱們須要把它的地址放在咱們的內存中。

Function pointer in WebAssembly memory pointing to function

保證網頁安全的一部分是保證內存地址的不可見。你不但願頁面上的代碼能夠看到或操做這些內存地址。若是頁面上有惡意代碼,它可使用修改內存來建立漏洞。

例如,它可能會更改你的內存地址,以指向不一樣的內存位置。

那麼當你嘗試調用這個函數的時候,你會加載攻擊者給你的內存地址。

Malicious actor changing the address in WebAssembly memory to point to malicious code

多是以某種方式插入到內存中的惡意代碼,可能嵌入到字符串中。

Tables 可能實現相似函數指針的東西,這樣不容易受到這些攻擊的影響。

Table 是存在於 WebAssembly 內存以外的數組。它的值是對函數的引用。

Another region of memory is added, distinct from WebAssembly memory, which contains the function pointer

這些引用包含內存地址,但因爲它不在 WebAssembly 的內存中,WebAssembly 不能看到這些地址。

但它確實能夠訪問數組索引。

All memory outside of the WebAssembly memory object is obfuscated

若是 WebAssembly 模塊想要調用這些函數,它將該索引傳遞給一個名爲call_indirect的操做。這樣就能夠調用函數了。

call_indirect points to the first element of the obfuscated array, which in turn points to the function

如今,Table 的用例很是有限。它被添加到用於支持函數指針的規範中,由於C/C++很是依賴函數指針。

因此,當前惟一可使用table來引用的只有函數可是隨着WebAssembly擴展的功能,例如,當添加對DOM的直接訪問時,你可能將會看到Table上存儲着其餘的類型的引用,和除了call_indirect以外的操做。

About

Lin Clark

相關文章
相關標籤/搜索