一款名為 Fast16 的網路武器,在長達 21 年的時間裡完全不為人知。它不破壞機器或炸毀事物,而是破壞了數學計算。進行核能和工程模擬的科學家們得到的輸出結果看似完全正常,每一個數字都加對了,每一個結果都說得通,但實際上所有結果都是故意錯誤的。它於上週浮出水面。它的出現比 Stuxnet 早了五年。

SentinelOne 的研究人員 Vitaly Kamluk 和 Juan Andrés Guerrero-Saade 上週在 Black Hat Asia 大會上發表了 Fast16 的完整分析。Fast16 的核心二進位檔案的編譯時間戳記是 2005 年 8 月 30 日。而 Stuxnet 的 C&C 基礎設施則是在同年 11 月建立的。

安全領域的大多數人都知道 Stuxnet,它是一隻大約在 2010 年摧毀了伊朗納坦茲核設施離心機的蠕蟲,透過將離心機推向機械極限,同時欺騙監控軟體,使其對實際情況一無所知。它是已知第一個旨在造成物理破壞的網路武器,多年來一直被認為是這個時代的起點。Fast16 早於它出現,並且在很長一段時間裡是唯一的。

Kamluk 的研究始於一個直覺。他注意到他所知的最複雜的國家級惡意軟體家族都具有一個共同的技術特徵:每個都內建了一個名為 Lua 的小型腳本引擎。Lua 就像惡意軟體的遙控器,它允許操作員在植入程式已經在目標機器上運行時更改其功能,而無需發送全新的檔案。他想知道是否有更早的惡意軟體首先做了同樣的事情,於是開始搜尋舊的檔案集合。

他在 VirusTotal 上發現了一個名為 svcmgmt.exe 的檔案,於 2016 年 10 月上傳,幾乎沒有被標記。它看起來像一個過時的 Windows 服務包裝器。但其內部嵌入了一個 Lua 5.0 虛擬機、加密的位元組碼,以及一個指向名為 fast16.sys 的核心驅動程式的路徑。這使得 Fast16 成為已知最早嵌入 Lua 引擎的 Windows 惡意軟體,比下一個已知範例早了整整三年。

還有另一件事證實了時間線。Fast16 只能在單核心處理器上運行,這是在大多數機器仍運行單核心且多核心剛開始進入市場的時代所開發的。

該框架分三層運行。最外層是 svcmgmt.exe,一個載體,其行為取決於啟動方式。傳遞 -p 參數時,它會在網路中傳播。傳遞 -i 參數時,它會將自己安裝為 Windows 服務並運行嵌入的載荷。傳遞 -r 參數時,它會在不安裝的情況下運行載荷。載體內部以加密形式儲存了三樣東西:處理操作邏輯的 Lua 位元組碼、一個鉤取 Windows 撥號和 VPN 連線系統的 DLL,以及 fast16.sys 本身。這個 DLL 值得仔細研究。每當機器連線到遠端網路時,它就會將連線詳細資訊寫入一個命名管道,操作員可以讀取。因此,當 fast16.sys 在磁碟上破壞計算時,DLL 會悄悄地映射出哪些機器連線到哪些網路,為操作員提供設施內部結構的即時畫面。

這個外層載體有趣之處在於它的傳播方式。該機制就像一輛帶有多個隔間的貨車。每個隔間稱為 wormlet,可以攜帶不同的載荷以達到不同的目的。載體透過驗證較弱的網路共用複製自身,並在它到達的每台機器上啟動為服務。SentinelOne 將此稱為集束彈藥架構。在恢復的樣本中,只有一個隔間被填滿。其他隔間是空的,這引發了一個顯而易見的問題:是否存在其他沒有被發現的、具有不同載荷的變體。

在任何程式碼運行之前,它都會檢查登錄檔中的安全軟體。如果它發現 Kaspersky、Symantec、McAfee、F-Secure、Zone Labs 或其他十幾種在 2000 年代中期常見的產品,它會立即停止。這個列表並非隨意猜測,它精確反映了操作員預期在他們目標機器上找到的軟體。

第二層是蠕蟲,它使用標準的 Windows 服務控制和檔案共用 API 進行傳播,沒有客製化。它依賴於網路共用上的弱密碼或預設管理員密碼在機器之間移動,這在 2005 年的許多內部網路中是一個實際的假設。

第三層是 fast16.sys,這也是破壞實際發生的地方。核心驅動程式位於作業系統非常深層的位置,低於防毒軟體通常的掃描範圍。Fast16.sys 在開機時載入,並將自己定位在機器的所有儲存層之上:NTFS、FAT、網路檔案系統。它載入後做的第一件事是禁用 Windows Prefetcher,這是一個通常快取常用檔案以加快速度的系統。關閉 Prefetcher 後,每一次檔案讀取都必須經過完整的儲存堆疊,並通過驅動程式。所有從磁碟讀取的內容都會先經過它。然後它就等待著。直到有人登入並啟動桌面,什麼都不會發生。只有到那時,它才會開始監控每一個被打開的可執行檔。

該驅動程式不會針對它看到的每一個檔案。它正在尋找使用特定工具編譯的軟體:Intel C++ 編譯器會在它產生的每個可執行檔的最後一個區段標頭之後留下一個小的識別字串。開發人員確切地知道他們的目標使用了什麼編譯器,並圍繞這個指紋構建了選擇邏輯。

對於每一個匹配的檔案,驅動程式會在檔案從磁碟讀取時,攔截記憶體中的浮點運算例程。浮點運算是在精確模擬背後的數學計算,例如告訴你橋樑設計在負載下是否能承受,或者爆炸觸發器是否會在正確的時間引爆。

驅動程式使用 101 個模式匹配規則來修補這些例程,注入一段 FPU 指令,悄悄地改變內部計算陣列中的值,然後讓檔案像什麼都沒發生一樣載入。磁碟上的原始程式碼保持不變。軟體正常運行。結果是錯誤的。

將這 101 個規則應用於那個時代的軟體,指向了三個具體目標。

第一個是 LS-DYNA 970,一個用於模擬爆炸、結構失效和高速撞擊的模擬套件。國際科學與國際安全研究所於 2024 年 9 月發表的一篇評論,引用了 157 篇學術論文,顯示伊朗研究人員在與核武器開發相關的工作中使用了 LS-DYNA,特別是模擬引發彈頭爆炸的爆炸觸發器。如果 Fast16 在這些機器上運行,科學家們將無法得知他們的結果是錯誤的。基於這些數字的每一個設計決策,都建立在錯誤的輸出之上。

第二個目標是 PKPM,這是大多數報導完全忽略的部分。PKPM 是中國主要的結構工程軟體,由清華大學和中國建築科學研究院開發,並在中國建築項目中使用了三十多年。它之所以不僅僅是一個標準的土木工程工具,是因為 PKPM 也用於核反應爐設施的抗震結構分析。2024 年發表在《Advances in Civil Engineering》上的一篇論文記錄了 PKPM 在模擬中國 TMSR-LF1 熔鹽反應器在地震條件下的結構行為的應用。SentinelOne 無法確認 PKPM 的目標是誰,也無法確認 Fast16 在何處運行。這是否針對第二個目標國家,仍是一個懸而未決的問題。

第三個是 MOHID,一個在里斯本高等技術學院開發的開源水體建模平台。它用於模擬沿海水體系統、沉積物運輸、水壩行為以及大型水利工程項目對環境的影響。SentinelOne 公開表示,他們無法確定對該軟體的預期破壞效果是什麼,並正在尋求研究界的幫助。它為何被鎖定目標,可能仍存在於一個尚未被發現的樣本中。

NSA 的關聯來自於 ShadowBrokers 洩漏的一份清單。2017 年 4 月,ShadowBrokers 發布了一大批被廣泛認為來自 NSA 的 Equation Group 的材料。其中有一個名為 drv_list.txt 的檔案,基本上是給操作員的「請勿觸碰」清單。當一個團隊登陸目標機器並發現清單上的驅動程式時,它會告訴他們該驅動程式是否屬於友方操作,以及他們是否應該避開它。這是一個確保不同團隊不會意外干擾彼此工作的系統。

清單上的大多數條目都標有「謹慎」或「撤退」的提示。Fast16 則得到了不同的標記:

這是一位操作員告訴另一位:如果你發現這個驅動程式,請勿觸碰,它是我們的。CrySyS Lab 的研究人員在 2018 年分析 ShadowBrokers 的轉儲時注意到了這個條目,但當時沒有樣本可以對應。八年後,終於有了。

ShadowBrokers 的材料廣泛與 NSA 的 Equation Group 聯繫在一起,儘管與所有情報洩漏一樣,從外部無法獲得全貌。

程式碼中還有另一件事引人注目。原始檔案包含來自 1970 年代和 1980 年代 Unix 開發環境的版本控制標記,遠在 Windows 出現之前。它們看起來像這樣:

這種被稱為 SCCS/RCS 的標記,相當於在現代辦公室裡發現一部轉盤電話。在 2005 年的 Windows 核心程式碼中,沒有人會使用它,除非他們的程式設計背景可以追溯到幾十年前,追溯到一個完全不同的時代的政府和軍事計算環境。這不是週末駭客或自由職業者。這是一個由在非常特定地方度過職業生涯的人們建立的長期運行的機構計畫。

讓這一切更糟的是其偵測記錄。Svcmgmt.exe 於 2016 年 10 月上傳到 VirusTotal,並在那裡存放了近十年,完全公開。大約七十個防毒引擎中,只有一個將其標記為普遍惡意,而且標記很弱。一個能夠自我傳播的載體,部署了一個具有記憶體中浮點修補引擎的開機級核心驅動程式,在公共資料庫中存放了九年,幾乎對所有掃描器都隱形。

在其分析過程中,Kamluk 使用 Claude 協助分析 Fast16 並撰寫研究報告。有一次,AI 反覆無法完成他要求它撰寫的報告。當他詢問原因時,Claude 產生了自我批評的段落,敦促自己完成任務。最終它完成了,並得出結論:Fast16 的開發者對目標軟體有深入的了解,工業破壞是最有可能的意圖。一個 21 年前的惡意軟體讓現代 AI 陷入沉思,反思自身的局限性。

如果您使用較舊的模擬軟體,特別是 2000 年代中期較舊版本的 LS-DYNA 或 PKPM,SentinelOne 已經直接通知了供應商。建議的措施是使用一個完全獨立於任何可能受影響網路的系統來驗證關鍵計算輸出。如果 Fast16 傳播到整個設施並修補了所有工作站,在同一網路內進行的比較計算將產生相同的錯誤輸出。而完全在該環境之外的機器則不會。

SentinelOne 在其研究論文中發布了用於追蹤載體和驅動程式的完整 YARA 規則。

如果如此複雜的東西能夠隱藏 21 年不被發現,在 VirusTotal 上存放了近十年,而幾乎沒有防毒引擎注意到它,那麼現在還有多少類似的收藏品正在等待有人提出不同的問題?可能比任何人想知道的都多。

Fast16 將自己安裝為 Windows 服務,透過網路共用傳播,作為核心驅動程式運行,並在工作時完全隱藏。其背後的概念,如漏洞利用、後滲透、持久性、權限提升以及在不被注意的情況下在網路中移動,正是我道德駭客課程逐步涵蓋的內容: