為什么你的MacsOS EDR解決方案不應該在Rosetta 2下運行
上周,SentinelOne宣布了其v5.0代理的早期可用性,它成為第一個本機支持Apple的新M1(又名Apple芯片或arm64 Macs)體系結構的終端安全代理。與其他MacsOS的EDR/XDR安全解決方案不同,有了本機支持,Sentinel代理無需在Apple的翻譯軟件層(稱為Rosetta 2)下運行。
在這篇文章中,SentinelOne的研究人員解釋了在這個領域中所有熱門術語的含義,從“Rosetta2”和“Apple Silicon”到“arm64 architecture”和“Universal 2”二進制文件,并解釋為什么在Apple Silicon上本機運行安全軟件具有明顯的性能和安全優勢。
去年,蘋果公司宣布將為Macs設備構建自己的CPU,而不是依靠英特爾作為其處理器,這一消息轟動一時。這些新設備于2020年末開始發售,并通過多個代號與Intel Macs進行了區別。
蘋果公司為推銷他們的新設備創造的第一個術語是“Apple silicon”,意思是指基于ARM公司設計的芯片的CPU芯片。蘋果授權基礎設計,并自行設計。很明顯,他們不想把自己的芯片標榜為是ARM芯片,而更愿意用一個獨特的品牌名稱“Apple silicon”來體現其品牌價值。
當然,蘋果公司已經在iOS系統中使用他們自己定制的ARM芯片很多年了,并用“A”和數字說明符來進行編號,比如A10、A11、A12等等(當前版本的iOS系統搭載的是A14芯片)。大概是為了保持這種編號的規定,第一個Macs ARM芯片被編碼為“M1”。隨著蘋果不斷迭代設計,我們希望看到M2和M3等產品。因此,除了被稱為“Apple Silicon Macs,蘋果的第一代非英特爾設備也被稱為“M1 Mac”。
這就有必要是我們研究二進制文件——可執行文件格式,它是蘋果和第三方軟件的基礎,可以在這些新的M1芯片上運行。當然,這些必須有一個與CPU架構兼容的格式。在英特爾設備上,我們有x86_64 Macsh-O可執行文件;對于M1/Apple silicon Macs,本機二進制格式是arm64e Macsh-O。
因此,我們有一個基于ARM的M1/Apple硅處理器架構和運行在上面的arm64二進制文件。這似乎很簡單,但有一個問題:過去15年或更長時間里為英特爾Macs電腦編寫的所有軟件呢?不要忽視這樣一個事實:至少在未來的兩年內,蘋果仍在銷售和生產帶有英特爾芯片的Macs電腦。同時擁有兩個完全不兼容的軟件目錄的兩個硬件產品線是站不住腳的。蘋果需要找到一種方法,讓在英特爾設備上構建的軟件能夠在新的M1設備上運行。
輸入Rosetta 2和通用文件格式。
英特爾、ARM和對翻譯軟件的需求
Rosetta這個名字源于著名的“Rosetta Stone”,正是這塊石碑讓我們得以將埃及象形文字翻譯成現代語言。蘋果原始的Rosetta軟件實際上幫助公司在2000年代中期將早期的架構PowerPC轉化為英特爾。
由于 M1 芯片底層架構和過去不同,由此帶來的應用生態兼容性問題是首先需要解決的,為此蘋果也開啟了為期兩年的 Mac 過渡計劃。具體來說,蘋果借助的是 macOS 11 Big Sur 系統以及其內置的 Universal 2、Rosetta 2 和 Virtualizaion 三種技術來解決問題。不過話雖如此,可能還是會有小伙伴會比較猶豫,這些措施真的可以解決 M1 芯片 Mac 的軟件兼容性問題嗎?特別是原來在 x86 架構上的應用,開發者還沒有及時做適配,能在 Mac 上很好地運行嗎?
對于這個問題,其實蘋果已經給出了專門的解決方案,就是 Rosetta 2。
Rosetta 2 是內置在 macOS 11 Big Sur 系統里的,在幕后工作,只有當你第一次下載一款 x86 應用,第一次打開時,才會提示你安裝 Rosetta 2。
換句話說,Rosetta 2 的存在完全不會對你過去一直以來使用 Mac 的習慣造成影響,它幾乎是無感的,悄悄做著翻譯工作。
想要知道你使用的 App 到底是原生在 Mac 上運行的,還是經過 Rosetta 2“翻譯”之后的,只要在 “應用程序”文件夾中找到這個應用的圖標,右鍵打開菜單欄里的 “顯示簡介”,如果應用種類后面有一個 “Intel”,說明這個應用就是 x86 版本經過 Rosetta 2 翻譯的。
基于這樣的機制,Rosetta 2 能夠幫助 x86 架構的應用在 M1 芯片的 Mac 上保持流暢快速的響應,從而獲得很好的使用體驗。
當然,Rosetta 2 做翻譯的方案畢竟只是權宜之計,不會一直存在,只是在開發者們將自己的應用全面轉到 M1 芯片原生狀態之前扮演過渡的作用。
當時,Rosetta的研發者使用了一種通用的文件格式,它是一種“FAT”二進制文件,其中包含PowerPC和Intel二進制文件。無論CPU是PowerPC還是Intel,操作系統都從FAT通用二進制文件中提取正確的文件,并在CPU上本機運行它。但是,如果Intel CPU遇到只有PowerPC二進制文件的軟件,它將執行Rosetta轉換器,并將PowerPC二進制文件傳遞給Rosetta執行。
對于M1 Mac,蘋果采取了類似的方法:開發者(比如SentinelOne)使用Universal 2二進制格式在一個版本中發布他們軟件的Intel和arm64版本。使用Universal 2二進制格式,操作系統會檢查它運行在哪個體系結構上,并自動選擇適當的arm64(適用于M1 Mac)或Intel(適用于x86_64)片來執行。然而,如果M1 Mac遇到尚未進行本機轉換的開發人員提交的Intel二進制文件,它就會將二進制文件傳遞給Rosetta 2轉換機制來處理。
按著蘋果公司的說法,整個過程對用戶來說應該是“透明的”,在這里“透明”的意思是“不可見的”,而不是“明顯的”。然而,Rosetta 2的工作方式與原始的Rosetta并不完全相同,這對性能和安全都有影響,用戶應該注意這一點。
新的體系結構意味著終端安全性面臨新的挑戰
原始的Rosetta和Rosetta 2的主要區別在于進行翻譯的時間。對于Rosetta 2,蘋果希望避免在原始Rosetta機制下影響一些嚴重消耗資源的軟件的性能問題,比如Adobe CS2。
最初的Rosetta的問題在于,每次運行該軟件時都會翻譯該軟件,從而在每次啟動時都反復給CPU造成負擔。 Apple采用Rosetta 2的方法是,通過在軟件首次啟動時進行“提前”(AOT)翻譯并將該翻譯保存以供將來發布,來盡可能地避免這種情況。
雖然這是一種改進仿真軟件性能的好方法,但也有缺點,特別是從安全軟件的角度來看。
相對于翻譯后的代碼,本機arm64代碼至少具有兩個性能優勢,而翻譯后的代碼與大型,復雜的程序(例如EDR產品)特別相關。
我們上面提到的Ahead-of-Time轉換是通過名為oahd_helper的幫助程序進行的。該程序負責在首次運行x86_64二進制文件時創建轉換后的AOT二進制文件。要翻譯的x86_64代碼的大小越大,啟動時間越長。當需要oahd_helper轉換非常大的Intel可執行文件時,這又會導致設備上的內存和CPU占用過多。
其次,對于需要在運行時解析的復雜程序代碼的某些部分,無法進行完整的AOT轉換。由于局部環境變量和條件的原因,有時直到運行時才能確定需要運行什么代碼。雖然理論上開發人員可以提前編譯所有可能的代碼分支,但這既效率低下又容易出錯。必要時確定運行什么代碼并即時進行編譯(即時編譯或JIT編譯)的效率和防錯性要高得多。
在其他條件相同的情況下,當你在本機處理器上運行本機代碼時,JIT編譯是沒問題的,但當代碼必須通過Rosetta進行翻譯時,這意味著盡管使用了AOT編譯,但仍然需要進行一些即時編譯。當這種情況發生時,內核將控制權轉移給一個特殊的Rosetta翻譯存根,由它來處理這項工作。簡而言之,任何足夠復雜的程序(如EDR解決方案)都需要通過Rosetta實時翻譯至少一部分Intel代碼,而與運行本機arm64代碼的安全解決方案相比,這種翻譯將導致性能損耗。
蘋果也在自己的官方文件中也提到了這一事實:
“翻譯過程需要時間,所以用戶可能會認為翻譯后的應用程序有時會啟動或運行得更慢。”
通過設計,本機M1軟件更安全
但是性能并不是唯一需要擔心的事情。更重要的是,本機M1代碼比通過Rosetta翻譯運行英特爾代碼更安全。這是因為macOS Big Sur(acOS Big Sur是蘋果公司研發的桌面端操作系統,于北京時間2020年6月23日在2020蘋果全球開發者大會上發布,該操作系統適用于一部分Mac電腦。)帶來的變化之一只適用于Apple silicon Macs,即本機arm64代碼不能在M1 Mac上執行,除非它有有效的代碼簽名。
除非附加了有效的簽名,否則Apple Silicon Mac在任何情況下都不允許執行本機arm64代碼。但是,翻譯后的x86_64代碼不受此限制:翻譯后的x86_64代碼完全可以通過Rosetta執行,而沒有任何簽名信息。
你可以在M1 Mac上用一個簡單的“hello world”程序輕松驗證這一點。如果首先將下面的程序編譯為arm64e,請注意操作系統在嘗試執行時是如何阻止它的,但是一旦我們重新編譯了與x86_64可執行文件相同的源文件,就可以在沒有代碼簽名且沒有代碼的情況下運行hello.out:
這就允許了軟件篡改的可能性,即通過Rosetta(Rosetta)翻譯僅以英特爾二進制代碼運行的軟件,其代碼簽名可能被刪除,代碼被修改,程序在沒有有效開發者代碼簽名的情況下通過Rosetta(Rosetta)執行。
盡管嘗試進行此類攻擊的攻擊者還有其他障礙需要清除,但仍然存在這樣的情況:在M1 Mac上,本機arm64代碼比翻譯后的Intel代碼在本質上更安全,因為后者無需進行任何代碼簽名檢查就可以運行。
這自然就引出了一個問題:Rosetta本身是否可以用作攻擊媒介。盡管所有組件都通過系統完整性保護進行了鎖定,但Rosetta是一個多方面且復雜的機制,由許多聯鎖部件組成,每個部件都有潛在的攻擊面。
在Rosetta的某些部件上,研究人員已經完成了一些初始的、出色的逆向工程,但關于這個轉換層還有很多需要了解的地方,研究仍在進行中。
總結
毫無疑問,蘋果在Rosetta 2上比原始Rosetta有了長足的進步,這也許可以解釋為什么某些軟件開發人員尚未進行過渡,也許還不了解本機M1支持的優勢。其他開發人員可能更愿意讓他們的解決方案在Rosetta下運行,以利用他們尚未或無法轉換為ARM的舊式Intel模塊的優勢。
但是,如上所述,出于性能和安全方面的考慮,在Apple芯片上本機運行安全軟件的好處顯而易見。就像在其他地方,蘋果可能會在某些地方禁用Rosetta 2,而不會引起人們的注意。最后,同樣不可避免的是,正如最初的Rosetta在蘋果最終完全從Intel的PowerPC架構過渡過來之后的幾年就停產了,蘋果最終將放棄對Apple silicon平臺上的翻譯軟件的支持。
本文翻譯自:
https://www.sentinelone.com/blog/why-your-macos-edr-solution-shouldnt-be-running-under-rosetta-2/