[譯] 什麼是 WebAssembly table imports

Yiniau發表於2019-03-02

title: 什麼是 WebAssembly table imports

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

categories: 翻譯

tags: WebAssembly

source: 原文地址

auther: Lin Clark


什麼是 WebAssembly table imports


這是此係列的第三篇文章:


第一篇文章中,我介紹了WebAssembly模組例項可以具有的四種不同型別的匯入:

  • values – 值
  • function imports – 函式及其閉包
  • memory – 記憶體物件
  • table – 表

最後一個可能有點不熟悉。什麼是table imports,它能幹什麼?

有時在一個程式中,你希望能夠有一個指向函式的變數,比如回撥函式。然後你可以用它做一些事情,比如將它傳遞給另一個函式。

[譯] 什麼是 WebAssembly table imports

在C中,這些被稱為函式指標。該函式駐留在記憶體中。指向函式的變數,即函式指標只是指向那個記憶體地址。

[譯] 什麼是 WebAssembly table imports

如果需要,稍後可以將變數指向另一個函式。這應該是一個熟悉的概念。

[譯] 什麼是 WebAssembly table imports

在網頁中,所有函式都只是JavaScript物件。而且因為它們是JavaScript物件,所以它們駐留在WebAssembly記憶體地址之外的記憶體中。

[譯] 什麼是 WebAssembly table imports

如果我們想要一個指向這些函式之一的變數,我們需要把它的地址寫入我們的記憶中。

[譯] 什麼是 WebAssembly table imports

但作為網頁安全的一部分,保持這些記憶體地址隱藏是必要的。你不會希望頁面上的程式碼能夠檢視或操縱該記憶體地址。如果頁面上存在惡意程式碼,它可以利用記憶體中的佈局位置資訊建立漏洞。

例如,它可以改變你已使用的一個記憶體地址,指向一個不同的記憶體位置。

然後,當您嘗試呼叫該函式時,實際載入的就是攻擊者給予您的記憶體地址中的任何內容。

[譯] 什麼是 WebAssembly table imports

惡意程式碼可能以某種方式插入到記憶體中,比如嵌入在字串中。

tables使使用函式指標成為可能,但是以一種不易受到這類攻擊的方式。

table是一個陣列,它位於WebAssembly的記憶體之外。這些值具有對函式的引用。

[譯] 什麼是 WebAssembly table imports

在內部,這些引用包含記憶體地址,但由於它不在WebAssembly的記憶體中,因此WebAssembly無法看到這些地址。

不過,它可以訪問陣列索引。

[譯] 什麼是 WebAssembly table imports

如果WebAssembly模組想要呼叫其中一個函式,它會將索引傳遞給名為call_indirect的操作,它會幫忙呼叫目標函式。

[譯] 什麼是 WebAssembly table imports

現在table的用例非常有限。它們被新增到規範中以支援這些函式指標,因為 C/C++ 非常依賴這些函式指標。

正因為如此,目前你可以放入table中的唯一引用是對函式的引用。但是,隨著WebAssembly功能的擴充套件(例如,新增直接訪問DOM的功能),除了call_indirect之外,你還可能會在table中儲存其他型別的引用以及能夠使用table中的其他操作。

相關文章