系統安全與漏洞利用

指標驗證(pointer authentication)

/ PAK /

當你在支票上簽名時,這個簽名讓銀行能偵測偽造:改了金額,簽名就不再相符。指標驗證(PAC)是 ARM 的一項功能,把這個點子用到指標上。在一個指標(尤其是返回位址或函式指標)被存進記憶體之前,CPU 對它計算一個密碼學簽章,並把那個簽章塞進指標自身未用到的高位元裡;在指標被使用之前,CPU 驗證該簽章。如果攻擊者在這中間竄改了指標,簽章檢查就會失敗。

它如何嵌進一個 64 位元位址,是這樣。真實的虛擬位址只用到低位元(例如 48 位),讓高位元閒置。PAC 把一個指標驗證碼——由指標值、一把存在 CPU 裡的秘密金鑰、以及一個情境值(例如堆疊指標)算出的帶金鑰密碼學標記——塞進那些閒置的高位元。新指令負責這項工作:pacia 對指標簽章,autia 驗證它(並從中剝除標記)。一個函式的序言以 paciasp 對返回位址簽章;它的收尾在 ret 之前以 autiasp 驗證它。如果一次緩衝區溢位用攻擊者的值覆蓋了被儲存的返回位址,那個值在此情境下沒有有效簽章,於是驗證失敗,解參考這個現已損毀的指標就出錯。因為簽章金鑰從不離開 CPU、攻擊者也不知道,他們無法替任意位址偽造一個有效標記。

它之所以重要,是因為它以低額外成本同時保護返回位址(後向邊)與程式碼/函式指標(前向邊),且部署廣泛(尤其在 Apple 的 ARM 晶片上),從根本上削弱 ROP 與指標損毀攻擊。誠實的提醒:PAC 不是完整保證。標記只有閒置位元那麼多位(常為 11 到 16),所以盲猜以小但非零的機率成功;一個「簽章神諭」(攻擊者能促使其簽章一個他們選定之指標的程式碼路徑)或金鑰洩漏會破解它;而在不同情境下重用一個有效簽章的指標(指標重用,或「PACMAN」式的推測攻擊)能繞過它。它是一道強而便宜的層,不是絕對的層。

; 帶 PAC 保護返回位址的 ARM64 函式: paciasp ; 序言:以 SP 為情境對返回位址(lr)簽章 ... ; 主體;溢位可能蓋掉被儲存的 lr autiasp ; 收尾:驗證;若 lr 被竄改則失敗 ret ; 只有有效簽章的返回位址能存活

paciasp/autiasp 夾住整個函式:被竄改的返回位址會在 ret 使用它之前驗證失敗。

PAC 的標記只有寥寥幾個位元,所以它是機率性的,而一個簽章神諭或金鑰洩漏就能擊敗它;它大幅提高指標偽造的成本,卻不是無條件的保證。

又称
PACpointer authentication codeARM PAC指標驗證碼