在(編譯器)開關的切換之間達到更好的安全性: 啟動指標驗證與分支目標識別指令

November 07, 2023

作者:Arm 架構暨技術部門安全架構師 Nicolas Devillard

科技正深植於我們生活的每個面向,隨著資料點與連接性的增加,帶來了改變人們生活、但卻相形複雜的數位解決方案。管理此類解決方案的安全性是 Arm 運算架構師的首要任務,而這點也反映在更廣泛的產業的意向上。根據 PSA Certified 2023 年安全性報告,75% 的技術決策者把安全性視為企業的優先要務。

全面性的安全性策略

Arm 致力於和晶片與軟體合作夥伴合作,為不斷發展演進的安全性最佳實務作法與技術提供全面性的策略。在軟體安全性方面,我們在近期發布的架構更新中,鎖定數個與記憶體相關的多個安全性漏洞。我們於 2019 年針對 Armv8.5 指令集導入記憶體標籤擴充(MTE)。我們也推出了以下功能:

  • 在 Armv8.3-A 導入指標驗證(Pointer Authentication, PAC)
  • 在 Armv8.5-A 導入分支目標識別(Branch Target Identification, BTI)
  • 在 Armv8.1-M 導入 PACBTI 聯合支援性

這些全都是針對強化軟體的可靠性而設計的技術,可協助減少某些級別的安全性漏洞,包括在所有嚴重安全錯誤中佔比最高的記憶體安全違規與記憶體損壞。


瑞薩電子全新的微控制器採用 PACBTI

Renesas(瑞薩電子)近日發表全新的 RA8 系列的微控制器(MCU),這也是業界首款採用 Cortex-M85 架構的 MCU,Cortex-M85 是 Arm 迄今效能最高且最安全的 Cortex-M 處理器。RA8 系列運用了 Arm Helium 技術,不但可提升 DSP(數位訊號處理)與 ML(機器學習)的效能,同時也讓從事創新的人員可以在不影響安全性的情況下,充分掌握 AI 的商機。

瑞薩電子物聯網平台部門副總裁 Daryl Khoo 表示:「我們很興奮能在全新的 RA8 系列中採用了 Arm Cortex-M85 與 Helium 技術,為要求極高的 AI 實作與其它使用場景帶來所需的更高效能。」他指出:「此外,RA8 系列還採用 PACBTI 與瑞薩全新整合式安全 IP (RSIP-E51A),並鎖定 PSA Certified Level 3 信任根元件認證,能為開發人員提供低接觸的防竄改功能,進而為各個產業產品不可或缺的複雜應用提供安全保護。」

除了來自 Arm 架構與瑞薩電子安全 IP 帶來諸多有關效能與安全性的強化技術,RA8 系列也是首款導入 PACBTI 安全性延伸指令集、且基於 Cortex-M 架構開發的晶片。

本文將帶你深入了解在不更改軟體任何一行程式碼的前提下,軟體開發人員如何運用 PAC 與 BTI 以減少安全性漏洞,讓它們成為保障其應用安全性的重要工具。隨著 PAC 與 BTI 技術已被導入到廣泛的 Arm IP 產品中,而 Arm IP 已涵蓋從感測器到超級電腦等不同的技術市場,這讓這兩項技術對整個生態系在安全性方面發揮了至關重要的作用。


首先,與記憶體損壞相關的常見風險為何?

在程式運行中,破壞的指標可以把程式執行導到軟體的其它部分,如 Gadget。指令序列是軟體中可以被攻擊者利用的部分函式,目的是要破壞裝置或系統。這些函式可以讀取任意檔案或記憶體位置、開啟 socket、衍生另一個程序,或升級權限。攻擊者可以結合這些函式以重新使用既有的軟體來執行惡意的攻擊。我們幾乎可以在所有的程式或函式庫中找到 Gadget。有心者常把它們當成踏板,好讓來自遠端的更複雜的攻擊,可以堂而皇之地入侵機器。


什麼是返回導向與跳轉導向編程?他們與指令序列有何關聯?

返回導向(ROP)與跳轉導向(JOP)編程,是利用記憶體損害,把程式的執行重新導至可用的指令序列的兩種攻擊技倆。ROP 攻擊會對軟體堆疊進行掃描,以搜尋可串接成新程式的指令序列。另一方面,JOP 攻擊則鎖定以其它形式之間接(絕對)分支結束的程序,例如函式指標或 case 敘述,而攻擊者可以將之劫持以便把指令序列串聯起來。


PAC 是什麼?它如何針對這些攻擊提供保護?

PAC 是一種防禦機制,透過確認位址在使用前沒有遭到修改,以達成阻礙 ROP 的目的。Arm 指令集架構(ISA)中已新增了新的指令,可將驗證碼插入到 Cortex-A 64 位元與 Cortex-M 32 位元回傳位址中最高位元。它隨後會在使用該位址從函式返回之前,先檢查驗證碼。最終結果是攻擊者無法修改驗證碼或位址,或甚至不能以另一個回傳位址取代堆疊中的回傳位址,原因是這會觸發異常並停止程式的運行,而不是導致任意程式碼的執行。


什麼是 BTI ?

BTI 是一種用來阻礙 JOP 攻擊的防禦機制。BTI 整體的目標是透過把「分支」限制在原先鎖定的位址,以便在不同的分支間提供更堅強的安全保障。這會讓攻擊者更難以操控程式的控制流程。攻擊者可以藉由修改跳轉指標來濫用分支,以達成程式任意執行,並迫使已執行的執行緒跳轉到程式碼的另一個區域(通常是攻擊者想要的指令序列)。BTI 把分支目標的概念加入到 Arm 指令集架構(CISA)中,如此一來,分支來到非分支目標的指令時,就會引起異常。倘若攻擊者想辦法破壞了記憶體,讓分支重新導至無效的區域,整個執行就會中止。


PAC 與 BTI 能提供什麼層級的保護?

透過 PAC 與 BTI 對回傳位址與分支位址增加嚴格控管的能力,可以讓我們大幅降低可用的 ROP 與 JOP 指令序列數量。美國國家安全局(NSA)發現,Linux 發行版倘若運用 PAC 與 BTI,可用的指令序列數量會減少 50 倍(資料來源:github.com/nsa-cyber)。另一方面,據 Arm 進行的研究顯示,在啟動 PAC 與 BTI 之後,glibc(運行Arm Cortex-A CPU)上可用的指令序列數量則減少 97% 以上。

 

PACBTI Infographic

(資料來源:把這些技術運用到真實的程式碼

 

如何使用 PAC 與 BTI ?

Arm 最近的架構(包括最新的 Armv9 架構)都加入了 PAC 與 BTI 指令,成為 Arm ISA 的一部份。當我們在編譯程式碼時,這些指令會自動加入二進制程式碼,因此不會變成可用的指令序列合集。開發人員只需在指令建置中啟動安全性保護即可。


哪些處理器支援 PAC 與 BTI 指令?

所有的 Armv9-A CPU 都已將 PAC 與 BTI 內建至處理器中,並且會固定進行安全性與功能的更新與改善。例如,在最新 Armv9 架構的 Cortex-A CPU 中,Arm 在為所有的 Armv9 CPU 設計啟動此一安全性功能時,就導入了全新的 QARMA3 PAC 演算法以提升效能。至於 Cortex-M 處理器系列中 Cortex-M85 亦支援 PAC 與 BTI 指令。


Cortex-A 與 Cortex-M 上的 PAC 與 BTI,又有何不同?

運行在 Cortex-A 上的作業系統與應用程式是龐大生態系的一環,當我們把 PAC 與 BTI 等安全性功能部署至所有二進制程式碼時,必須特別留意。光是以正確的選項全部進行重新編譯是不夠的,我們還要考量下列各點:

  • 作業系統必需包含這些功能的支援,以及;
  • 當我們混合人工撰寫的組合程式與支援 BTI 的程式碼時,必須格外小心。

搭載 Cortex-M 處理器的裝置問題往往會比較少,原因是韌體經常是從頭開始進行編譯,這會更易於產出符合 PAC 與 BTI 指令的軟體堆疊。最新的 Cortex-M 處理器在效能方面,已經縮小其與應用 CPU 之間的差距。因此,也難怪它獲得的關注與 CPU 相關的威脅不相上下。


些編譯器支援 PAC 與 BTI 指令?

LLVM 是一套編譯器與工具鏈技術,自 2018 年發行的第八版起,便在各個 Cortex-A CPU 的設計上支援對 PAC 與 BTI。同時,GCC 是 GNU 專案為了支援各種程式語言而產出最佳化編譯器,自 2022 年 7 月起就在 Cortex-A CPU 的設計上支援 PAC 與 BTI(use -mbranch-protection=standard)。GCC 13.1 版則在 2023 年 4 月為 Cortex-M85 處理器新增對 PAC 與 BTI 的支援。至於 Cortex-M 運算平台,Arm Compiler 6 (AC6) 支援 PACBTI 指令,而 IAR Embedded Workbench for Arm 則為 Arm Cortex-M85 提供對 PACBTI 的支援。更多有關 PAC 與 BTI 的硬體支援細節,請參考這篇部落格


哪些程式語言支援 PAC 與 BTI ?

理論上來說,任何具備 LLVM 或 GCC 後端的編譯語言都可獲得支援,但仍取決於編譯器連接到其基礎設施的位置。這兩種編譯器套件都包含了對 PAC 與 BTI 的 C 與 C++ 支援。Rust 與 Go 等程式語言則已將 PAC 與 BTI 作為實驗性功能提供支援。更多有關 Rust 對 PAC 與 BTI 提供的實驗性支援資訊,請參考這裡


是否已有運用 PAC 與 BTI 指令的實際專案?

Google 的 Chromium 專案與 Javascript V8 引擎目前已經針對 Arm64 進行發布,內含 PAC 與 BTI 的指令編譯。像 Debian 與 RedHat 等一些 Linux 發行版,則已經部署相容的二進制程式碼,以支援 PAC 與BTI。與此同時,其它的專案接下來發行新版本時,也都考慮增添這兩項安全性功能。例如,德國的 SuSE 公司的 Tumbleweed 專案就會支援 PAC、BTI 與其它 Arm 特定的功能。請點擊以下連結以獲取更多資訊。


若同樣的程式碼必須在較舊款的處理器上運行該怎麽辦?

PAC 與 BTI 指令(PAC、PACBTI、AUT)屬於 NOP(無操作)領域。對於無法識別出 NOP 指令的較舊款處理器,PAC 與 BTI 指令還是可以運作,但無法獲得安全性的效益。


PAC 與 BTI 對效能與程式碼的大小會帶來何種衝擊?

瑞薩電子已在Cortex-M85 RA8D1上跑出一些標準的基準測量值。

編譯器:Arm Compiler 6.20 with -mbranch-protection=standard

Coremark
  無 PacBTI 有 PacBTI
編譯器 
最佳化水準
程式碼大小
(bytes)
效能 (coremark/Mhz) 程式碼大小
(bytes)
效能 (coremark/Mhz)
Os 27568 4.143 31824 3.860
Ofast 37160 5.496 40900 5.236
Omax 37848 6.194 40756 6.133

 

AudioMark
  無 PacBTI 有 PacBTI
編譯器 
最佳化水準
程式碼大小
(bytes)
效能 (audiomark/Mhz) 程式碼大小
(bytes)
效能 (audiomark/Mhz)
Os 70616 3.874 77072 3.923
Ofast 88472 3.835 94440 3.887
Omax 86456 3.864 90376 3.859

 

EEBMC 消費者 CJPEG (壓縮器)
  無 PacBTI 有 PacBTI
編譯器 
最佳化水準
程式碼大小
(bytes)
效能
(迭代/秒)
程式碼大小
(bytes)
效能
(迭代/秒)
Os 44670 49.23 51016 48.94
Ofast 63942 50.4 69984 50.15
Omax 69438 61.35 74160 61.72

一如預期,PAC 會影響到函式調用,原因是與指標驗證出現的時間點衝突。對於多數時間用在數位訊號處理(DSP)或矩陣運算的運算密集韌體,影響則是相當小。效能方面幾乎沒影響,利用最佳化編譯器能獲得與增加程式碼相似的結果,進而減緩對效能的影響。


以 Arm 技術建構安全且安心的數位體驗

Arm 不斷推出更多內建的安全性功能,以消除攻擊者從遠端或本地攻擊裝置漏洞的方式,不論這些裝置是在資料中心、消費科技產品,或是嵌入式產品。透過 PAC 與 BTI 指令取得對抗 ROP 與 JOP 型態攻擊的內建防護,讓既有的程式碼更加安全且穩固。由於 Armv8 與 Armv9 架構已普遍應用在 Arm 生態系中,PAC 與 BTI 將可大規模地提供安全性的效益,推動以 Arm 技術持續鞏固全球的數位安全性。

關於 Arm

Arm 是業界效能最高且最節能的運算平台,其無可比擬的應用範疇觸及全球所有連網使用者。為因應全球對運算永無止境的需求,Arm 提供先進的解決方案,使全球領先的科技公司得以釋放前所未有的 AI 體驗與功能。透過與全球最大的運算生態系及 2,000 萬名軟體開發人員的共同努力,我們正在 Arm 平台上建構 AI 的未來。


所有資訊都「依目前情況」提供,且並不帶保證或代表性。此文件可以自由分享,但不得修改且必須註明出處。Arm 是 Arm Limited(或其子公司與附屬機構)的註冊商標。所有品牌或產品名稱均為所屬公司之財產。© 1995-2024 Arm Limited.