以字之名: 藏於暗處的伏擊
你知道字體業能作為駭客攻擊的武器嗎?這其實不難理解「駭客攻擊」本質上就是透過非正規手段,破壞、竊取資訊,而手段可以非常多元,今天的案例就是以字體文件為載體。
伏擊的載體:Multi-Master Type 1
在 2020 年,一個被編號為 CVE-2020-0938 的漏洞, 它藏在 Windows 的 Adobe Type Manager (ATM) 元件內裡,這是個用來解析 Adobe Type 1 字型的元件。
它處理的的並不是我們日常熟悉的 .ttf、.oft 而是一個更古老的技術:Multi-Master Type 1,該檔案被拆分成 .pfb、.pfm 兩部分(The Final Reckoning 既視感 xD),需要同時擁有才可正確顯示。
簡單介紹 Multi-Master,簡單來說就是「可變字型」的雛形,讓設計師能在細與粗、窄與寬之間插值,生成無限可能。然而超前部署(以當時帶來說)的技術,卻也為惡意者留下了縫隙。
目前該技術也要棄用,不過在 Windows 10 上還是有相關套件。

所以破口在哪?
漏洞的關鍵在於一個參數「num_master」。 它用來記錄字型中有多少個母版。當時設計人員預設,這個數字應該在合理範圍內不超過 15 個,因此導致一旦超出就會出現錯誤,加上又沒有完善的錯誤處理機制。
ATM 開了一塊固定大小的記憶體陣列,預期 num_master ≤ 15,然而攻擊者可以在字型檔裡寫個 50、100,只要超過就會錯誤。
資料一筆筆寫進去,超出邊界,往上覆蓋堆疊上的其他數據,最後連 return address 也被覆寫。

當函式執行 return,程式流程就不再回到應有的位置,而是跳到攻擊者指定的地址,並執行惡意程式碼。
攻擊場景:你我的日常
該漏洞有個最危險的地方,因為該字型格式主要用於印刷場景,因此可以夾帶在 PDF、CorelDRAW......等常見排印軟體文件中。甚至 Windows Explorer 的預覽窗格,單純瀏覽資料夾,就可能觸發解析。
如何防禦
對於開發設計面——「靈芝的好壞在多醣體,程式的好壞在錯誤處理」,所有功能要預想到可能錯誤情況事先加以應對,當然如果用 Python、Ruby、Rust(非戰鬥人員迅速撤離)...等程式語言,也可避免掉部分記憶體指針問題。
使用者面——首先不下載、開啟、使用來路不明的檔案、字體文件,這是最重要的。如果必要,要使用虛擬環境開啟,或是尋求 IT 部門人員協助。以及定期更新系統。
漏洞現況現況
微軟在 2020 年 4 月的「Patch Tuesday」資安更新包,已提出修復方式。 在此之前,官方建議用戶暫時停用 ATMFD.DLL 相關套件。
不過根據網路上的資料,沒有查到有大規模攻擊事件。目前的 Windows 11 也已經移除相關套件,但是部分 win32 API 還是有顯示支援 .pfb、.pfm 文件,尚未確定在 windows 11 中會有何影響。
相關連結
CVE-2020-0938 Detail終止支援 PostScript Type 1 字體
Multiple Master Type 1 Font Programs
CVE-2020-0938: Windows Font Driver Type 1 BlendDesignPositions stack corruption
Security Update Guide - Microsoft Security Response Center
此授權條款要求再使用者必須對創作者進行署名。它允許再使用者以任何媒介或格式,出於非商業目的,分享、重混、改編及依原作品進行創作。唯重製後之作