網絡安全攻防:Android系統(tǒng)安全之數(shù)據(jù)安全
1. 外部數(shù)據(jù)安全
外部存儲通常是指將數(shù)據(jù)存入到設備的SD卡上。
外部存儲是一種不安全的數(shù)據(jù)存儲機制,因為存儲到SD卡上的文件默認是提供給others讀文件的權限的,設備上安裝的其他App只要在其AndroidMenifest.xml上聲明如下的語句。
- <uses-permission android:name='android.permission.WRITE_EXTERNAL_STORAGE'></uses-permission>
那么該App就具有了對于SD卡的完全的讀寫權限,即是說一個App放在SD卡上的任何數(shù)據(jù)都可以被其他的App進行讀/寫操作,所以將重要數(shù)據(jù)存儲在SD卡上具有相當大的安全隱患。
2. 內部數(shù)據(jù)安全
內部數(shù)據(jù)存儲主要分為兩種方式:SharedPreference存儲和File存儲。內部數(shù)據(jù)存儲的安全問題主要需要注意的是創(chuàng)建的模式以及向文件中寫入的內容。
SharedPreference 存儲是一種輕量級的數(shù)據(jù)存儲方式,它的本質是基于 XML 文件存儲Key-Value鍵值對數(shù)據(jù),通常用來存儲一些簡單的配置信息。
File存儲即常說的文件(I/O)存儲方法,常用于存儲大量的數(shù)據(jù)。
內部數(shù)據(jù)存儲通常較為安全,因為它們可以受到Android系統(tǒng)的安全機制的保護。
Android的安全機制本質上就是Linux的安全機制,系統(tǒng)會為在Android系統(tǒng)上運行的每一個App創(chuàng)建一個進程,并為該進程分配一個UID。Android系統(tǒng)將會為每一個App創(chuàng)建一個特定的目錄/data/data/app_package_name,這個目錄的權限只與UID相關,且只有UID關聯(lián)的用戶才有該目錄相關的權限。
因此,在對應目錄下生成的SharedPreference文件與File文件如果以正確的方式去創(chuàng)建將會受到Android系統(tǒng)權限機制的保護。
這個正確的創(chuàng)建方式是指文件創(chuàng)建的模式,SharedPreference與文件的創(chuàng)建模式主要有以下3種。
MODE_PRIVATE:默認的創(chuàng)建模式,該進程的 UID 對應的用戶將會對該文件擁有完全的控制的權限,而其他UID的用戶將沒有權限去讀/寫文件。
MODE_WORLD_WRITABLE:該權限將允許設備上所有的App對于該文件擁有寫的權限。
MODE_WORLD_READABLE:該權限將允許設備上所有的App對于該文件擁有讀的權限。
為了確保內部數(shù)據(jù)的安全,有如下建議。
(1)創(chuàng)建文件時的權限控制
如果在創(chuàng)建文件的時候沒有注意控制權限,那么該文件的內容將會被其他的應用程序所讀取,這樣就造成了用戶相關信息的泄露,SharedPreference中存儲的往往是一些免登token、session id等和用戶身份息息相關的重要信息,因此,在創(chuàng)建的時候一定要注意選取好創(chuàng)建的模式;免登token也一定要具有時效性,否則與存儲了明文的用戶名和密碼無異。
(2)SharedPreference中不要存入明文密碼等重要信息
由于有Root的存在,那么Root過后的手機就打破了Linux提供的沙箱機制,那么無論以何種方式去創(chuàng)建SharedPreference都已經不再安全了,如果存儲的是用戶明文的密碼,那么用戶的密碼將會泄露,因此,絕對不要向SharedPreference中寫入任何無時效性的重要的數(shù)據(jù)。
3. 通信數(shù)據(jù)安全
這里的通信數(shù)據(jù)安全是指軟件與軟件、軟件與網絡服務器之間進行數(shù)據(jù)通信時,所引發(fā)的安全問題。
軟件與軟件的通信,Android有4大組件:Activity、Content Provider、Service、Broadcast Receiver。
這些如果在Androidmanifest.xml配置不當,會被其他應用調用,引起風險。Android應用內部的Activity、Service、Broadcast Receiver等,它們通過Intent通信,組件間需要通信就需要在Androidmanifest.xml文件中暴露組件。
Intent的兩種基本用法:一種是顯式的Intent,即在構造Intent對象時就指定接收者;另一種是隱式的Intent,即Intent的發(fā)送者在構造Intent對象時,并不知道也不關心接收者是誰,有利于降低發(fā)送者和接收者之間的耦合。
帶來的風險有惡意調用、惡意接收數(shù)據(jù)、仿冒應用、惡意發(fā)送廣播、啟動應用服務、調用組件、接收組件返回的數(shù)據(jù)、攔截有序廣播等。
常見的有以下的防護手段。
(1)最小化組件暴露
不參與跨應用調用的組件添加android:exported="false"屬性,這個屬性說明它是私有的,只有同一個應用程序的組件或帶有相同用戶ID的應用程序才能啟動或綁定該服務。
- <activity android:name=".LoginActivity" android:label="@string/app_name" android: screenOrientation="portrait" android:exported="false">
(2)設置組件訪問權限
參與跨應用調用的組件或公開的廣播、服務設置權限。
① 組件添加android:permission屬性。
- <activity android:name=".Another" androidandroid:label="@string/app_name"android:permission="com.test.custempermission"> </activity>
② 聲明屬性
- <permission android:description="test" android:label="test" androidandroid:name="com.test.custempermission"android:protectionLevel="normal"></permission>
protectionLevel有4種級別:Normal、Dangerous、Signature、SignatureOrSystem。Signature、SignatureOrSystem級別只有相同簽名時才能調用。
③ 調用組件者聲明
- <uses-permission android:name="com.test.custempermission"/>
(3)暴露組件的代碼檢查
Android 提供各種 API 在運行時檢查、執(zhí)行、授予和撤銷權限。這些 API 是android.content.Context類的一部分,這個類提供有關應用程序環(huán)境的全局信息。
網絡數(shù)據(jù)通信可能面臨的攻擊是網絡流量嗅探,如果網絡上傳沒有加密的數(shù)據(jù),網絡嗅探就能截獲到數(shù)據(jù),ARP攻擊可以輕松嗅探到賬號、密碼等。比較常見是通過HTTPS,HTTPS能有效地防止數(shù)據(jù)暴露、防止第三方截獲應用的通信數(shù)據(jù)。
Android中實現(xiàn)HTTPS基本就這兩種方式,一種是不驗證證書,一種是有驗證證書(預防釣魚)。
第二種方式實現(xiàn)復雜一些,需要將cer證書轉換成BKS類型。這種方式也只能簡單地防止釣魚,不能有效地防止釣魚。防止釣魚最終還是靠用戶分辨,在正規(guī)渠道下載應用。應用證書也能起到驗證客戶端的功能,使用證書驗證客戶端不合適,如果使用證書驗證客戶端,證書必須存放在應用程序中或使用時下載,Android應用都是一個APK文件,很容易獲取到里面的文件,如果是下載方式,更容易通過下載地址獲取。如果想驗證客戶端的話,使用so文件封裝數(shù)據(jù)更好。