熊聰聰 汪 鵬
(天津科技大學(xué)計(jì)算機(jī)科學(xué)與信息工程學(xué)院,天津 300222)
USB存儲(chǔ)設(shè)備的廣泛應(yīng)用在給用戶帶來便利的同時(shí)也帶來了很大的信息安全隱患,各種針對(duì)USB存儲(chǔ)設(shè)備的木馬、病毒以及非授權(quán)用戶的使用都造成了嚴(yán)重的信息安全問題。目前,針對(duì)USB存儲(chǔ)設(shè)備的安全防護(hù)機(jī)制大多是在應(yīng)用層上實(shí)現(xiàn),且主要是對(duì)主機(jī)端系統(tǒng)的防護(hù)。在這種防護(hù)方式下,當(dāng)主機(jī)系統(tǒng)受到攻擊和破壞時(shí),信息的安全性不能得到保證;同時(shí)由于應(yīng)用層的權(quán)限較低,使得訪問控制機(jī)制容易遭到破壞。
對(duì)此,本文提出的解決方案是增加一個(gè)運(yùn)行Linux系統(tǒng)的嵌入式平臺(tái)(ARM S3C2410)作為安全終端,將訪問控制機(jī)制放在此嵌入式平臺(tái)中。這種設(shè)計(jì)方案不僅可以很好地防范針對(duì)USB存儲(chǔ)設(shè)備的攻擊,而且克服了傳統(tǒng)防護(hù)方式的固有缺陷,保障了用戶的信息安全。
嵌入式系統(tǒng)平臺(tái)硬件部分采用ARM9系列的S3C2410,它包含 ARM處理器、Flash存儲(chǔ)芯片、SDRAM、LCD、USB主機(jī)接口和 USB從設(shè)備接口等。USB主機(jī)接口與USB從設(shè)備接口支持USB1.1協(xié)議標(biāo)準(zhǔn)。USB從設(shè)備接口負(fù)責(zé)與主機(jī)系統(tǒng)的USB主口進(jìn)行通信,ARM板上的USB主設(shè)備接口負(fù)責(zé)與外圍USB存儲(chǔ)設(shè)備通信。系統(tǒng)硬件結(jié)構(gòu)如圖1所示。
圖1 系統(tǒng)硬件結(jié)構(gòu)圖Fig.1 Structure of system hardware
根據(jù)嵌入式Linux平臺(tái)的特點(diǎn)和功能實(shí)現(xiàn)的需要,設(shè)計(jì)的系統(tǒng)軟件結(jié)構(gòu)如圖2所示。USB存儲(chǔ)設(shè)備訪問控制機(jī)制在嵌入式Linux中實(shí)現(xiàn),其中Mass Storage Gadget驅(qū)動(dòng)模塊用來實(shí)現(xiàn)訪問控制功能,認(rèn)證驅(qū)動(dòng)模塊負(fù)責(zé)接收應(yīng)用程序發(fā)送來的數(shù)據(jù)并根據(jù)預(yù)先存儲(chǔ)的賬戶信息進(jìn)行認(rèn)證,USB從設(shè)備端控制器驅(qū)動(dòng)負(fù)責(zé)與主機(jī)間的底層通信。系統(tǒng)中只有用戶認(rèn)證應(yīng)用程序在應(yīng)用層運(yùn)行,負(fù)責(zé)接收用戶輸入的信息。所有的訪問機(jī)制和口令都在驅(qū)動(dòng)層中實(shí)現(xiàn),提高了訪問控制機(jī)制的安全性。
圖2 系統(tǒng)軟件結(jié)構(gòu)圖Fig.2 Structure of system software
在實(shí)現(xiàn)控制器驅(qū)動(dòng)后,可利用Linux Gadget子系統(tǒng)實(shí)現(xiàn)對(duì)各種USB設(shè)備端的應(yīng)用,如存儲(chǔ)設(shè)備、USB轉(zhuǎn)網(wǎng)口和USB轉(zhuǎn)串口等。這里通過加載Mass Storage Gadget驅(qū)動(dòng)模塊在S3C2410上實(shí)現(xiàn)存儲(chǔ)設(shè)備功能,使得ARM板連接到主機(jī)時(shí)自動(dòng)識(shí)別為USB移動(dòng)存儲(chǔ)設(shè)備。
運(yùn)行于一個(gè)USB外設(shè)的系統(tǒng)在Linux內(nèi)核中被稱為Gadget子系統(tǒng),分為USB設(shè)備控制(USB device control,UDC)層、設(shè)備驅(qū)動(dòng)層(Gadget驅(qū)動(dòng))和 Gadget應(yīng)用程序接口(Gadget application program interface,Gadget API)層[1]。Linux Gradget系統(tǒng)框架如圖3 所示。
圖3 Linux Gadget系統(tǒng)框架Fig.3 System framework of Linux Gadget
UDC驅(qū)動(dòng)是Gadget子系統(tǒng)中最底層的軟件層,也是硬件相關(guān)層。UDC驅(qū)動(dòng)負(fù)責(zé)控制USB設(shè)備和主機(jī)間的底層通信,向上層提供與硬件相關(guān)操作的回調(diào)函數(shù)[1]。Gadget API是UDC驅(qū)動(dòng)程序回調(diào)函數(shù)的簡(jiǎn)單包裝,功能為向上提供編程接口。Linux USB設(shè)備側(cè)驅(qū)動(dòng)程序使用 struct USB_gadget描述 UDC,使用 struct USB_ep表示端點(diǎn)。Gadget API通過這兩個(gè)結(jié)構(gòu)對(duì)下層硬件進(jìn)行管理。Gadget驅(qū)動(dòng)層是Linux Gadget子系統(tǒng)中的高層驅(qū)動(dòng),負(fù)責(zé)實(shí)現(xiàn)struct USB_gadget_driver結(jié)構(gòu),并調(diào)用UDC驅(qū)動(dòng)提供的Gadget API函數(shù)usb_gadget_register_driver()和usb_gadget_unregister_driver()在內(nèi)核中進(jìn)行注冊(cè)和注銷操作[2]。硬件細(xì)節(jié)隱藏在不同的UDC驅(qū)動(dòng)中,所以Gadget驅(qū)動(dòng)是硬件不相關(guān)的,只負(fù)責(zé)具體設(shè)備功能的實(shí)現(xiàn)。
Mass Storage Gadget驅(qū)動(dòng)是Gadget子系統(tǒng)中的最高層,使ARM S3C2410連接主機(jī)時(shí)表現(xiàn)為一個(gè)移動(dòng)存儲(chǔ)設(shè)備[3],并使用雙緩沖技術(shù)來提高數(shù)據(jù)吞吐量。
驅(qū)動(dòng)模塊的init()函數(shù)使用usb_gadget_register_driver(&fsg_driver)函數(shù)完成驅(qū)動(dòng)模塊的注冊(cè),當(dāng)設(shè)備連接時(shí),調(diào)用fsg_bind()函數(shù)。fsg_bind()函數(shù)負(fù)責(zé)Gadget驅(qū)動(dòng)和下層設(shè)備控制器的關(guān)聯(lián)、分配Mass Storage設(shè)備需要的端點(diǎn)以及傳送數(shù)據(jù)所需的數(shù)據(jù)緩沖區(qū),其中最主要的功能是創(chuàng)建處理線程函數(shù)fsg_main_thread()。線程函數(shù)fsg_main_thread()是Gadget設(shè)備操作的主要處理函數(shù),負(fù)責(zé)處理設(shè)備的各種操作及事件[4],通過調(diào)用 get_next_command()函數(shù)不斷讀取主機(jī)端的命令,并將之發(fā)送給do_scsi_command()函數(shù)進(jìn)行處理[8]。處理線程的生命周期在Gadget設(shè)備的fsg_bind()函數(shù)回調(diào)期間開始,在fsg_unbind()函數(shù)調(diào)用期間結(jié)束。
在Linux Kernel 2.6版本中,USB Gadget子系統(tǒng)的驅(qū)動(dòng)代碼在/kernel/drivers/usb/gadget目錄下。配置好內(nèi)核中所需的USB Gadget功能,執(zhí)行make modules SUBDIRS=/drivers/usb/gadget命令,則在Gadget目錄下生成g_file_storage.ko文件,此時(shí)驅(qū)動(dòng)模塊已經(jīng)可以使用。在加載驅(qū)動(dòng)之前,必須根據(jù)硬件設(shè)計(jì)在內(nèi)核中添加設(shè)備插入通知函數(shù)。此外,由于USB主機(jī)和設(shè)備接口均需要48 MHz的時(shí)鐘,而ARM S3C2410中使用USB鎖相環(huán)(USB phase locked loop,UPLL)為 USB產(chǎn)生時(shí)鐘,所以還需向UPLLCON(UPLL控制寄存器)中寫入相應(yīng)值,以提供USB所需的時(shí)鐘。
修改 arch/arm/mach-s3c2410/mach-smdk2410.c添加內(nèi)核通知函數(shù)的主要代碼如下。
設(shè)備上電啟動(dòng)后加載驅(qū)動(dòng),在終端輸入insmod g_file_storage_ko file=/dev/sda removable=1命令即可掛載驅(qū)動(dòng)模塊,其中參數(shù)file=/dev/sda表示將插入的USB存儲(chǔ)設(shè)備在/dev目錄下生成的設(shè)備文件用于數(shù)據(jù)交互,removable參數(shù)表示是否為可移除設(shè)備。加載完畢后,將S3C2410設(shè)備的USB Device接口與主機(jī)系統(tǒng)的USB主機(jī)接口使用USB線連接,主機(jī)將其識(shí)別為USB存儲(chǔ)設(shè)備。
訪問控制是為了限制訪問用戶對(duì)于關(guān)鍵資源(處理器、路由器、應(yīng)用程序、數(shù)據(jù)文檔和系統(tǒng)文檔)的訪問,防止用戶的非授權(quán)操作所造成的信息安全問題[5]。用戶只有在經(jīng)過身份認(rèn)證并得到授權(quán)后,才能根據(jù)訪問控制機(jī)制預(yù)先設(shè)定的規(guī)則對(duì)資源進(jìn)行訪問。
本方案采用基于角色的訪問控制機(jī)制,通過定義不同角色權(quán)限并為訪問用戶分配角色實(shí)現(xiàn)訪問控制,具有實(shí)現(xiàn)簡(jiǎn)單、責(zé)任獨(dú)立和節(jié)約管理開銷等優(yōu)點(diǎn)[6]。在系統(tǒng)中,認(rèn)證驅(qū)動(dòng)模塊負(fù)責(zé)用戶角色的分配并輸出認(rèn)證結(jié)果,Mass Storage Gadget驅(qū)動(dòng)模塊則根據(jù)認(rèn)證結(jié)果分配權(quán)限實(shí)現(xiàn)訪問控制。
本方案采用基于角色的訪問控制方式,將用戶角色分為角色A(讀權(quán)限)、角色B(寫權(quán)限)、角色C(讀寫權(quán)限)和角色D(無權(quán)限)。用戶通過應(yīng)用程序與認(rèn)證驅(qū)動(dòng)模塊交互,獲取角色并得到相應(yīng)的訪問權(quán)限。在Mass Storage Gadget驅(qū)動(dòng)中,do_scsi_command()函數(shù)負(fù)責(zé)對(duì)命令進(jìn)行解析并做出相應(yīng)處理,修改此函數(shù)中對(duì)于讀寫命令的處理可實(shí)現(xiàn)預(yù)先的規(guī)則設(shè)定。如角色A讀權(quán)限設(shè)定可通過修改SC_READ_10命令的處理實(shí)現(xiàn),主要代碼如下。
認(rèn)證模塊負(fù)責(zé)接收用戶登錄信息并分配相應(yīng)角色。由于Linux系統(tǒng)中用戶一般只能在用戶態(tài)執(zhí)行,因此不具有訪問內(nèi)核層中的數(shù)據(jù)結(jié)構(gòu)和程序的權(quán)限;而對(duì)于存儲(chǔ)設(shè)備的訪問控制又在驅(qū)動(dòng)模塊中也就是內(nèi)核層實(shí)現(xiàn),所以必需解決用戶態(tài)和內(nèi)核態(tài)的轉(zhuǎn)換問題,才能進(jìn)行相應(yīng)的權(quán)限控制。在Linux中,可通過系統(tǒng)調(diào)用處理程序、調(diào)度程序和中斷處理程序三種方式實(shí)現(xiàn)用戶態(tài)和內(nèi)核態(tài)的轉(zhuǎn)換[7]。以下采用驅(qū)動(dòng)模塊引用機(jī)制也就是系統(tǒng)調(diào)用處理程序的方式設(shè)計(jì)和實(shí)現(xiàn)認(rèn)證模塊。
3.2.1 Linux 驅(qū)動(dòng)模塊引用機(jī)制
在Linux模塊機(jī)制中,用戶可以把新的功能作為一個(gè)模塊動(dòng)態(tài)地加入內(nèi)核。一般使用insmod命令裝載模塊,然后使用內(nèi)核的符號(hào)表解析模塊中未解析的符號(hào)。modprobe命令與insmod命令類似,它也可以將模塊裝載到內(nèi)核,另外會(huì)在當(dāng)前模塊搜索路徑中查找依賴模塊,并按一定的順序裝載到內(nèi)核中。Linux內(nèi)核中的公共內(nèi)核符號(hào)表保存了所有的全局內(nèi)核項(xiàng),包括模塊訪問的符號(hào)和相應(yīng)地址。驅(qū)動(dòng)模塊被裝入內(nèi)核時(shí)可以利用EXPORT_SYMBOL和EXPORT_SYMBOL_GPL宏導(dǎo)出符號(hào)到公共內(nèi)核符號(hào)表中,同時(shí)可以被其他模塊引用,引用模塊依賴于導(dǎo)出符號(hào)模塊[8]。
3.2.2 認(rèn)證模塊的實(shí)現(xiàn)
根據(jù)Linux的驅(qū)動(dòng)模塊引用機(jī)制,通過添加認(rèn)證驅(qū)動(dòng)模塊實(shí)現(xiàn)認(rèn)證過程。系統(tǒng)認(rèn)證流程如圖4所示。
圖4 系統(tǒng)認(rèn)證流程圖Fig.4 Flowchart of system certification
設(shè)計(jì)方法是將認(rèn)證驅(qū)動(dòng)模塊實(shí)現(xiàn)為字符驅(qū)動(dòng),提供open、write、read操作并導(dǎo)出表示角色的符號(hào)(User)。同時(shí)設(shè)定Mass Storage Gadget驅(qū)動(dòng)模塊引用認(rèn)證模塊導(dǎo)出的符號(hào),并使用modprobe命令加載各驅(qū)動(dòng)模塊。認(rèn)證時(shí)首先由認(rèn)證驅(qū)動(dòng)模塊從應(yīng)用程序中接收信息,并根據(jù)Flash中預(yù)先存放的口令信息對(duì)用戶身份進(jìn)行認(rèn)證;然后認(rèn)證驅(qū)動(dòng)模塊根據(jù)認(rèn)證結(jié)果導(dǎo)出符號(hào)并向應(yīng)用程序返回狀態(tài)信息;最后由Mass Storage Gadget驅(qū)動(dòng)模塊根據(jù)不同的符號(hào)值賦予用戶相應(yīng)的訪問權(quán)限。
認(rèn)證應(yīng)用程序的作用是接收用戶信息并與認(rèn)證模塊交互。系統(tǒng)中應(yīng)用程序使用QT4編寫,采用多線程編程方式。主線程負(fù)責(zé)接收用戶輸入的口令信息并將其傳遞給認(rèn)證模塊,然后阻塞等待認(rèn)證模塊的反饋,子線程負(fù)責(zé)加載設(shè)備。通過用戶認(rèn)證應(yīng)用程序,用戶可以方便地選擇加載USB存儲(chǔ)設(shè)備并輸入口令,在獲取反饋信息后進(jìn)行相應(yīng)權(quán)限的訪問。
用戶打開認(rèn)證應(yīng)用程序,輸入口令進(jìn)行認(rèn)證,獲取角色權(quán)限對(duì)設(shè)備進(jìn)行訪問,如發(fā)生越權(quán)訪問,則發(fā)出警告信息。經(jīng)過測(cè)試證明,系統(tǒng)可以有效地對(duì)USB存儲(chǔ)設(shè)備進(jìn)行訪問控制,用戶只能在認(rèn)證授權(quán)后按照相應(yīng)權(quán)限進(jìn)行訪問。
本文提出了一種利用嵌入式平臺(tái)實(shí)現(xiàn)USB存儲(chǔ)設(shè)備訪問控制的方案,以運(yùn)行Linux的ARM S3C2410為例給出了詳細(xì)的設(shè)計(jì)和實(shí)現(xiàn)方法。該方案將訪問控制機(jī)制放在嵌入式平臺(tái)中,實(shí)現(xiàn)主機(jī)系統(tǒng)與外圍USB存儲(chǔ)設(shè)備物理上的隔離;同時(shí),所有對(duì)USB存儲(chǔ)設(shè)備的訪問均由嵌入式平臺(tái)進(jìn)行安全控制。試驗(yàn)證明,此方案克服了傳統(tǒng)防護(hù)方式過于依賴主機(jī)系統(tǒng)的缺陷,很好地解決了使用USB存儲(chǔ)設(shè)備所引起的信息安全隱患,所涉及的軟件模塊和訪問控制機(jī)制的設(shè)計(jì)可以方便地應(yīng)用于其他的嵌入式Linux平臺(tái),具有很好的移植性和參考價(jià)值。
[1]Linux-USB Community.Linux-USB Gadget API framework[EB/OL].[2005 -06 -08].http://www.linux - usb.org/gadget/.
[2]李傳偉,胡金春.嵌入式Linux下USB Gadget驅(qū)動(dòng)框架研究[J].航天控制,2006,24(6):51 -55.
[3]Xu Zhe,Liu Zhuo,Zhang Hua,et al.Development of Linux based USB device driver for portable spectrometer[C]//Proceedings of the 21st Annual International Conference on Chinese Control and Decision Conference,2009:5125 -5128.
[4]劉超.Linux平臺(tái)下USB大容量存儲(chǔ)設(shè)備驅(qū)動(dòng)程序的改進(jìn)與優(yōu)化[D].北京:北京交通大學(xué),2008.
[5]段云所,魏仕民,唐禮勇,等.信息安全概論[M].北京:高等教育出版社,2003:114-126.
[6]韓若飛,汪厚祥.基于任務(wù)-角色的訪問控制模型研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2007,28(4):800 -802.
[7]Bovet D P,Cesati M.深入理解 LINUX 內(nèi)核[M].3版.陳莉君,馮銳,牛欣源,譯.北京:中國(guó)電力出版社,2007.
[8]Corbet J,Rubinia A,Kroah-Hartman G.Linux設(shè)備驅(qū)動(dòng)程序[M].2版.魏永明,耿岳,鐘書毅,譯.北京:中國(guó)電力出版社,2006.