<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    面向資源受限安全芯片的開放式運行環境設計

    VSole2022-05-16 15:34:25

    摘 要:

    安全芯片開放式架構實現了用戶程序和操作系統的分離,降低了應用程序與安全芯片操作系統的耦合性,但同時存在國外壟斷、執行效率低、內存易泄露等弊端。對于搭載了開放式運行環境的安全芯片,面向資源受限所設計的精簡擴展指令集支持與行業應用高度結合,具有基于寄存器的高效指令集解釋執行能力,并具有更好的指令集安全性,可支持多應用融合,有助于打破國外壟斷。

    內容目錄:

    1 開放式運行環境定位

    2 開放式運行環境總體架構

    2.1 通用語言規范限定資源受限

    2.2 編譯轉換

    2.3 常量池組件

    3 指令集性能提升

    4 虛擬機安全分析

    5 面向多應用的設計

    5.1 應用防火墻

    5.2 應用協同訪問

    5.3 應用場景融合

    6 開放式運行環境創新和提升

    7 結 語

    集成電路芯片的安全等級能力是對芯片進行評估的重要維度,安全芯片須通過高標準認證以符合商用密碼產品對芯片安全能力的要求。由于成本和應用場景等原因,能夠達到此類安全認證級別的集成電路芯片基本都屬于硬件資源受限的芯片 。資源受限安全芯片(以下簡稱“安全芯片”)操作系統作為安全芯片的運行支撐平臺,發展至今形成了開放式(Open)架構和封閉式(Closed)架構 2 種技術路線。其中,開放式架構實現了用戶程序和操作系統的分離,降低了應用程序的編寫、編譯、下載、執行與芯片操作系統的耦合性。但是,開放式架構也存在如下劣勢。(1)現有主流開放式架構主要采用國外廠商專利技術,需要繳納專利費用,國內廠商目前還缺少自主可控的技術主導力。(2)開放式架構主要采用棧幀結構,在方法調用過程中涉及入棧和出棧,在字節碼執行過程中也涉及操作數棧的入棧和出棧,解釋執行效率較低。(3)棧幀結構易導致內存泄露,存在安全隱患。(4)指令集源于通用指令集,與行業應用結合度不高,精簡度不夠。針對上述原因,本文提出了一種安全芯片開放式運行環境設計方案,通過對現有主流運行環境重新進行設計,并結合行業安全應用需求擴展指令集,使運行環境中的執行效率、應用開發便捷、安全性等方面得到提升,具有較好的應用前景。

    1 開放式運行環境定位

    安全芯片內部嵌入式操作系統架構如圖 1所示。

    圖 1 安全芯片內部嵌入式操作系統架構

    嵌入式操作系統分為 3 層,即應用層、安全運行環境和硬件驅動層。其中,安全運行環境是一個運行在硬件驅動層和應用層之間的中間平臺層,安全運行環境與硬件驅動層分離,便于安全運行環境在不同芯片硬件平臺之間移植切換;安全運行環境提供一系列應用程序接口(Application Programming Interface,API) 給應用層,供應用開發者開發各種行業應用,這些應用在產品發行后也可以下載到安全運行環境進行加載、運行。安全運行環境負責對芯片中的應用進行管理,保護應用本身以及應用相關數據信息的安全。

    2 開放式運行環境總體架構

    本文提出的面向資源受限安全芯片的開放式運行環境包括芯片外部的上位機編譯器和芯片內部的虛擬機解釋器 2 個部分,總體架構如圖 2 所示。

    圖 2 開放式運行環境總體架構

    在總體架構中,芯片外部的上位機編譯器將源文件編譯轉換成可執行二進制文件,芯片內部的虛擬機解釋器加載并解釋執行該可執行二進制文件。架構中各模塊定義如下:(1)源文件是指基于通用語言規范限定編寫的源代碼;(2)編譯轉換是指將源代碼編譯為中間指令集;(3)可執行二進制文件是指包含方法組件的特定格式文件;(4)解釋執行是指加載可執行二進制文件中的字節碼,在虛擬機中解釋執行。

    2.1 通用語言規范限定資源受限

    安全芯片因 Flash 空間和隨機存取存儲器(Random Access Memory,RAM)空間受限,只能運行基于 16 位操作指令的虛擬機,不能基于通用語言規范來編寫應用源代碼,因此,需要對通用語言規范做以下限定。(1)數據類型支持限定。支持布爾類型(boolean)和數值類型,數值類型包括字節型(byte)、短整型(short)及整型(int)等,不支持字符型(char)、長整型(long)和浮點型。(2)操作指令限定。在虛擬機中運行的基本數據單元為 16 位數據,boolean 類型、byte 類型、short 類型及引用類型的存儲參數、局部變量和中間運算結果占用 1 個基本數據單元,int類型的存儲參數、局部變量和中間運算結果占用 2 個基本數據單元,boolean 和 byte 類型的數值在算術運算時先將數值類型提升為 short 類型,若其中一個操作數類型為 int 類型,則再將數值類型提升為 int 類型。(3)數值類型提升限定。應用于算術運算符的操作數包括一元數值類型提升和二元數值類型提升,比如:當操作數在編譯時的類型為byte,則須通過寬化類型轉換方法將其轉換為short 類型;若其中一個操作數類型為 int 類型,另一個操作數類型也轉換為 int 類型。(4)數組創建和訪問限定。數組類型和索引為 short 類型,只支持一維數組。(5)關鍵字限定。不支持復雜關鍵字,例如,線程同步 synchronized、枚舉 enum、斷言 assert 等。

    2.2 編譯轉換

    編譯轉換過程如圖 3 所示。

    圖 3 編譯轉換過程

    編譯器將源文件編譯轉換為可執行二進制文件,轉換過程包括詞法分析、語法分析、語義分析以及代碼生成 4 個階段。其中,詞法分析階段是將源代碼轉換為索引流;語法分析階段是將詞法分析后形成的索引流中的索引組合成符合語法規范的語法節點,形成一棵基本的抽象語法樹(Abstract Syntax Tree,AST);語義分析階段依據語言規范對 AST 進行嚴格語法檢查,還需要為后續的代碼生成階段準備各種數據;代碼生成階段將 AST 轉換為字節碼。

    中間指令集是代碼生成階段中的一種中間指令,中間指令集格式經各種技術優化后,可生成最終的優化指令碼。部分中間指令集如表 1所示。

    表 1 中間指令集

    針對通用語言規范限定要求,編譯器在處理字面量時需按照值大小確定類型,例如,在short 類型表示范圍內,則按 short 類型處理,在超出 short 類型表示范圍時,則按 int 類型處理;編譯器在處理操作符表達式時須做類型提升,運算符對應的表達式類型是其操作數提升后的類型,只能是 short 類型或 int 類型;編譯器在生成棧和局部變量操作、類型轉換、操作符表達式、方法調動返回等中間指令集的過程中,boolean類型、byte 類型、short 類型及引用類型的局部變量編譯后占用 1 個索引位置,int 類型編譯后則占用 2 個索引位置。

    2.3 常量池組件

    中間指令集通過壓縮轉換,生成目標指令并以可執行二進制文件的格式存儲。可執行二進制文件中的常量池組件,將每種引用類型放在一起形成一個子常量池,具體包括:(1)將所有的類引用類型放在一起形成類子常量池;(2)將所有的靜態方法引用類型放在一起形成靜態方法子常量池;(3)將所有的虛方法引用類型放在一起形成虛方法子常量池;(4)將所有的 super 方法引用類型放在一起形成 super 方法子常量池;(5)將所有的靜態域引用類型放在一起形成靜態域子常量池;(6)將所有的實例域引用類型放在一起形成實例域子常量池。

    通過上述過程,常量池形成 6 個子常量池,包括:(1)類引用;(2)靜態方法引用;(3)虛方法引用;(4)super 方法引用;(5)靜態域引用;(6)實例域引用。

    2.4 解釋執行

    芯片內部的虛擬機解釋器解釋執行可執行二進制文件中的指令集,指令集的解釋執行過程如圖 4 所示。

    圖 4 解釋執行過程

    指令由一個字節長度的操作碼組成,操作碼指定要執行的操作,并由零個或多個操作數表示要操作的值。與基于棧幀的指令集相比,本文所設計的基于寄存器的指令集在指令執行性能上更優,同時,結合行業應用需求,將應用實現過程中使用頻率較高的基礎 API 封裝成宏指令,通過隱含參數信息、定義多種操作格式、單字節常量索引、宏指令等方法精簡設計后形成 6 類指令。

    一是隱含參數信息指令。如表 2 所示,將操作數和寄存器編號都隱含到操作碼的常量賦值指令中。

    表 2 常量賦值指令

    二是具有多種操作格式的高頻指令。如表 3所示為常用算術加操作指令。

    表 3 加操作指令

    三是基于不同參數個數、具有不同指令格式的指令。如表 4 所示為靜態方法調用指令。

    表 4 靜態方法調用指令

    四是常用數據類型指令和不常用數據類型指令。例如,short 數據類型指令和 int 數據類型指令。

    五是具有單字節常量池索引的指令。如表 5所示為靜態域訪問指令。

    表 5 靜態域訪問指令

    六是宏指令。如表 6 所示為數組拷貝宏指令。

    表 6 數組拷貝宏指令

    3 指令集性能提升

    指令集解釋執行時采用了寄存器結構,甚至宏指令,在字節碼執行過程中不涉及操作數棧的入棧和出棧,與棧幀結構相比,解釋執行的效率較高。通過對比 Java 智能卡(JavaCard)的實現來分析性能,部分字節碼指令性能的比對結果如表 7 所示。

    表 7 部分字節碼指令性能比對

    如表 8 所示,以參考代碼“short totalLen=(short)(len+recLen);”的加操作指令為例,通過字節碼、操作數棧和計算過程的比對,進一步分析性能。

    表 8 加操作指令性能比對

    如 表 9 所 示, 以 交 通 電 子 存 折 和 電 子 錢包 應 用(Electronic Deposit & Electronic Purse,EDEP)的交易過程為例,從應用層面進一步分析本文設計指令集的性能。

    表 9 EDEP 應用性能比對

    4 虛擬機安全分析

    虛擬機運行在安全芯片中,針對物理層的攻擊與防護更多依賴于芯片本身,而對虛擬機本身的攻擊與防護更多是依靠邏輯層實現 。針對虛擬機邏輯層的常用攻擊手段是通過修改字節碼,使得應用運行過程中發生內存泄露,從而非法獲取芯片內部機密數據和其他應用數據。本文所設計的安全芯片開放式運行環境具備較好的字節碼指令集安全能力。以JavaCard 的棧幀訪問為例來分析本文設計的字節碼指令集的安全性。針對 JavaCard 棧幀的常用攻擊手段是替換或刪除某些字節碼,打亂棧幀結構,使得棧幀溢出導致內存泄露。本文以刪除字節碼的方式作為示例,進行了詳細的安全對比分析。

    以源代碼“var=0;”為例,給局部變量 var賦值 0,對應 JavaCard 的字節碼如下所示:sconst_0;

    sstore_3;

    sconst_0 的操作數棧過程如下所示:

    … -> …, 0

    將一個 short 值 0 壓入棧中,將 sconst_0 刪掉之后,對于操作數棧來說,少了一次壓棧操作,即少了將 0 壓入棧中的過程。

    后續字節碼是 sstore_3,操作數棧過程如下所示:

    …, value -> …

    將棧頂的一個 short 值彈出,并將該值賦給第 3 個局部變量,結合 sconst_0,在原來執行sstore_3 時,應將 0 從棧頂彈出,賦給第 3 個局部變量,完成 var=0 的過程。將 sconst_0 刪掉之后,當繼續執行 sstore_3 時,從棧頂彈出某一個值,該值存在較大的不可控性,會影響本方法中的邏輯正確性,在極端的情況下,該值會從上一個棧幀中彈出,直接導致上一棧幀內存泄露。如果虛擬機棧幀不做安全防護就會存在極大的安全隱患。

    本文設計的指令集,同樣以源代碼“var=0;”為例,對應字節碼如下所示:

    const-0/r3;

    const-0/r3 

    的操作數棧過程如下所示:

    …, r3 -> …, r3

    將一個 short 值 0 賦值給寄存器 r3 中。如果圖 5 開放式運行環境中的多應用架構將 const-0/r3 刪掉之后,只是少了 r3=0 的賦值過程,同樣會影響本方法中的邏輯正確性,但不會直接導致上一棧幀內存泄露,安全性相對較高。

    如表 10 所示,列出了安全認證實驗室測試報告中對開放式運行環境的安全檢測項 ,以及本文提出的開放式運行環境的實際測試結果,依據中國銀聯股份有限公司發布的 Q/CUP 040.2—2011《銀聯卡芯片安全規范 第 2 部分:嵌入式軟件規范》。

    表 10 安全檢測項及測試結果

    5 面向多應用的設計

    資源受限安全芯片中的開放式運行環境在技術上能支持多應用、產品發行后新應用的下載和應用遠程管理,開放式運行環境中的多應用架構如圖 5 所示。

    圖 5 開放式運行環境中的多應用架構

    由于同一個硬件平臺上的應用可能來自不同的所有者,因此,在不同應用之間需要利用安全機制進行應用的隔離,以保護應用所有者的商業數據。

    5.1 應用防火墻

    防火墻是應用運行時的強制保護,允許虛擬機在運行時自動進行額外的安全檢查。應用通過防火墻隔離,形成單獨的受保護空間環境,單個包中的所有應用共享同一個空間環境。應用中任何給定的數據和方法都有一個單獨的受保護空間環境。

    任何時刻,虛擬機內部只有一個受保護空間環境處于激活狀態。當滿足特定訪問規則時,調用某些方法、從某些方法返回或異常退出時,虛擬機允許環境切換。在環境切換期間,之前的環境被推送到內部虛擬機棧上,新的環境成為當前激活環境,被調用的方法在新的環境中執行。從該方法退出后,虛擬機將執行環境恢復,恢復為切換之前的環境。

    5.2 應用協同訪問

    應用通過防火墻隔離,單個包中的所有應用共享同一個受保護空間環境,并允許同一個包內的應用相互進行數據訪問。不同包之間的應用需滿足特定規則(例如共享接口)才能跨過防火墻訪問對方應用允許訪問的數據和方法。

    5.3 應用場景融合

    隨著移動智能終端的普及,告別“一個應用一張卡”的多卡時代,一卡多用、多應用融合已成為新的發展趨勢。在“一卡多用”產品發行過程中,由專門機構的管理者對基礎、通用類型的信息進行統一管理,完成原始信息錄入、確保信息真實性、維護變更信息等工作,是實現數據被多應用共享的最安全、經濟的智能卡解決方案。

    6 開放式運行環境創新和提升

    安全芯片產品廣泛應用于數字身份、金融、電信、社保、交通、水電燃氣、車載、密碼鑰匙等領域,提供身份識別、密鑰生成、安全存儲、數據保護等功能。本文設計的面向資源受限安全芯片的開放式安全運行環境的創新和提升體現為以下幾點。(1)支持更實用的指令集。精簡指令集和應用向擴展指令集具有更高效的實用性,可廣泛應用于智能卡、安全元件(Secure Element,SE)或安全微控制單元(Microcontroller Unit,MCU)等芯片。(2)支持多應用融合。通過單芯片實現多個業務應用,改變了需要多顆芯片耦合實現業務功能的情況,大大降低了設備芯片成本和研發難度。(3)支持內核化。可下沉到安全芯片作為內核(Kernel),各設備廠家和行業用戶只需關注應用,便于產品快速落地和迭代。(4)支持國產自主可控。具備打破國外廠商技術壟斷的能力,可在安全芯片操作系統領域實現自主可控的目標。

    7 結 語

    安全芯片在商用密碼產品中的使用非常廣泛,在一些特定行業中,對于技術自主可控的需求是合理現實的,以前面對這類需求時,多是采用封閉架構(Closed)技術來實現的。這類技術難以支持業務功能變化快、多應用融合的使用場景,難以適應萬物互聯場景下的產品技術需求。本文設計的安全芯片運行環境,可以提供一個面向資源受限安全芯片的支持多應用和應用后下載的開放式架構解決方案。在保障數據安全的前提下,有效促進行業應用的發展。

    引用本文:王志宇 , 席劍霄 , 張瑩 , 等 . 面向資源受限安全芯片的開放式運行環境設計 [J]. 信息安全 與通信保密 ,2022(4):61-70.

    虛擬機字節碼
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    匯編語言是一種用于電子計算機、微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。Smali匯編基礎Smali語言最早是由JesusFreke發布在Google Code上的一個開源項目,并不是擁有官方標準的語言。因此也將Smali語言稱作Android虛擬機的反匯編語言。基本類型Smali基本數據類型中包含兩種類型,原始類型和引用類型。而在Smali中則是以LpackageName/objectName的形式表示對象類型。
    看雪論壇作者ID:wx_御史神風
    Android逆向:基礎入門
    2022-06-03 05:29:40
    前言 隨著app的廣泛應用,使用過程中,難免會遇到些很不友好的功能,比如:游戲充值、間斷性彈窗廣告、續費解鎖下一回等等。
    本篇文章是WebLogic中間件漏洞復現,記錄了近幾年來爆出的WebLogic中間件漏洞主要分為六個部分:WebLogic簡介、WebLogic安裝、WebLogic漏洞復現、WebLogic SSRF聯動Redis、WebLogic實戰和WebLogic防御措施。
    假如想在x86平臺運行arm程序,稱arm為source ISA, 而x86為target ISA, 在虛擬化的角度來說arm就是Guest, x86為Host。這種問題被稱為Code-Discovery Problem。每個體系結構對應的helper函數在target/xxx/helper.h頭文件中定義。
    tvm分析與還原
    2023-06-06 09:18:55
    把騰訊的安全產品拉入 PE 工具,看到區段中有.tvm0那就沒跑了。demo這次還原用到的demo是前段時間游戲安全技術競賽的決賽附加題一個非常好的demo,驅動基本上全vm了。還要特別感謝這位大佬放出來的脫殼版,給我節省了許多驗證還原效果的時間。pwd=ICEY)文檔我也只說明了一些明顯的點,還是看代碼更加清晰。然后給你的idapython安裝以下的庫:import capstone
    mruby是一個Ruby語言的輕量級實現,mruby工作方式類似CPython,它可以將Ruby源碼編譯為字節,再在虛擬機中解釋運行。
    Java Agent到內存
    2021-12-14 14:52:22
    前言今天看到一篇文章,寫的是關于JAVA Agent相關的資料(附1),里面提到了Java Agent的兩種實現方法:實現premain方法,在JVM啟動前加載實現agentmain方法,在JVM啟動后attach加載因為最近流行破解CobaltStrike不再直接使用反編譯打包源碼了,而是使用JAVA Agent進行提前字節修改。
    一文看懂內存
    2022-01-02 22:31:21
    它負責處理用戶的請求,并根據請求生成相應的返回信息提供給用戶。業務邏輯處理完成之后,返回給Servlet容器,然后容器將結果返回給客戶端。Filter對象創建后會駐留在內存,當web應用移除或服務器停止時才銷毀。該方法在Filter的生命周期中僅執行一次。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类