2007-09-17

多核心 CPU 之攻擊

Attacking multicore CPUs
http://www.theregister.co.uk/2007/09/14/system_call_sploits/

By Federico Biancuzzi
Published Friday 14th September 2007

我們剛剛才跨入的多核心 CPU 世界,正面臨一項嚴重威脅。

劍橋的安全研究者揭露新一類型弱點,利用同時性(concurrency)繞過安全保護,例如:防毒軟體。

這種攻擊是基於以下假設:與核心互動的軟體可在不受干擾下使用。研究者,Robert Watson 證實,一個謹慎撰寫的 exploit 可以在這種情況發生時的一小段時間內(timeframe)進行攻擊,並逐字改變它們正在交換的「文字(word)」。

即便「同時性」的某些黑暗面已被了解,但 Watson 證明可以開發出真正的攻擊,並證實開發者得要修補他們程式碼。盡快。

Watson 在 WOOT07(http://www.usenix.org/events/woot07/),USENIX Workshop on Offense Technology,發表他的研究,將其研究結果題為「Exploiting Concurrency Vulnerabilities in System Call Wrappers」(http://www.watson.org/~robert/2007woot/)。

在這場講演中,他展示「同時性」如何能被用來繞過由 syscall wrappers 所加諸的安全保護。

系統呼叫(system call),簡稱為 syscall,是核心當中的基本函式(function),可以被一個程式呼叫。例如,當你開啟一個檔案時,你所使用的軟體很有可能正在呼叫 open() 的 syscall 以開啟它。

sycall wrapper 介於核心與程式之間,可以分析有哪些 sycalls 被呼叫,以及它們的引數(arguments)為何。一個安全 wrapper 或許能被設定用來阻擋某些檔案的存取,故在前例中要以 open() 開啟 secrets.txt,它就會阻止這項操作,並回傳錯誤給應用程式。

以下請 Watson 詳細介紹...


攻擊如何進行?

System call wrapping 是一種廣泛使用的技術,用來拓展核心的安全性,可在防毒軟體系統與安全政策加強框架,例如我在論文中提及的 GSWTK(http://freshmeat.net/projects/gswtk/)、Systrace(http://www.systrace.org/)、CerbNG(http://cerber.sourceforge.net/)等系統上發現。System call interposition(系統呼叫介入)讓程式碼在核心位址空間中執行,以 "包裹(warp)" 系統呼叫,增加新的安全檢查,將引數值替換成虛擬的名稱空間,或為了記錄(logging)、入侵偵測(ID)等目的來審核引數。它是一種相當有彈性的技術,而且讓軟體開發者相當動心,因為它無須改變現存的核心程式碼,而能在完整了解的系統呼叫界面上進行控制。

這種攻擊以 system call wraper 架構中的一項弱點為目標,在其中,系統呼叫引數分別被 system call wrapper 與核心拷貝,讓攻擊者能夠在拷貝之間「競逐(race)」引數值的替換。

我能在攻擊程序(process)與 wrapper/核心之間,藉由創造未經管理的同時性(unmanaged concurrency),成功地繞過許多 system call wraper。這在單處理器或多處理器系統當中都有可能辦到。

某些弱點的存在已被察覺多年(Ghormley 1998, Garfinkel 2003, Watson 2003),而我早在 2002 年就曾接觸許多位 wrapper 系統的作者,回報這些問題。

這篇論文的貢獻在於藉由探索攻擊空間(我確認二種先前未曾討論過的競逐條件 [race conditions],其中一種有更廣泛的應用),來分析弱點的類型(class),並探索 exploit 策略,讓我們能夠推論這種攻擊方法的效用。而結果證明這是一種相當有效的方法。

這篇論文(PDF 檔,http://www.watson.org/~robert/2007woot/2007usenixwoot-exploitingconcurrency.pdf)同時提供一般類型之同時性弱點的詳盡討論,以及對這些特定弱點的更具體討論。我特別會向讀者提起在這份投影片(PDF 檔,http://www.watson.org/~robert/2007woot/20070806-woot-concurrency.pdf)當中的圖片與程式碼,那與我所要講的有關,或許能讓攻擊方式與這種 exploits 的簡單明瞭更加清楚。在不到 20 行的 C 語言程式碼,而且只使用標準 OS 呼叫進行記憶體存取與管理,wrapper 的保護完全被攻克。


成功需要什麼條件?

當我開始進行這項計畫,我確定這些弱點能輕易在多處理器系統上 exploite,不過並不知延伸到單處理器系統上是否能夠成功。我也不確定軟體的需求 -- 是否需要 thread 等等。結果證明,這些攻擊具有廣泛用途,能在沒有 threading 的單處理器 OS 上成功。攻擊者要能夠在 system call wrapper 所建構的 local process 中執行程式碼,藉此攻擊者比較能夠輕易進行規避。

在多處理器系統上,我們以 cycles 測量 race window 的大小,而我發現競逐的寬度在每個 wrapper 系統中都大不相同。我大部分在觀察 wrapper systems 時都只看核心,所以 30,000 cycles 或許是個不尋常的長度。然而,Systrace 在使用者空間中表現出控制,因為內容交換,導致 500,000 cycles 或更長的競逐條件。在最後 cycles 的大小,並沒有造成太大差異,因為這些數量相較於本地記憶體存取的成本,都相當大。

要在單處理器系統上的核心與使用者空間之間創造同時性,或可利用 page faults:引入(introduced)核心在哪存取使用者記憶體,該處已因記憶體壓力,而被分頁(paged)到磁碟上。他們也可以利用網路延遲或其他 IPC,這都會導致核心屈服。關鍵在於,system call argument 被 wrapper 與核心存取之間,能在此關鍵 window 期間,執行 user process -- 這看起來相當直接了當。


它能用於遠端 exploit?或著,它需要很短/很精確的時間以應付常見的網際網路延遲?

這些特定攻擊需要攻擊者能夠控制系統當中的一個 process -- 不管合法與否。攻擊者接著能夠跳脫安置在 user process 或易受傷服務周圍的 sandbox,獲得存取系統其餘部份的權力。

細節相當依賴(base) wrapper 在預期中的效應。就 GSWTK wrapper 而言,在 exploiting 一個有弱點的 IMAP daemon 時,我展現如何繞過入侵偵測,而且能夠存取 IMAP daemon execution profile 預期之外的檔案。

就 Sysjail 來說,對於那些能綁定 IP 位址的存取控制限制,我展現如何能徹底繞過。至於 Sudo monitor mode,我能避免下給命令的引數被(系統)正確地審核。


有多少硬體平台會對此攻擊產生作用?

多核心系統格外容易被 exploit,因為它們無經由分頁或其他技術強迫核心內容交換。然而,我能夠在單處理器系統上成功地繞過相同的 wrappers。我在 Intel 硬體上進行我的實驗,但它應當能在一定範圍的硬體架構與配置中運作。


那有哪些 OS 呢?

這些攻擊技術以易受 wrapper 方法傷害的架構為目標,而且毫無困難地能夠跨越軟、硬體平台。我能夠利用相同的 C 語言 exploits 數個作業系統,包括:Linux, FreeBSD, NetBSD, 與 OpenBSD。它們應能成功地用在其他作業系統上。


它是否會以任何程式語言所寫成的軟體產生影響?

「同時性」這一類的弱點,能遍及所有同時性系統,而且是所有軟體開發者需要意識到的事。這些特定競逐需要在二方人(程序與核心/kernel/system call wrapper)之間共享記憶,故易受傷害的軟體必然會在二個彼此不信任的處理器之間涉及到記體共享。你或許能在 server 與 client processes 共享記憶,以最佳化程序間通訊(inter-process communication)的例子中發現這種架構,例如:在資料庫與 client 之間或視窗系統中。

雖然有更多豐富的(rich)語言系統,例如 scripting 程式語言,經常採用不透明的(opacity)記憶體存取,但實際上它們的舉止相當可預期,為了辦到這一點,它們也必須使用共享記憶。

如果程式語言支援共享記憶,不正確地程式撰寫將會受到傷害。亦即,它們將會受到我所描述之 system call wrappers 攻擊技術的攻擊。

Robert Watson(http://www.watson.org/~robert/)自 1999 年起便積極的涉及 FreeBSD 中,並在 2000 年開始 TrustedBSD Project(http://www.trustedbsd.org/),該計畫的目的是要替該平台帶來更加先進的安全功能。2005 年 10 月,當他花了六年的時間在業界中進行商業化或政府贊助之作業系統與網路安全的研發之後,他回到了學術界,在劍橋大學電腦實驗室(http://www.cl.cam.ac.uk/)攻讀博士學位。

※ 相關報導:

駭客在 DefCon 秀開鎖
讓瀏覽器不受 DNS Rebinding 攻擊
輕點幾下滑鼠就能駭入 Gmail
Java Popups 危險無法擋
利用 dangling pointer 的新駭客手法
祕密搶占 CPU 資源的妙法
可偵測侵害 GPL 的新方法

英特爾研發大量多核處理器
學生、教授創造出廉價超級電腦
如何不被自己的程式碼毀滅?
Beautiful Code

沒有留言: