張立強,陳青松,嚴 飛
(武漢大學 國家網(wǎng)絡安全學院 空天信息安全與可信計算教育部重點實驗室 湖北 武漢 430072)
物聯(lián)網(wǎng)是一種人、機、物廣泛互聯(lián)的實體系統(tǒng),通過智能感知、識別技術與普適計算、泛在網(wǎng)絡的融合應用,對物理世界進行智能化識別和管理[1]。物聯(lián)網(wǎng)技術的高速發(fā)展改善了個人和公共生活的諸多方面,其應用范圍涵蓋智能家居、病人監(jiān)護、工業(yè)自動化、智慧交通和基礎設施監(jiān)控等。Gartner調(diào)查報告表明,2018年全球已有91億物聯(lián)網(wǎng)設備投入使用(復合增長率20.9%),預計2025年聯(lián)網(wǎng)數(shù)量將達到251億[2]。由于物聯(lián)網(wǎng)平臺通常建立在數(shù)據(jù)采集處理的基礎上,而物聯(lián)網(wǎng)設備直接暴露于互聯(lián)網(wǎng),易于遭受網(wǎng)絡攻擊[3],因此,用戶隱私遭受著較大的泄露風險。
為了保護物聯(lián)網(wǎng)設備的數(shù)據(jù)安全,通常采用密碼技術[4]和訪問控制技術[5]這兩種方案。密碼技術主要通過數(shù)據(jù)加密和數(shù)字簽名來保護數(shù)據(jù)的機密性和完整性;訪問控制則是以授權策略為核心,防止主體對客體的未授權訪問和使用。傳統(tǒng)訪問控制模型包括自主訪問控制(discretionary access control, DAC)和強制訪問控制(mandatory access control, MAC)。DAC利用訪問控制列表和能力系統(tǒng)等,允許數(shù)據(jù)所有者修改對數(shù)據(jù)的訪問權限,其安全檢查容易被繞過;MAC則依賴于在硬件層面或者系統(tǒng)層面實施的一組安全策略,基于主體和客體的安全標簽限制主體對客體的訪問能力。
分散式信息流控制(decentralized information flow control, DIFC)屬于MAC模型,最早由Myers等于1997年提出[6],現(xiàn)有研究工作主要集中在對該模型的應用和實現(xiàn)上。HyperFlow提供了一種處理器設計方法[7],使用強制執(zhí)行信息流控制的安全類型硬件描述語言實現(xiàn),可以從處理器架構上提供基于運行時安全策略的信息流控制,并在一定程度上抑制微體系結構側信道。Flume通過攔截系統(tǒng)調(diào)用來執(zhí)行進程間信息流控制,需要對Linux內(nèi)核進行一定的修改,被標記的進程只能訪問受限的系統(tǒng)調(diào)用[8]。AT-DICF是Flume的擴展,通過將系統(tǒng)模塊組織為信任上下文的層次結構,利用多個分散的信任控制器在操作系統(tǒng)中實施細粒度的安全策略[9]。Weir在Android系統(tǒng)上提供了向后兼容的DIFC實現(xiàn),通過接管應用程序及其組件的創(chuàng)建和通信,允許應用更改各自的標簽來設置安全策略,從而控制應用數(shù)據(jù)到網(wǎng)絡的流入[10]。Fabric提供了一種用于構建支持信息流控制的分布式應用程序的高級編程語言,通過類型注釋來控制代碼和數(shù)據(jù)的標簽,使安全計算和存儲以及跨信任邊界共享代碼和數(shù)據(jù)成為可能[11]。CamFlow是針對分布式云環(huán)境的信息流控制系統(tǒng),其原型系統(tǒng)假設云服務提供商是一個非惡意實體,無法保證數(shù)據(jù)在進入和離開系統(tǒng)時的安全性[12]。DDIFT為物聯(lián)網(wǎng)小程序的隱私安全提供了一種粗粒度信息流跟蹤框架,針對URL上傳攻擊可以提高識別程度并減少資源浪費[13]。DFLATE[14]可以對分布式可信執(zhí)行環(huán)境中的代碼進行可信度量,并進行了形式化證明;它使用了強無干擾機密性模型和弱無干擾完整性模型,因此無法防止高完整性的信息對系統(tǒng)的惡意行為。
以上工作對隱私數(shù)據(jù)保護具有一定的貢獻,但對于資源受限的物聯(lián)網(wǎng)應用場景來說,存在一些限制,主要表現(xiàn)在三個方面:
1)基于定制硬件或操作系統(tǒng)的方案存在兼容性的問題,無法進行快速移植;
2)用戶層實現(xiàn)的DIFC機制,運行時內(nèi)存占用和性能開銷較大,對信息流的跟蹤效率較低;
3)由于物聯(lián)網(wǎng)應用通常在單個進程中生成和分析敏感數(shù)據(jù),粗粒度的進程級防護難以實施有效的數(shù)據(jù)隔離保護。
上述問題導致現(xiàn)有的系統(tǒng)仍然面臨著以下威脅:不安全的第三方庫和特權函數(shù)可以被用來泄露應用隱私數(shù)據(jù);多線程應用中,某個線程中的漏洞可以被用來泄露其他線程中的隱私數(shù)據(jù)[15]。為了解決這些問題,本文結合了密碼技術和訪問控制技術的優(yōu)點,提出了一種基于ARM指針認證的線程防御方案(pointer authentication based thread scheme,簡稱PATS),基于DIFC模型輕量高效地實現(xiàn)了線程級的安全隔離和隱私數(shù)據(jù)保護。本文的主要貢獻包括:
1)設計并實現(xiàn)PATS,利用ARM體系中的輕量級指針簽名認證方案,對線程添加安全標簽和完整性標簽,實現(xiàn)細粒度的數(shù)據(jù)隔離和多線程保護;
2)對PATS的原型系統(tǒng)進行評估,結果表明PATS具有較小的內(nèi)存占用和運行時開銷,適用于資源受限的物聯(lián)網(wǎng)設備;
3)基于PATS的用戶空間接口,對實際的應用OpenSSL進行移植,表明PATS具有良好的兼容性和可移植性,僅引入了合理且可接受的性能開銷。
近年來,基于硬件輔助的安全方案逐漸流行[16],ARM公司也在ARMv8.3-A中引入了指令集安全擴展——指針認證(pointer authentication,PA),通過指針認證碼(pointer authentication code,PAC)提供一種高效的機制,檢測攻擊者對代碼指針或數(shù)據(jù)指針的惡意修改[17]。PAC是一種密鑰相關的哈希運算消息認證碼,它存儲在64位原始指針的高位,無須額外的內(nèi)存空間。
指針認證機制主要引入了三種指令:1)PAC*指令用于生成PAC并將其插入原始指針的高位;2)AUT*指令旨在對PAC進行認證,如果PAC匹配,則返回原始指針,否則返回無效指針,該指針將在使用時觸發(fā)異常;3)XPAC*指令則直接返回原始指針,不需要認證過程,主要用于監(jiān)控和調(diào)試。如圖1所示,PAC*指令需要三個參數(shù),64位的原始指針VA、64位上下文參數(shù)M和存儲在系統(tǒng)寄存器中的128位密鑰K,然后使用默認的QARMA算法生成PAC,其大小受到虛擬地址長度和ARMv8.5-A引入的內(nèi)存標記擴展(memory tag extension, MTE)[17]的限制。例如,在虛擬地址為48位并啟用MTE的系統(tǒng)中,PAC大小僅為7位。因此,PAC可以被當作一種輕量高效的標簽,用來跟蹤保護數(shù)據(jù)指針的完整性。另外,如果為每個線程生成不同的密鑰,可以對每個線程的私有數(shù)據(jù)進行訪問控制。
圖1 PAC生成算法
DIFC模型針對互不信任、分散式的環(huán)境,使用主體和標簽來追蹤和控制數(shù)據(jù)的流動,避免數(shù)據(jù)泄露的風險[6]。主體是數(shù)據(jù)的擁有者,有權修改數(shù)據(jù)內(nèi)容和授權;標簽是一組安全策略的集合,它表達了不同主體的隱私需求。標簽的基本結構為
L={owner1:readers1;…;ownern:readersn}。
一個策略由一個owner和一個readers集合組成,readers是owner授權的主體集合,沒有被owner列為readers的主體不允許訪問owner的私有數(shù)據(jù)。使用標簽的概念來標記數(shù)據(jù),不僅可以追蹤數(shù)據(jù)在系統(tǒng)中的流動過程,還可以使一個主體定義和控制自己的安全策略,控制主體對數(shù)據(jù)的訪問,并可以在不干擾其他主體安全策略的前提下,通過對標簽的解密來減少對數(shù)據(jù)的安全約束,從而允許臨時訪問保密數(shù)據(jù),增加了系統(tǒng)的靈活性。
現(xiàn)有的研究工作,要么基于定制硬件或操作系統(tǒng),存在兼容性的問題,無法進行快速移植;要么在用戶層由軟件實現(xiàn),運行時內(nèi)存占用和性能開銷較大。因此,本文利用ARM指針認證技術對線程地址空間進行標記,并為每個線程添加安全標簽和完整性標簽,從而使每個線程可以定義和控制自己的安全策略,而這些安全策略則由內(nèi)核安全原語進行強制安全檢查,實現(xiàn)線程級的安全隔離和信息流控制。
本節(jié)介紹基于ARM指針認證的線程級信息流控制系統(tǒng)PATS的威脅模型、整體架構、訪問控制機制以及相關管理接口。
PATS的威脅主要來自兩個方面:一是共享地址空間內(nèi)由脆弱或惡意第三方庫的內(nèi)存破壞漏洞引起的隱私數(shù)據(jù)泄露;二是多線程程序中某個線程本身的邏輯錯誤或漏洞(例如,緩沖區(qū)溢出或ROP攻擊)被用來攻擊其他線程的隱私數(shù)據(jù)。
本文假設攻擊者可以控制多線程程序中的某些線程并分配內(nèi)存,也可以通過操作系統(tǒng)接口產(chǎn)生更多線程,直至資源限制。攻擊者可以嘗試通過已控制的線程來提升權限,或者嘗試通過修改另一個線程的數(shù)據(jù)或注入代碼來獲得對另一個線程的控制,以及嘗試通過線程之間的競爭條件來繞過隔離保護。目前,PATS并不提供基于共享硬件資源(例如,緩存和TLB)的側信道攻擊的保護,但可以與Nickel[18]等系統(tǒng)集成提供相應的保護。
PATS旨在為物聯(lián)網(wǎng)設備提供一個輕量高效的線程級訪問控制解決方案,應能滿足以下設計需求。
1)隔離性需求。每個線程都應該能夠定義其安全策略和信任模型,從而有選擇地保護和共享其隱私數(shù)據(jù)。
2)可用性需求。PATS應該足夠輕量(文件大小與內(nèi)存占用),從而能在資源受限的設備上運行。PATS提供的接口應該具有較小的性能開銷,且未使用PATS的不可信部分不應該承受任何開銷。
3)兼容性需求。PATS應該提供兼容大部分物聯(lián)網(wǎng)操作系統(tǒng)的解決方案,并提供簡單的用戶空間接口,從而方便應用快速移植。
如圖2所示,PATS將一段由PAC標記的地址空間(PACed address space,PAAS)視為安全主體,并將管理PAAS的線程(PACed thread,PAT)視為隔離單元,對其添加安全標簽和完整性標簽。每個PAT可以管理多個PAAS,通過安全標簽和完整性標簽,PAT可以針對PAAS定制各自的安全策略,并由操作系統(tǒng)內(nèi)核強制執(zhí)行安全檢查與授權,實現(xiàn)內(nèi)存共享和隱私數(shù)據(jù)保護。
圖2 PATS整體架構
PATS基于DIFC的動態(tài)安全策略,通過修改兩個內(nèi)核對象,地址空間PAAS和線程PAT,來實施最小特權原則。PAAS是進行內(nèi)存管理和隱私數(shù)據(jù)保護的最小單元,由ARM指針認證機制進行簽名和認證。PAT可以管理多個PAAS,用來存儲隱私數(shù)據(jù)或者通過共享內(nèi)存通信。每個線程t都擁有自己的安全標簽SLt和完整性標簽ILt,標簽的定義為
L={paas1:tids1;…;paasn:tidsn}。
PAT通過標簽定義了所管理的PAAS的安全策略,其中,paas表示地址空間的結構體指針,指向該PAAS的ID、起始地址、長度、內(nèi)存權限等;tids則表示該PAAS被授權的線程集合。每個PAAS可以被授予的能力有兩種:C+表示向標簽添加該PAAS的能力,也表示PAT可以獲得該PAAS擁有者所設置的訪問權限(讀、寫或執(zhí)行);C-則表示從標簽中刪除PAAS的能力,也表示PAT可以獲得解密該PAAS的權限,即在不影響其他PAT安全策略的前提下修改自身的安全策略(修改被授權的線程集合tids)。同時,所有的訪問控制策略都需要在內(nèi)核執(zhí)行,例如線程α和β的安全標簽和完整性標簽分別為SLα和ILα以及SLβ和ILβ,當SLα?SLβ時,才允許從線程α到β滿足機密性要求的信息流;當ILα?ILβ時,才允許從線程β到α滿足完整性要求的信息流。而當線程將其自身的標簽從La更改為Lb時,必須滿足條件
其中:Ct表示線程t所擁有的能力集合,對于Lb中存在但La中不存在的PAAS,線程t需要擁有添加相應的(paas,tids)對的能力;對于La中存在但Lb中不存在的PAAS以及兩個標簽中都存在但授權集合不一致的PAAS,線程t需要擁有刪除該PAAS的能力,即修改授權集合tids。
為了方便管理線程間的訪問控制權限和應用的快速移植,PATS提供了必要的系統(tǒng)調(diào)用接口和簡單的用戶空間接口,分別用于線程管理和內(nèi)存管理。
線程管理主要包括線程的創(chuàng)建以及針對其擁有的PAAS的權限管理,如表1所示。每個PAT可以管理多個PAAS,默認情況下,從PAT創(chuàng)建子線程時不會繼承其所管理的PAAS,必須顯式地調(diào)用pat_clone函數(shù)表明需要傳遞給子線程的PAAS。同時,在運行過程中,PAT也可以通過pat_transfer_caps函數(shù)向其他線程傳遞自己所擁有的PAAS,并授予C+或C-能力;而當PAT想取消某個PAAS的授權時,可再次調(diào)用該函數(shù),重新進行授權。擁有C-能力的PAT可通過pat_declassify函數(shù)解密對應的PAAS,從而在不影響其他PAT安全策略的前提下修改其安全策略,例如,PAT可以代表該PAAS的擁有者對其他PAT授予PAAS的訪問權限。為了限制對相同PAAS擁有訪問權限的PAT之間可能產(chǎn)生的競爭條件,PAAS的擁有者可以通過調(diào)用pat_lock和pat_unlock函數(shù),臨時修改該PAAS的標簽,限制其他PAT的訪問和代表授權。
值得注意的是,為了防止攻擊者惡意修改PAAS的標簽,所有標簽的關鍵數(shù)據(jù)結構都應在內(nèi)核空間進行管理,暴露給用戶空間的只有與PAAS關聯(lián)的ID(表1所示系統(tǒng)調(diào)用由相似的用戶空間接口進行封裝,隱藏了真實的標簽數(shù)據(jù)),如表2所示。線程通過paas_create函數(shù)創(chuàng)建一段連續(xù)的地址空間,通過paas_get函數(shù)查看PAAS當前的屬性,然后通過paas_mprotect函數(shù)修改其內(nèi)存屬性,最后可通過paas_destroy函數(shù)銷毀該PAAS,回收內(nèi)存。為了更有效管理內(nèi)存,paas_create函數(shù)創(chuàng)建的PAAS默認是1 MB對齊的,如果需要更少的內(nèi)存,可通過paas_malloc函數(shù)從PAAS中進行內(nèi)存分配,并通過paas_free釋放申請的內(nèi)存。從PAAS中分配的內(nèi)存地址仍然使用ARM指針認證進行標記,防止其他線程對其進行惡意訪問。
表1 PAT訪問控制系統(tǒng)調(diào)用
表2 PAAS內(nèi)存管理接口
PATS繞過了傳統(tǒng)Linux內(nèi)核的虛擬內(nèi)存管理,提供了一套新的安全管理原語,并在傳統(tǒng)的管理接口中添加了自定義的安全檢查鉤子,以實施PAT的安全策略,檢查標簽的正確流向。PATS還提供了單獨的異常處理程序,用于記錄并中止針對PAAS的非法訪問。
目前市場上除了Apple公司的A12 Bionic SoC等(私有實現(xiàn)),沒有其他支持ARM指針認證的硬件實現(xiàn),因此本文采用ARM公司提供的虛擬仿真平臺(fixed virtual platforms, FVP)[19]對PATS原型系統(tǒng)進行測試,并基于Yocto項目[20]構建根文件系統(tǒng)和64位Linux 5.4.23版本內(nèi)核鏡像。
本文基于Linux安全模塊(Linux secure module, LSM)實現(xiàn)了用于執(zhí)行安全策略的內(nèi)核鉤子和用于執(zhí)行訪問控制的系統(tǒng)調(diào)用(如表1所示,僅列出了部分接口)。安全鉤子被添加到內(nèi)核中的相關位置,主要包括POSIX接口(例如mmap、mprotect和fork等)和表2所示的用戶空間接口,防止PAAS受到未經(jīng)授權的訪問或權限更改。例如,當PAT創(chuàng)建子線程時,不應該復制其標簽和能力列表;使用POSIX接口進行內(nèi)存管理時,應該限制其訪問PAAS中的隱私數(shù)據(jù),并限制對PAAS的權限更改。PAAS的標簽基于ARM指針認證生成,且每個線程使用不同的密鑰來計算標簽值,因此,本文還修改了任務結構體task_struct用來存儲必要的元數(shù)據(jù)。
為了提供簡單的用戶空間接口并減小可信計算基的大小,本文沒有修改現(xiàn)有的系統(tǒng)庫(如glibc),而是實現(xiàn)了一個輕量級的用戶空間庫,為應用提供了線程管理和內(nèi)存管理的接口;并實現(xiàn)了自定義的內(nèi)存分配器,用于分配小于1 MB的內(nèi)存。
PATS是面向物聯(lián)網(wǎng)設備的信息流控制系統(tǒng),本文實現(xiàn)的原型系統(tǒng)僅包含針對Linux內(nèi)核的補丁文件,不依賴任何第三方庫。PATS向內(nèi)核空間增加了約2 500行代碼,向用戶空間增加了約2 000行代碼。基于Yocto項目編譯出的最小內(nèi)核鏡像,文件大小上增加了約7 kB,運行時內(nèi)存占用增加了約210 kB,用戶空間內(nèi)存占用約20 kB。以上結果表明,PATS的內(nèi)存占用較低,適用于資源受限的物聯(lián)網(wǎng)場景。
本文通過測試內(nèi)存相關操作和多線程操作來評估PATS的運行時性能開銷。
對于內(nèi)存相關操作,由于paas_create函數(shù)創(chuàng)建的PAAS是1 MB對齊的,當申請的內(nèi)存大于1 MB時,與常規(guī)的mmap調(diào)用相比,PATS的性能開銷僅存在于為地址空間分配標簽,平均時延增加了4.4%;當申請的內(nèi)存小于1 MB時,PATS通過自定義的內(nèi)存分配器在PAAS內(nèi)部分配內(nèi)存,實驗結果如圖3所示。
圖3 內(nèi)存分配時延
對于小于128 kB的塊,使用PATS的內(nèi)存分配器的平均時延比glibc提供的malloc函數(shù)小6.0%,而對于大于128 kB的塊,PATS的內(nèi)存分配器的平均時延則要大7.8%,這是因為malloc函數(shù)對于兩種情況分別使用brk和mmap系統(tǒng)調(diào)用來進行內(nèi)存分配。對于修改內(nèi)存屬性,paas_mprotect函數(shù)由于要進行額外的標簽操作,平均時延比mprotect函數(shù)大15%。
對于多線程操作,本文分別測試了pat_clone、pthread_create和fork等函數(shù)的運行時開銷(創(chuàng)建和等待子線程過程)。其中,pat_clone內(nèi)部過程類似clone系統(tǒng)調(diào)用,不同的是,pat_clone限制了與子線程共享的內(nèi)存資源(不再共享整個地址空間),同時提供了向子線程傳遞PAAS的功能。由于pat_clone默認不共享任何PAAS,因此本文分別測試了默認情況和共享一個PAAS的情況下的性能開銷,分別用pat_clone0和pat_clone1表示,如圖4所示。
圖4 線程創(chuàng)建時延
默認情況下,pat_clone的平均時延比pthread_create小0.47%,比fork小84.8%。和子線程共享一個PAAS的情況下,pat_clone的平均時延則比pthread_create大18.5%,比fork小81.9%??偟膩碚f,PATS提供的多線程操作開銷較小甚至優(yōu)于傳統(tǒng)的fork調(diào)用,這得益于pat_clone的最小共享策略,取消了創(chuàng)建子線程時不必要的共享操作。
為了評估PATS的兼容性和應用程序的移植難度,本文對OpenSSL進行了適當修改,利用PATS提供的用戶空間接口保護其敏感數(shù)據(jù)。
OpenSSL是一種廣泛使用的開源安全套接層協(xié)議庫,應用程序可以使用它來進行加密通信,防止被攻擊者竊聽。OpenSSL負責處理敏感數(shù)據(jù),例如會話密鑰和通信數(shù)據(jù)。因此,將這些敏感數(shù)據(jù)存儲在線程安全的地址空間PAAS中可以降低遭受攻擊(如“心臟滴血”漏洞)時,敏感數(shù)據(jù)泄露的風險。
為了在OpenSSL中啟用PATS,本文將所有與會話密鑰相關的數(shù)據(jù)結構(如EVP_PKEY等)都通過PAAS進行內(nèi)存分配和存儲,這意味著,需要用paas_malloc替換OpenSSL_malloc函數(shù),并在初始化階段使用paas_create函數(shù)創(chuàng)建一個或多個PAAS來存儲相關數(shù)據(jù)。對于每個PAAS內(nèi)的數(shù)據(jù),OpenSSL可以使用pat_lock禁用其他線程的訪問,只有需要訪問會話密鑰的函數(shù),例如,EVP_EncryptUpdate或pkey_rsa_encrypt等,才允許通過調(diào)用pat_unlock函數(shù)對PAAS進行解鎖?;赑ATS的OpenSSL版本與開源版本相比,僅修改或新增了273行代碼。
同樣,本文基于虛擬仿真平臺FVP和Yocto項目構建的根文件系統(tǒng),并選擇Apache HTTP服務器(httpd)作為測試平臺進行用例分析。實驗結果如圖5所示,分別展示了使用原始OpenSSL庫和基于PATS的OpenSSL庫(包括對所有會話使用相同PAAS存儲密鑰的版本,和對每個會話使用不同PAAS的版本)的性能開銷。
圖5 ApacheBench測試結果
實驗結果表明,使用單個PAAS保護會話密鑰時,平均性能開銷為0.68%;而對每個會話使用不同的PAAS時,平均性能開銷為3.66%。使用單個PAAS的性能開銷主要花費在維護內(nèi)核數(shù)據(jù)結構上,這些數(shù)據(jù)主要用于執(zhí)行安全策略;而使用多個PAAS的性能開銷則主要花費在創(chuàng)建PAAS的過程,以及多線程間的標簽傳遞與檢查。總的來說,這些開銷都是合理且可接受的。
本文設計實現(xiàn)了一個針對資源受限的物聯(lián)網(wǎng)設備的信息流控制系統(tǒng)PATS,利用ARM指針認證機制對地址空間進行標記,并為線程添加安全標簽和完整性標簽,實現(xiàn)線程級的隔離和內(nèi)存保護;基于Linux安全模塊實現(xiàn)的訪問控制和安全檢查鉤子,可以保證安全策略的有效執(zhí)行,防止線程間潛在的隱私數(shù)據(jù)泄露風險。評估表明,PATS具有較小的內(nèi)存占用和運行時開銷;同時,實際的用例程序(OpenSSL)也表明PATS具有良好的兼容性和可移植性,適用于物聯(lián)網(wǎng)設備等資源受限的場景。對于單線程程序(例如,事件驅動的服務器),攻擊者如果可以感知并利用PATS相關的用戶空間接口,PATS仍然存在被繞過的風險。對于更細粒度的保護,在未來工作中,可以利用ARMv8.5-A引入的內(nèi)存標記擴展MTE對16字節(jié)對齊的內(nèi)存添加標簽實現(xiàn)信息流的控制。