摘 要: 隨著移動技術(shù)的發(fā)展與智能操作系統(tǒng)的推廣,智能設(shè)備在為用戶提供便利的同時,也存在一些數(shù)據(jù)安全隱患。針對Android Wear智能手表,提出了一種通過在Linux內(nèi)核層對麥克風、藍牙和ADB等數(shù)據(jù)端口進行開關(guān)控制,以實現(xiàn)對手表中的數(shù)據(jù)進行保護的技術(shù)。該技術(shù)使用了兩種不同的途徑實現(xiàn)對三個數(shù)據(jù)端口的控制。同時,還實現(xiàn)了一種內(nèi)核程序的用戶交互方法,在文件系統(tǒng)驅(qū)動程序中截獲用戶層程序?qū)μ囟ㄎ募淖x寫操作,可以顯示數(shù)據(jù)端口的當前開關(guān)狀態(tài),并對開關(guān)狀態(tài)進行控制,而不需要增加或修改應(yīng)用層程序,最后通過實驗驗證了該技術(shù)的可行性。
關(guān)鍵詞: Android Wear; 智能手表; 數(shù)據(jù)保護; 數(shù)據(jù)端口開關(guān)控制
中圖分類號: TN92?34; TM417 文獻標識碼: A 文章編號: 1004?373X(2016)19?0020?05
Abstract: With the development of mobile technology and promotion of intelligent operating system, some hidden dangers in data security also occurred in the intelligent devices while they were providing the convenience for their users. For the Android Wear smart watch, a data protection technology is presented, which can protect the data in the watch by means of switch control in Linux kernel level to control the data ports of microphone, Bluetooth and ADB. This technology uses two different approaches to control the three data ports. A user interaction method of kernel program was implemented, which can intercept the specific files′ read?write operation of the user layer program in file system drive program, display the current switch status of the data ports, and control the switch status without increasing or modifying the application layer program. The feasibility of this technology was verified with experiment.
Keywords: Android Wear; smart watch; data protection; data port switch control
0 引 言
Android Wear智能手表作為一種新式的可穿戴設(shè)備給人們的生活帶來了極大的便利[1]。智能手表作為隨身穿戴的設(shè)備,很可能被非法分子作為竊聽他人隱私的媒介,智能手表中的重要數(shù)據(jù)可能通過藍牙泄露出去,當手表遺失或被竊后,他人可以使用ADB命令或手機助手軟件將手表中的數(shù)據(jù)拷貝出去,從而給用戶帶來嚴重的損失。通過研究Android Wear智能手表的數(shù)據(jù)保護技術(shù),讓用戶可以在開會或其他涉及重要隱私信息的場合,選擇將手表中可能導(dǎo)致數(shù)據(jù)泄露的端口關(guān)閉,從而起到數(shù)據(jù)保護的作用[2]。
1 數(shù)據(jù)保護技術(shù)的原理與控制
由于無法獲得Android Wear系統(tǒng)源碼,所以本文通過修改Linux內(nèi)核層的代碼,增加對麥克風、藍牙和ADB驅(qū)動的控制,一方面可以防止惡意軟件的錄音竊取用戶重要信息;另一方面還可以防止重要數(shù)據(jù)通過藍牙和ADB泄露出去。本節(jié)主要從麥克風、藍牙和ADB三個方面分別介紹它們的實現(xiàn)原理,以及如何從內(nèi)核層實現(xiàn)對它們的開關(guān)控制。
1.1 麥克風的工作原理與控制
麥克風是Android音頻系統(tǒng)中的輸入設(shè)備,通過分析音頻系統(tǒng)的架構(gòu),了解麥克風的工作原理與實現(xiàn)方式,進而在Linux內(nèi)核層找到控制麥克風的關(guān)鍵代碼。Android音頻系統(tǒng)自上而下分為應(yīng)用層、Java框架層、本地框架層、本地庫、硬件抽象層和驅(qū)動層[3]。通過Makefile和config變量定位麥克風驅(qū)動對應(yīng)的文件。查看/sound目錄下的Makefile文件,內(nèi)核編譯時將根據(jù)這些變量是否為[y]來選擇相應(yīng)的文件進行編譯。
通過不斷在子目錄及相應(yīng)的Makefile中跟蹤內(nèi)核配置變量,確定最終被編譯進內(nèi)核中和聲音有關(guān)的文件有/sound/sound_core.c和/sound/soc/msm/dory?mi2s.c。在兩個文件中的各個函數(shù)中都加入自定義的printk函數(shù)來輸出日志信息,然后通過ADB命令查看日志輸出,發(fā)現(xiàn)當向手表輸入語音指令時,其中dory_mi2s_startup為啟動函數(shù)[4]。
1.2 藍牙的工作原理與控制
Android藍牙架構(gòu)包括四層,分別為應(yīng)用層、框架層、C框架層、內(nèi)核層。根據(jù)內(nèi)核編譯系統(tǒng)的工作原理,通過追蹤內(nèi)核配置變量,找到和藍牙有關(guān)的驅(qū)動程序有/drivers/bluetooth/bluesleep.c和 /drivers/bluetooth/bluetooth?power.c,然后通過在各函數(shù)中插入日志信息,查看函數(shù)調(diào)用流程,進而在關(guān)鍵函數(shù)中添加控制邏輯。然而通過實驗發(fā)現(xiàn)該方法并不完全有效,雖然可以切斷當前的藍牙連接,但是手表和手機之間仍然可以再次建立連接,這無法滿足本文的需求。于是提出了另外一種更為通用的方法,為了關(guān)閉某個功能模塊,首先找到該模塊所使用的可執(zhí)行文件或重要的庫文件,然后在文件系統(tǒng)打開文件函數(shù)中添加對該文件的攔截,使得文件打開失敗,從而使得該功能模塊無法執(zhí)行。
藍牙模塊使用了兩個庫文件/system/lib/hw/bluetooth.default.so和/system/lib/ libbluetooth_jni.so。接下來在/fs/namei.c文件的do_filp_open函數(shù)中添加對上述兩個庫文件的攔截。上面的方法可以阻止藍牙的再次打開,如果手表已經(jīng)和手機建立了連接,上述的方法并不能斷開當前的連接,因此還需要將藍牙模塊的進程kill掉[5]。在內(nèi)核中kill掉進程需要遍歷所有的進程,然后比較當前進程的名字是否為目標進程,如果是,則向該進程發(fā)送SIGKILL信號。
1.3 ADB的工作原理與控制
當用戶啟動ADBclient時,Client首先檢查是否有ADBserver正在運行。如果沒有,則啟動一個ADBserver進程。當Server進程啟動時,它綁定本地TCP5037端口,通過該端口接收ADBclient發(fā)送的命令。所有的ADBclient都使用5037端口與ADBserver通信[6]。
ADBserver與連接到PC上的Android設(shè)備或模擬器建立連接。Server通過掃描5555~5585范圍內(nèi)的奇數(shù)端口來發(fā)現(xiàn)Android設(shè)備或模擬器。當Server發(fā)現(xiàn)一個ADBdaemon時,便會和那個端口建立連接。每個Android設(shè)備或模擬器需要兩個端口,偶數(shù)端口用于控制臺連接,奇數(shù)端口用于用戶ADB連接。一旦ADBserver建立與設(shè)備或模擬器的連接,便可以通過ADB命令來控制和訪問這些設(shè)備或模擬器。因為ADBserver管理與設(shè)備或模擬器之間的連接,所以可以通過ADBclient控制任何的設(shè)備或模擬器[7]。
通過對ADB工作原理的分析,得知手表中通過adbd守護進程與電腦建立連接,因此只要禁止該程序的執(zhí)行,便可以達到關(guān)閉ADB的目的。
2 用戶交互界面
根據(jù)Android系統(tǒng)的分層架構(gòu)可以知道,用戶使用智能手表,實際上是使用手表中的應(yīng)用軟件,和用戶直接打交道的是位于最上層的App[8]。然而提出的數(shù)據(jù)保護方案的核心功能實現(xiàn)位于內(nèi)核態(tài),因此需要解決的是如何讓用戶通過使用上層的應(yīng)用軟件來觸發(fā)內(nèi)核中相應(yīng)的動作(主要是對麥克風、藍牙和ADB的開關(guān)切換)。在不修改和添加智能手表中應(yīng)用軟件的前提下,實現(xiàn)用戶交互界面的設(shè)計,主要采用的方法是尋找手表中自帶應(yīng)用與系統(tǒng)文件的讀寫交互,在內(nèi)核文件系統(tǒng)讀寫函數(shù)中添加判斷邏輯,當寫特定文件時,根據(jù)寫入文件的數(shù)據(jù)來觸發(fā)對數(shù)據(jù)端口開關(guān)的控制;當讀取特定文件時,通過修改返回的數(shù)據(jù)來顯示內(nèi)核的狀態(tài)。
2.1 輸入界面的設(shè)計與實現(xiàn)
Android Wear系統(tǒng)中自帶一個鬧鐘應(yīng)用,當設(shè)定鬧鐘時會有寫文件的操作,寫文件時會調(diào)用內(nèi)核文件系統(tǒng)中vfs_write函數(shù),這樣內(nèi)核便可以將設(shè)定鬧鐘的時間作為用戶的輸入,根據(jù)時間的不同,對麥克風、藍牙和ADB進行相應(yīng)的開關(guān)控制。
2.1.1 查找鬧鐘對應(yīng)的應(yīng)用程序
Android Wear 系統(tǒng)啟動后,安裝包管理器會解析系統(tǒng)中所安裝的應(yīng)用,并為其建立對應(yīng)的數(shù)據(jù)結(jié)構(gòu),同時會將所有應(yīng)用的基本信息保存在文件中。這樣的文件共有兩個,它們位于/data/system目錄,分別是packages.list和packages.xml??梢詮膒ackages.list中查看系統(tǒng)中所有應(yīng)用的安裝包信息,可以從packages.xml中獲得該安裝包所在路徑。
從命令的輸出中看到和時鐘有關(guān)的應(yīng)用有三個,從安裝包的名字可以看出,其中com.google.android.deskclock是谷歌公司開發(fā)的,com.lge.wearable.worldclock是LG公司開發(fā)的,/data/data/com.google.android.clockwork. packageinstaller是程序安裝器。LG公司沒有必要為手表開發(fā)一個鬧鐘程序,因此com.google.android.deskclock應(yīng)該就是要找的鬧鐘程序的包名。
2.1.2 查找鬧鐘程序所寫的文件
2.2 在內(nèi)核中讀取設(shè)置的鬧鐘時間
當用戶設(shè)置鬧鐘時,程序會向/data/data/com.google.android.deskclock/shared_prefs/alarms.xml文件寫入設(shè)置的鬧鐘時間。根據(jù)Linux虛擬文件系統(tǒng)的相關(guān)知識,寫文件時會調(diào)用內(nèi)核中的vfs_write函數(shù),該函數(shù)位于內(nèi)核源碼/fs/read_write.c文件中。在vfs_write函數(shù)中,對所寫文件名進行判斷,如果是鬧鐘文件,則在寫文件后,從鬧鐘文件中讀取設(shè)置的時間值,根據(jù)具體的時間值對數(shù)據(jù)端口進行相應(yīng)的開關(guān)設(shè)置。從vfs_write函數(shù)傳入的參數(shù)可以獲得所寫文件的structfile指針,使用dentry_path_raw函數(shù)可以得到該file對象對應(yīng)的絕對路徑,然后使用strcmp函數(shù)比較該路徑是否為鬧鐘文件的路徑。用設(shè)置鬧鐘的hour值當做用戶的輸入,讀取hour值的主要流程如圖2所示。
2.3 輸出界面的設(shè)計與實現(xiàn)
輸出界面用來顯示麥克風、藍牙和ADB的當前開關(guān)狀態(tài),需要在手表自帶應(yīng)用中找到一個合適的位置來顯示內(nèi)核狀態(tài)信息,為了不影響手表軟件原有功能,最好找一個顯示一些固定靜態(tài)信息的頁面。通過分析現(xiàn)有應(yīng)用,找到Settings下面的About界面,該頁面顯示手表系統(tǒng)的一些固定信息,比如Model、設(shè)備名、軟件版本等,其中有一項是Regulatory Information(監(jiān)管信息),點擊該項后,顯示如圖3所示頁面,從外觀看,該頁面顯示的應(yīng)該是一個固定的圖片。當上層應(yīng)用讀取該圖片內(nèi)容時,會調(diào)用底層內(nèi)核文件系統(tǒng)中的vfs_read函數(shù),通過修改返回的內(nèi)容,使得該頁面顯示想要顯示的信息。
2.3.2 使用BMP圖片替換PNG圖片
壓縮格式的PNG不利于使用代碼對其修改,為了方便修改圖片的顯示內(nèi)容,使用格式最簡單的BMP位圖文件。需要修改vfs_read函數(shù),當讀取的文件為/system/etc/regulatory_info.png時,將bmpdata數(shù)組中的數(shù)據(jù)拷貝到用戶端,這樣當用戶查看手表監(jiān)管信息時,將會顯示所需位圖。
2.3.3 修改位圖內(nèi)存數(shù)據(jù)
為了在位圖中顯示信息,需要修改 bmpdata[]數(shù)組中的數(shù)據(jù),修改BMP文件的圖形數(shù)據(jù)區(qū)域。對于256色位圖,每個像素點使用8位二進制數(shù)表示,這8位二進制表示的是顏色表中的一個顏色索引。顏色表用來描述位圖中的顏色,它有若干個表項,每個表項代表一種顏色,使用RGBQUAD結(jié)構(gòu)表示。
在內(nèi)核源碼/drivers/video/console/目錄下有很多字庫文件,使用其中的font_sun12x22.c文件。它使用寬為12像素,高為22像素的矩陣表示一個字符。位圖數(shù)據(jù)區(qū)記錄了位圖中每個像素的顏色,其掃描順序為從左到右,從下到上。要想在位圖中顯示字符,還需要知道每個字符對應(yīng)的像素矩陣。
3 實驗與測試
3.1 實驗?zāi)繕?/p>
通過設(shè)置鬧鐘為特定時間,對內(nèi)核數(shù)據(jù)端口進行開關(guān)控制,并可以從Regulatory Information查看內(nèi)核數(shù)據(jù)端口的狀態(tài)。
鬧鐘時間與數(shù)據(jù)端口開關(guān)的對應(yīng)關(guān)系,如表1所示。
表1 鬧鐘時間與端口開關(guān)對應(yīng)關(guān)系表
[鬧鐘時間\數(shù)據(jù)端口開關(guān)\1 點\打開麥克風\2 點\打開藍牙\3 點\打開 ADB\11 點\關(guān)閉麥克風\12 點\關(guān)閉藍牙\13 點\關(guān)閉 ADB\]
設(shè)計的輸出界面只能顯示數(shù)字和英文字符,在顯示時同時顯示三個數(shù)據(jù)端口的狀態(tài),用MIC表示麥克風,用BT表示藍牙,ADB表示ADB。用0表示關(guān)閉狀態(tài),用1表示打開狀態(tài)?!癕IC:0BT:1ADB:1”表示麥克風處于關(guān)閉狀態(tài),藍牙處于打開狀態(tài),ADB處于打開狀態(tài)。
3.2 測 試
3.2.1 麥克風的測試
正常情況下,用手指點擊手表屏幕,手表進入喚醒狀態(tài),此時只要說“OK Google”, 手表就會做出反應(yīng)。
關(guān)閉麥克風:通過設(shè)置鬧鐘為11點將麥克風關(guān)閉,然后再對手表說“OK,Google”,手表沒有反應(yīng),由此可以證明麥克風功能已經(jīng)成功關(guān)閉。同時,可以在Regulatory Information中看到麥克風端口狀態(tài)為0。
打開麥克風:通過設(shè)置鬧鐘為1點重新打開麥克風,可以在RegulatoryInformation界面看到麥克風的狀態(tài)為1,此時對手表說“OK,Google”,手表重新恢復(fù)響應(yīng)。
3.2.2 藍牙的測試
正常情況下,手機可以和手表建立藍牙連接,當連接時,手機上會提示連接密碼確認。
關(guān)閉藍牙:通過設(shè)置鬧鐘為12點將藍牙關(guān)閉,手表與藍牙的連接斷開,且再次連接手表時,顯示無法和手表通信,因此可以證明藍牙功能已成功關(guān)閉。
打開藍牙:通過設(shè)置鬧鐘為2點將藍牙重新打開,此時手表并不會自動和手機建立藍牙連接,需要在手表上點擊手表設(shè)置中的Bluetoothdevices,它會提示重新啟動藍牙,點擊確認按鈕之后手表與手機會自動建立連接。
3.2.3 ADB的測試
關(guān)閉ADB:如圖4所示,在正常情況下,電腦可以通過ADB命令和手表通信,通過設(shè)置鬧鐘為13點將ADB關(guān)閉,當前的ADB連接會立刻斷開,且當再次輸入adbshell命令時,會顯示Devicenotfound,因此可以證明ADB功能已成功關(guān)閉。
打開ADB:通過設(shè)置鬧鐘為3點將ADB再次打開后,此時輸入adbshell,無法連接手表,需要拔下數(shù)據(jù)線再重新插上,再使用adbshell,可再次連接到手表。
4 結(jié) 論
Android Wear系統(tǒng)是谷歌專為智能手表等可穿戴設(shè)備設(shè)計的系統(tǒng),出于碎片化的擔心,谷歌并沒有開放Android Wear的系統(tǒng)源碼,因此本文提出一種從內(nèi)核層對可能造成數(shù)據(jù)安全問題的三個端口進行開關(guān)控制,從而起到數(shù)據(jù)保護的作用。通過對麥克風、藍牙和ADB工作原理的分析,在內(nèi)核層實現(xiàn)了對這三個數(shù)據(jù)端口的開關(guān)控制。同時,設(shè)計了用戶交互界面,使得用戶可以方便地輸入指令,控制內(nèi)核對三個數(shù)據(jù)端口進行開關(guān)切換,同時內(nèi)核還可以將數(shù)據(jù)端口的開關(guān)狀態(tài)顯示給用戶。
最后通過測試證明了本技術(shù)方案可以對各數(shù)據(jù)端口進行有效控制,實現(xiàn)了對數(shù)據(jù)的保護。課題使用LGGWatch智能手表作為對象進行實驗,由于不同的硬件平臺對應(yīng)的驅(qū)動程序可能不同,預(yù)裝的應(yīng)用程序也可能存在差異,所以在移植性上還存在不足,這是今后努力的一個方向。另外,目前指令的輸入還缺少用戶身份識別模塊,如何對用戶進行有效的身份識別是另一個需要研究的方向。
參考文獻
[1] 徐尤華,熊傳玉.Android應(yīng)用的反編譯[J].電腦與信息技術(shù),2012(1):50?51.
[2] 蔡潔.基于高通平臺的Android系統(tǒng)分區(qū)管理[J].硅谷,2014(19):44?46.
[3] 張歡慶,高麗,宋承祥.基于ARM的嵌入式Linux交叉編譯環(huán)境的研究與實現(xiàn)[J].計算機與數(shù)字工程,2012(2):151?153.
[4] 夏盛新.基于Android的移動開放平臺SDK的設(shè)計與實現(xiàn)[D].西安:西安電子科技大學,2014.
[5] SCHMIDT A D, BYE R, SCHMIDT H G, et al. Static analysis of executables for collaborative malware detection on Android [C]// Proceedings of 2009 IEEE International Conference on Communications. Dresden: IEEE, 2009: 1?5.
[6] 金智義,張戟.嵌入式Android系統(tǒng)的啟動研究[J].佳木斯大學學報(自然科學版),2011(4):521?523.
[7] 王景存,高峰.基于ARM9的Bootloader的分析及設(shè)計[J].現(xiàn)代電子技術(shù),2010,33(2):44?46.
[8] 蔡潔.基于高通平臺的Android系統(tǒng)分區(qū)管理[J].硅谷,2014(19):44?46.