李煥
(福州匯思博信息技術(shù)有限公司,福建廈門(mén),361000)
Android是一種基于Linux的自由及開(kāi)放源代碼的操作系統(tǒng),ADB的全稱(chēng)為Android Debug Bridge,就是起到調(diào)試橋的作用。
ADB本身是Android設(shè)備開(kāi)發(fā)時(shí)的調(diào)試工具,但是也可以用來(lái)作為管理工具。基本上百度助手、360手機(jī)助手、QQ手機(jī)助手對(duì)手機(jī)的管理功能都是通過(guò)ADB來(lái)實(shí)現(xiàn)。ADB的管理功能需要手機(jī)打開(kāi)調(diào)試選項(xiàng),這為手機(jī)管理提供了方便,同時(shí)也造成了安全隱患。
當(dāng)我們打開(kāi)設(shè)備的調(diào)試選項(xiàng),并使用USB線將設(shè)備連接到PC時(shí),不僅僅是手機(jī)管理工具可以控制設(shè)備,只要調(diào)用ADB命令,任何PC端的程序都可以訪問(wèn)手機(jī)內(nèi)容,那么設(shè)備連接到PC后就是在“裸奔",設(shè)備中的所有信息都可以被PC端抓取。
由于ADB功能的強(qiáng)大,一些Android設(shè)備廠商考慮到安全等因素,他們不希望將此功能輕易開(kāi)放給用戶(hù)使用,但是自己又很需要此功能,所以如果需要保護(hù)設(shè)備上的私密信息,那么最好謹(jǐn)慎控制用戶(hù)ADB的訪問(wèn)權(quán)限。
Android ADB(Android Debug Bridge)是一種多功能的命令行工具,可讓用戶(hù)與設(shè)備通信。ADB命令可用于執(zhí)行各種設(shè)備操作(如安裝和調(diào)試應(yīng)用),并提供Unix shell(可用來(lái)在設(shè)備上運(yùn)行各種命令)的訪問(wèn)權(quán)限,是一種客戶(hù)端-服務(wù)器程序。圖1為ADB的應(yīng)用結(jié)構(gòu)。
圖1 ADB的應(yīng)用結(jié)構(gòu)。
(1)我們?cè)赑C端使用過(guò)adb命令,則會(huì)在當(dāng)前用戶(hù)目錄生成一對(duì)密鑰,密鑰存放在.android目錄,其中adbkey為私鑰,adbkey.pub為公鑰,通常默認(rèn)只有一組。
(2)PC adb會(huì)把公鑰(adbkey.pub)發(fā)送給android設(shè)備來(lái)獲取認(rèn)證,建立adb連接。
(3)android 會(huì)根據(jù)屬性ro.adb.secure來(lái)判斷,是否進(jìn)行認(rèn)證,如果為0,則不需要認(rèn)證,允許建立adb連接。如果為1,則需要進(jìn)行密鑰認(rèn)證。
(4)如果需要進(jìn)行adb密鑰認(rèn)證,則把接收到的adbkey.pub與本地的/data/misc/adb/adb_keys進(jìn)行對(duì)比,如果相同,則表明是允許此設(shè)備進(jìn)行adb連接,如果不相同,則彈出對(duì)話框,提示用戶(hù)是否允許信任usb調(diào)試。
Client為Android設(shè)備端服務(wù),Host為PC客戶(hù)端應(yīng)用,交互過(guò)程如圖2。
圖2 交互過(guò)程
(1)Client向Host發(fā)送AUTH_TOKEN報(bào)文,包含源自/dev/urandom的20字節(jié)的隨機(jī)token。
(2)Host用自己的私鑰對(duì)該隨機(jī)token進(jìn)行簽名(SHA1+RSA),放在發(fā)往Client的AUTH_SIGNATURE報(bào)文中。
(3)Client通過(guò)已有的adb_keys公鑰檢查簽名,如果正確,響應(yīng)以CONNECT報(bào)文,否則向Host發(fā)送新的AUTH_TOKEN報(bào)文,提供新的隨機(jī)token。
(4)Host接收到新的AUTH_TOKEN,嘗試用另外一組公私鑰對(duì)對(duì)該隨機(jī)token進(jìn)行簽名,放在發(fā)往Client的AUTH_SIGNATURE報(bào)文中。
(5)如果Host已經(jīng)嘗試完所有公私鑰對(duì),則向Client發(fā)送AUTH_ RSAPUBLICKEY報(bào)文,包含一個(gè)Host公鑰。Client將Host公鑰發(fā)往framework,后者彈出信息框,詢(xún)問(wèn)是否允許(或永久允許)使用USB調(diào)試接口,該信息框中一般會(huì)顯示Host公鑰的指紋(MD5),而不是Host公鑰本身,公鑰保存在/data/misc/adb/adb_keys中。
當(dāng)最終授權(quán)通過(guò)時(shí),Client和Host就能成功建立連接。當(dāng)服務(wù)端和客戶(hù)端建立連接之后,就可以使用adb命令來(lái)控制或者訪問(wèn)了,用戶(hù)可以通過(guò)ADB指令對(duì)設(shè)備進(jìn)行特定的操作,包括adb shell查看設(shè)備信息、logcat、reboot、backup指令等。
ADB本身是Android設(shè)備的調(diào)試工具,同時(shí)也可以作為管理工具,當(dāng)設(shè)備打開(kāi)調(diào)試選項(xiàng)即可用來(lái)管理設(shè)備,同時(shí)也造成了安全隱患。
(1)與PC建立連接過(guò)于簡(jiǎn)易,用戶(hù)可輕松完成設(shè)備連接管理。用戶(hù)僅需設(shè)備打開(kāi)調(diào)試選項(xiàng),ADB工具就可以實(shí)現(xiàn)查看手機(jī)內(nèi)容、向手機(jī)寫(xiě)入文件、給手機(jī)安裝軟件等功能,這些都不需要root權(quán)限。
(2)指令執(zhí)行風(fēng)險(xiǎn)。adb具有豐富的系統(tǒng)權(quán)限以backup/restore為例,Android應(yīng)用屬性allowBackup安全風(fēng)險(xiǎn)源于adb backup容許任何一個(gè)能夠打開(kāi)USB 調(diào)試開(kāi)關(guān)的人從Android手機(jī)中復(fù)制應(yīng)用數(shù)據(jù)到外設(shè),一旦應(yīng)用數(shù)據(jù)被備份之后,所有應(yīng)用數(shù)據(jù)都可被用戶(hù)讀??;adb restore容許用戶(hù)指定一個(gè)恢復(fù)的數(shù)據(jù)來(lái)源(即備份的應(yīng)用數(shù)據(jù))來(lái)恢復(fù)應(yīng)用程序數(shù)據(jù)的創(chuàng)建。因此,當(dāng)一個(gè)應(yīng)用數(shù)據(jù)被備份之后,用戶(hù)即可在其他Android手機(jī)或模擬器上安裝同一個(gè)應(yīng)用,以及通過(guò)恢復(fù)該備份的應(yīng)用數(shù)據(jù)到該設(shè)備上,在該設(shè)備上打開(kāi)該應(yīng)用即可恢復(fù)到被備份的應(yīng)用程序的狀態(tài)。
由上了解了ADB的使用過(guò)程后,可知,當(dāng)Android設(shè)備接入PC時(shí),若PC端程序使用adb命令連接Android設(shè)備,則Android端會(huì)彈出授權(quán)窗口,提示PC程序正在嘗試連接Android設(shè)備,若用戶(hù)選擇始終允許這臺(tái)計(jì)算機(jī)連接Android設(shè)備,則意味著PC中的任何軟件(包括惡意軟件)都可通過(guò)adb命令連接到Android設(shè)備,并通過(guò)adb協(xié)議提供的接口訪問(wèn)Android設(shè)備中的數(shù)據(jù),廠商設(shè)備的一些私密信息可能會(huì)被讀取,導(dǎo)致信息泄露的風(fēng)險(xiǎn)。因此加強(qiáng)ADB權(quán)限的授權(quán)管控,使得ADB的使用狀態(tài)能夠被廠家所掌控便成為了一種必不可少的措施。如圖3,提供一種網(wǎng)絡(luò)+秘鑰的授權(quán)方式對(duì)ADB使用進(jìn)行控制。
圖3 一種網(wǎng)絡(luò)+秘鑰的授權(quán)方式對(duì)ADB使用進(jìn)行控制
(1)Client端收到AUTH_RSAPUBLICKEY通訊指令時(shí),不再是彈出信任請(qǐng)求提示并保存公鑰,而是再次發(fā)起一個(gè)認(rèn)證請(qǐng)求AUTH_TOKEN,內(nèi)容不僅僅是上面提到的/dev/urandom生成的隨機(jī)數(shù),還會(huì)攜帶一個(gè)額外的經(jīng)過(guò)預(yù)置公鑰加密的參數(shù)信息extra_info用于收集終端設(shè)備信息(版本號(hào)、SN等)。
(2)Host端收到AUTH_TOKEN指令后,發(fā)現(xiàn)extra_info數(shù)據(jù),收集Host端授權(quán)賬號(hào)信息(賬號(hào)、密碼、MAC地址等),通過(guò)聯(lián)網(wǎng)將賬號(hào)信息以及extra_info上送授權(quán)服務(wù)器,服務(wù)器檢查賬戶(hù)信息,并解密extra_info信息進(jìn)行設(shè)備識(shí)別,將加密后的授權(quán)結(jié)果數(shù)據(jù)發(fā)送給Host端并放在發(fā)往Client的AUTH_SIGNATURE報(bào)文中。
其中賬號(hào)信息有以下2種方式獲?。?/p>
從廠商內(nèi)部人員的Ukey設(shè)備獲取;
非廠商人員通過(guò)廠商渠道申請(qǐng)臨時(shí)賬號(hào)密碼,放置在PC指定目錄。
(3)Clint端接收到AUTH_SIGNATURE報(bào)文中數(shù)據(jù),本地做解密認(rèn)證授權(quán)結(jié)果,根據(jù)結(jié)果開(kāi)放ADB相對(duì)應(yīng)的功能。
如上在原生的認(rèn)證流程上,對(duì)于ADB的授權(quán)采用聯(lián)網(wǎng)+秘鑰的方式,不但可以根據(jù)不同需求人群進(jìn)行權(quán)限管控,同時(shí)可以獲取每臺(tái)設(shè)備的狀態(tài),這樣就可以使得ADB的使用得到有效的管理,從而有效禁止非法程序訪問(wèn)Android設(shè)備端的文件數(shù)據(jù),提高了Android設(shè)備端數(shù)據(jù)的安全性。
ADB常用指令如表1。
表1 ADB 常用指令
表2 指令
如上,針對(duì)不同的指令不同的作用,可以對(duì)指令做適當(dāng)?shù)膬?yōu)化或者直接屏蔽指令的方式來(lái)限制指令的使用。
Android 的內(nèi)核本身就是Linux,所以Android本身也支持Linux指令,通過(guò)adb shell指令,可以是用戶(hù)已shell的身份對(duì)Android設(shè)備進(jìn)行訪問(wèn),因此對(duì)shell的使用管控顯得格外重要。對(duì)于安全保密性要求較高的Android設(shè)備,在版本發(fā)放時(shí)建議以屏蔽shell指令或者根據(jù)使用者身份賦予shell指令使用權(quán)限會(huì)更加可靠與安全。
借助ADB工具, 我們可以管理Android設(shè)備的狀態(tài),還可以進(jìn)行很多控制操作,比如安裝軟件,系統(tǒng)升級(jí),運(yùn)行shell命令等等, 其實(shí)簡(jiǎn)而言之,ADB就是連接Android手機(jī)與PC端的橋梁,可以讓用戶(hù)在電腦上對(duì)設(shè)備進(jìn)行全面的操作。ADB為用戶(hù)設(shè)備的管理帶來(lái)方便的同時(shí)也帶來(lái)許多潛在的安全風(fēng)險(xiǎn)。對(duì)于廠商和用戶(hù),如何平衡廠商和用戶(hù)的ADB功能使用,又能滿足各自的使用需求顯得格外的重要。本文闡述了Android ADB的框架和一些針對(duì)安全訪問(wèn)的策略機(jī)制,探討ADB定制上的可能性和安全性,希望能為廣大Android工作者和愛(ài)好者提供有效的幫助。