分析 Pawn Storm 的 Java 零時差漏洞 – 故技重施

過去,Java 一向是網路犯罪集團最愛的漏洞攻擊目標,不過近年來,這樣的情況已經不在。最近已修正的 Pawn Storm 攻擊行動 Java 零時差漏洞事實上是 Java 近兩年來被發現的第一個零時差漏洞。

零時差攻擊

這有一部分的原因要歸功於 Java 安全措施的強化。正如 Oracle 在 Java 首頁上所言,現在的主流瀏覽器在遇到過時的 Java 外掛程式時都會自動將它停用。此外,2014 年 1 月發表的Java 7 Update 51即限縮了可執行的 Applet 類型。在預設情況下,自我簽署和未經簽署 (也就是駭客最可能使用) 的 Applet 將無法在瀏覽器上執行。此外,JRE 還對所有的 Applet (不論是否簽署) 提供了點按執行 (click-to-play) 的功能。這兩點加起來,大大得降低了 Java 平台對駭客的吸引力。

既然這個 Java 零時差漏洞 (CVE-2015-2590) 現在已經修正,我們就來說明一下它的相關技術細節。此漏洞由兩部分組成:第一部份是略過 Java 的點按執行保護機制。這部分我們不能討論,但我們可以談談另外一部分。如前面所說,這個漏洞在最新的 Java 版本 (Java 8 Update 51) 當中已經獲得修正。

Java 提供了一個叫做 ObjectInputStream 的類別來執行反序列化 (decentralize) 作業,以便將記憶體緩衝區內的資料轉成物件。這個反序列化緩衝區當中包含了物件的類別資訊和檔案化的資料。如需該類別的更多詳細資訊,請參閱Java 官方文件

此次的漏洞就出現在物件反序列化的方式。駭客利用此漏洞來修改反序列化後物件中的某個欄位,就連私有 (private) 欄位也可以,並且加入其他類別資訊。Java 執行時期環境 (JRE) 允許駭客 (在某些情況下) 從一個串流緩衝區 (stream buffer) 讀取物件的各個欄位,即使該物件或該物件的外層物件的類別型態「不在」序列化的緩衝區中。 下圖顯示此漏洞可能造成的情況:

圖 1:漏洞可能造成的情況。

在圖 1 當中,序列化的物件緩衝區將被反序列化。在過程當中,Object A 可利用一個強制覆蓋 (override) 函式來從中攔截反序列化程序 (例如 readResolve)。駭客可利用此函式傳回序列化緩衝區當中不存在的其他類型物件 (請看圖 1 中的紅字部分),並蓋過原本的私有欄位。在大多數情況下,JRE 可偵測這種情形並發出例外錯誤 (exception)。但是,如果 A 物件的外圍物件經過特製並超載 (overload) 了 readObject 函式來發出「找不到類別」(Class Not Found) 的例外錯誤,就可以觸發這個漏洞。簡而言之,該漏洞會讓駭客直接修改反序列化物件的私有欄位,並將它換成串流緩衝區內沒有的物件類型。

攻擊如何進行?

首先,駭客會先特製一個序列化緩衝區,裡面含有一個 AtomicReferenceArray 物件。在攻擊這個漏洞之後,一個 AtomicReferenceArray 類別物件的私有陣列欄位會指向一個 Help 類型物件陣列。在這一步驟完成之後,記憶體內容的配置如下:

圖 2:記憶體內容配置。

上圖中,rar 這個變數是一個 AtomicReferenceArray 物件的參照 (reference),該物件會經過反序列化,然後 AtomicReferenceArray 物件的陣列會參照 array 變數。HelpClassLoader 這個類別的子類別。也就是說,array 這個變數掌控了 AtomicReferenceArray 物件的私有欄位 array。

接著,駭客取得一個當前的 ClassLoader 物件。

rar 變數的元素被設成前面取得的 ClassLoader 物件 (駭客使用 0 為索引) 。由於 rar.array 是一個 Helper[] 陣列的參照,因此會修改到真正的array[0] 物件。

此處 array[0] 物件的類型為 Help。在 Help 類別中,駭客可使用 array[0] 來存取 ClassLoader.defineClass 函式。這是一個受保護 (protected) 的函式,若駭客直接使用 ClassLoader 物件在當前類別可見範圍 (class scope) 中呼叫 defineClass 的話,將會產生組譯錯誤。

駭客可利用這種存取方式來定義一個特權類別 (privileged class),並且關閉 SecurityManager。如此一來,駭客就能執行其惡意程式碼。或許有人會問為何駭客不用 AtomicReferenceArray 的公開 API 來取得 array 欄位的內容。這是因為 JRE 會檢查類型的元素與要轉換 (cast) 的目標類型是否相符。

整體上,所有此漏洞必要的攻擊步驟都和之前的其他漏洞攻擊類似,例如多年前的 CVE-2012-0507 即使用了類似的技巧。

由於此漏洞的嚴重性,我們強烈建議使用者將 Java 更新到最新版本。

其他有關 Pawn Storm 攻擊行動的文章還有:

原文出處: Analyzing the Pawn Storm Java Zero-Day – Old Techniques Reused|    作者:Jack Tang (威脅分析師)

《提醒》將滑鼠游標移動到右上方的「已說讚」欄位,勾選「搶先看」選項。建議也可同時選擇接收通知新增到興趣主題清單,最新貼文就會優先顯示在動態消息頂端,讓你不會錯過任何更新。