歡迎光臨
每天分享高質量文章

應用於Intel SGX的自動程式劃分框架(上)

     SGX全稱 Software Guard Extensions,是Intel為了實現安全記憶體訪問而新增的一組拓展指令.該框架包含一組指令,片上加密引擎和其他硬體,sgx的核心概念是enclave,一個完全隔離的地址空間,用來存放可信的程式碼和資料.透過這種機制,我們可以將一個應用程式的可信部分載入到enclave中,從而提高應用的安全性和機密性.

        本文提出了一種自動的程式劃分框架,利用靜態資料流分析和反向切片自動提取出程式的可信部分.從而實現程式的安全隔離.本篇論文我們將集中探討一個問題,“如何找到一個應用程式的最小安全子集,僅僅該子集是安全敏感?”

        在我們的方法中,我們使用靜態程式分析去識別程式程式碼的安全子集。雖然保守,但是它使得我們可以更穩定的識別出可能被暴露於或者直接修改敏感資料的函式子集。這種分析方式是獨立於應用輸入的,由於應用輸入可能被攻擊者利用,所以這種方法在面對對於enclave介面的攻擊時,顯得更有彈性,只要靜態檢測的結果在執行時被強制利用。

        Glamdring是一種使用Intel SGX保護C程式的新框架。Glamdring在原始碼級別對程式進行分割槽,儘量減少在enclave中的程式碼量。為了分離一個應用,開發者首先應該在機密性和完整性應該被保護的原始碼中註釋輸入輸出變數。Glamdring隨後執行一下步驟:

(1) 靜態資料流分析。為了防止暴露敏感資料,潛在的可能訪問敏感資料的函式應該被放入enclave。Glamdring使用靜態資料流分析去識別所有可能訪問敏感資料或者由敏感資料得到的資料。在對輸入資料進行註釋操作後,它會在應用中跟蹤敏感資料的傳播。

(2) 靜態反向切片。為了防止攻擊者損害敏感輸出資料的完整性,更新敏感資料的函式必須被放置進enclave。Glamdring使用靜態反向切片去識別可能會影響資料完整性的函式。

(3) 應用分割槽。Glamdring將識別出的安全敏感函式放置到enclave中。它建立了enclave介面,該介面包含所有傳遞給enclave函式的引數,並且可以訪問非可信的全域性變數。任何跨越enclave介面的敏感資料都被透明加密,並且透過enclave程式碼或者可信的遠端客戶端簽名。基於一些效能原因,一些非安全敏感的函式也可能被移動到enclave中。

(4) 原始碼生成。最後,Glamdring使用基於LLVM/Clang的編譯器去轉換應用。該編譯器(i)使用要求的加密操作,在enclave邊界生成合適的入口和出口程式碼。(ii) 我們要保證是資料的特性決定了記憶體分配是在enclave中還是在enclave外發生的。(iii)在enclave邊界增加執行時檢測,這一階段的輸出是一個不可信的二進位制檔案和一個在enclave中執行的可信的共享庫。

2 背景

        保護應用資料至關重要。過去的事件證明資料外洩和完整性攻擊是影響使用者和企業聲譽的主要因素。

        現在的應用程式被頻繁的部署在不可信環境中比如公有雲,同時被第三方供應商控制。除了應用程式容易被攻擊,潛在的基礎設施(作業系統或虛擬機器監視器)在應用開發者眼中也可能是不可信的,並且軟體解決方案(被實現為OS或者監視器的元件)並不能保護應用資料。

        新的硬體機制,例如intel sgx提供了一種解決方案,基於一種可信執行模型。對於應用程式資料和程式碼,它提供了記憶體和執行環境的隔離,這種隔離也包含了高特權級的軟體。我們的工作解決了開發者怎樣只保護安全敏感資料和程式碼的問題。

2.1 執行緒模型

        在我們的考量下,一個安全敏感型的應用要麼直接訪問敏感資料要麼可能間接的影響資料的機密性或完整性。比如在Memcache中,假設鍵值對是敏感的,那麼儲存鍵值對的函式是敏感的,然而處理網路的函式則不是。

        攻擊者的標的要麼是洩露機密資料,要麼是損害資料的完整性。我們假設存在一個強有力的攻擊者,比如說一個惡意的系統管理員,他控制著可以執行應用程式的軟體和硬體。這個攻擊者可能 訪問或修改記憶體或磁碟中的資料,檢視後修改應用程式碼,修改OS或者其他系統軟體。該攻擊者因此可能1. 訪問或修改記憶體中或硬碟中的資料。2. 修改應用程式碼。3. 修改OS或其他軟體。

2.2 基於sgx的可信執行

        sgx允許應用保護程式碼和資料的機密性和完整性,即使攻擊者控制了所有的軟體OS監視器BIOS和對機器的物理訪問包括記憶體和系統匯流排。

        sgx透過enclave實現應用程式的可信執行。enclave程式碼和資料存在於一段被保護的記憶體區域中,叫做enclave page cache(EPC)。並將enclave中的地址空間對映到EPC中。只有在enclave中的程式碼被允許去訪問EPC。enclave程式碼可以訪問enclave外的記憶體區域。一個片上的儲存加密引擎對寫入記憶體或從記憶體載入到EPC中的cache line(是EPC的快取行)進行加解密。因為enclave中的程式碼總是在使用者態下執行,任何透過系統呼叫和OS互動的操作都必須在enclave外執行,比如network 和磁碟I/O。

        使用intel sgx sdk,開發者可以建立enclave庫,該庫可以被載入到enclave中,併在支援sgx的CPU上執行。開發者必須定義enclave程式碼和其他不可信程式碼的介面。一次進入enclave的函式呼叫被稱為enclave入口呼叫(ecall)。對於每一個定義過的ecall,SDK增加了在外部組裝引數的指令,在enclave內解組這些引數,並執行函式。ocall允許enclave內的函式去呼叫不可信的外部函式。

        任何ecall和ocall操作都會帶來開銷,因為硬體必須透過執行一組固定的操作去維持sgx的隔離性。enclave程式碼也必須驗證所訪問資料的完整性,比如ecalls的引數,ocalls的傳回值,和從不可信記憶體中讀取的資料。

2.3 基於可信執行的安全策略

接下來我們將討論幾個折衷:

1. TCB的大小 

2. enclace介面的複雜性 

3. 開發難度

 4. 方法的通用性

        在sgx中,TCB(Trusted Computing Base 可信計算集合)包含enclave程式碼和可信硬體。根據最少特權原則,應用中只有部分接觸敏感資料的部分應該被放置到enclave中。研究顯示,軟體故障和潛在的安全漏洞和程式碼量成正比。所以最小化TCB顯得尤為重要。

        然而,enclave介面的複雜性對enclave程式碼和資料的安全有所影響。舉例來說,enclave中的安全敏感型應用程式碼必須和enclave外的不可信環境進行互動,為了執行I/O。系統呼叫的傳回值必須進行檢測去保護系統不受 Iago攻擊的影響。Iago攻擊透過攻擊OS核心迫使enclave程式碼洩露或者修改敏感enclave資料。創造一個穩定的enclave介面可以更容易推測出特定攻擊的不可行性。

表1展示了三種不同的設計:

1 完整的enclave介面.如同表1-a顯示的,Haven , SCONE 和Graphene 使用了一種粗粒度的隔離策略,它們在enclave中直接執行一個完整的應用程式。Haven使用Drawbridge庫OS(library OS)執行未修改的windows應用。Graphene 將庫OS放置進enclave去執行linux應用。了執行從新編譯過得linux應用, SCONE將一個修改後的標準c庫放置進enclave為。安全敏感型應用程式碼和資料以及安全不敏感型應用程式碼和資料同時駐留在enclave,增加了TCB的大小。

這種模型支援一套完整的系統呼叫或者超級呼叫(hyper calls)。介面是依賴於應用的,但是它的複雜性(從特定呼叫的數量和它們的輸入引數的角度來說)取決於採用這些呼叫的系統。enclave中必要的系統支援也增加了TCB的大小。

儘管這種方法降低了開發難度,因為它能夠執行大部分未經修改的應用,並且具有通用性。但是,它不能掩蓋sgx一個重要的限制,當應用嘗試提供完整的enclave介面時。比如,SCONE無法支援使用fork的應用。

2 預定義的enclave介面.圖1-b顯示了另一種方式,應用必須遵守一個嚴格預定義的enclave介面。比如說,VC3使用enclave保護map/reduces任務,強迫map/reduces任務只能透過 一個特定介面與不可信環境互動。enclave僅僅包含一個很小的可信的shim庫,從而縮減了TCB尺寸。

        這種方法可以使得enclave介面最小化,VC3的介面僅僅包含兩個函式呼叫,一個讀加密後的鍵值對,另一個將加密後的鍵值對當做任務輸出寫。與外界有限的互動簡化了保護,

        這種方法的安全優勢被其有限的適用性所抵消。在這些預定義的介面下,這種方法只能在應用使用特定的方法與不可信環境互動時使用。

3 應用特定的enclave介面.我們發現一個事實,對於許多應用,只有一部分程式碼去處理敏感的資料,同時其他程式碼並不是安全敏感型的也不需要保護。如同圖1c顯示的,這樣我們就可以將程式碼進行劃分,將非安全敏感的資料和程式碼放到enclave外從而減少TCB尺寸。

        前人的工作顯示手動劃分程式碼是可行的。然而,我們想要採取不同的手段,使用程式分析的方法去自動劃分程式碼。

        在這種方法中,enclave介面變成了應用相關:在enclave和非enclave區域之間必須設定一組ecalls和ocalls。相比於一組完整的enclave介面,由於應用程式碼處於enclave外部,這種方法需要的ocalls更少(即enclave內的程式碼呼叫enclave外的函式的次數更少)。

        既然應用資料儲存在enclave外,那麼enclave程式碼必須能夠訪問不可信的記憶體。也就意味著這種方法沒有辦法做到像預定義的enclave介面那樣,完全的防止enclave和外界互動。所以我們必須保證儘管enclave的介面更加豐富,不可信的環境依然不會洩露enclave內的資料。

未完待續…..

贊(0)

分享創造快樂