導語
根據(jù)谷歌最新發(fā)布的Android安全公告颇玷,2018年八月Android安全補丁將解決了多個最為嚴重的安全漏洞,包括允許本地惡意程序繞過用戶交互請求來獲取其他訪問權(quán)限桑嘶,和讓遠程攻擊者執(zhí)行任意代碼bug纫事。
目錄
1刹衫、組件
2、WebView
3口糕、存儲
4板祝、傳輸
5、日志
6走净、防止二次打包和動態(tài)調(diào)試
7券时、漏洞檢測工具
8孤里、Android P 安全防護新特性
組件
1). 設(shè)置權(quán)限開放屬性android:exported=["false"]
Activity:表示是否允許外部應(yīng)用組件啟動。
Service:表示是否允許外部應(yīng)用組件調(diào)用服務(wù)或與其進行交互橘洞。
Receiver:表示是否可以接收來自其應(yīng)用程序之外的消息捌袜。
Provider:表示是否允許其他應(yīng)用程序訪問內(nèi)容提供器。
設(shè)置為“false”后炸枣,組件只能由同一應(yīng)用或同一用戶 ID 的不同應(yīng)用啟動虏等,大大加強安全性。
2). 配置自定義權(quán)限
定義:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<permission
android:name="example.permission.TEST"
android:description="@string/TestActivity"
android:permissionGroup="example.permission-group.TEST"
android:protectionLevel="signature" />
...
</manifest>
暴露:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
...
<activity
android:name=".PrivateActivity"
android:exported="true"
android:label="@string/title_activity_private"
android:permission="example.permission.TEST" />
...
</manifest>
使用:
在manifest文件中申請該權(quán)限适肠,該權(quán)限的使用和Android提供的權(quán)限的使用是一樣的霍衫,均為使用uses-permission標簽
3). LocalBroadcastManager
區(qū)別基于Binder實現(xiàn)的BroadcastReceiver,LocalBroadcastManager是基于Handler實現(xiàn)的侯养,擁有更高的效率與安全性敦跌。主要體現(xiàn)在數(shù)據(jù)僅限于應(yīng)用內(nèi)部傳輸,避免廣播被攔截逛揩、偽造柠傍、篡改的風險。
4). Application相關(guān)屬性配置
- debugable屬性 android:debuggable="false"
根據(jù)官方文檔說明辩稽,默認值就是false惧笛,一般不用手動配置。 - allowBackup屬性 android:allowBackup= "false"
設(shè)置是否支持備份逞泄,默認值為true患整,應(yīng)當手動配置為“false”,避免應(yīng)用內(nèi)數(shù)據(jù)通過備份造成的泄漏問題喷众。
5). intent 安全問題
- 隱式intent沒有明確指明哪些接收方有權(quán)限接收并级,惡意程序指定action標識后,可以獲取intent內(nèi)容侮腹,導致數(shù)據(jù)泄漏嘲碧、intent劫持、仿冒父阻、釣魚應(yīng)用等風險使用愈涩。
- 隱式調(diào)用建議使用Intent.setPackage、Intent.setComponent加矛、Intent.setClassName履婉、Intent.setClass四種方法中任一種明確指定目標組件名稱。
WebView安全
1). 處理不校驗證書漏洞:繼承WebViewClient重寫onReceivedSslError時SslErrorHandler.cancel();
2). 處理file協(xié)議安全漏洞:
setAllowFileAccess(false); setAllowFileAccessFromFileURLs(false);
setAllowUniversalAccessFromFileURLs(false);
3). 處理file協(xié)議安全漏洞:
WebSettings.setSavePassword(false)
4).開啟安全瀏覽模式:
<manifest>
<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
android:value="true" />
<application>
...
</application>
</manifest>
數(shù)據(jù)存儲安全
1). 秘鑰及敏感信息
項目中經(jīng)常用AES對數(shù)據(jù)進行加解密斟览,并將密鑰直接寫在項目文件中毁腿,這樣做會有一定的風險。此類配置應(yīng)當妥善存放,不要在類中硬編碼敏感信息已烤,因此可以使用JNI將敏感信息寫到Native層鸠窗。為了防止二次打包debug出密鑰,我們可以采取驗證apk簽名的方式校驗胯究。
2). SharePreferences
首先不應(yīng)當使用SharePreferences來存放敏感信息稍计。存儲一些配置信息時也要配置好訪問權(quán)限,如私有的訪問權(quán)限 MODE_PRIVATE裕循,避免配置信息被篡改臣嚣。
3). 簽名配置signingConfigs
避免明文保存簽名密碼,可以將密碼保存到本地剥哑,無需上傳版本控制系統(tǒng)
數(shù)據(jù)傳輸安全
1). 使用HTTPS協(xié)議
不要在類中硬編碼敏感信息硅则,可以使用JNI將敏感信息寫到Native層。
2). SSL通信服務(wù)端檢測信任任意證書
自定義SSL x509 TrustManager重寫checkServerTrusted方法株婴,方法內(nèi)嚴格判斷服務(wù)端和客戶端證書校驗怎虫,對于異常事件禁止return 空或者null,防止黑客可以使用中間人攻擊獲取加密內(nèi)容督暂。
3). Android N 包含一個網(wǎng)絡(luò)安全配置特性,讓應(yīng)用可以在一個安全的聲明性配置文件中自定義其網(wǎng)絡(luò)安全設(shè)置穷吮,而無需修改應(yīng)用代碼逻翁,只需要以 PEM 或 DER 格式將自簽署或非公共 CA 證書添加到 res/raw/my_ca。
在AndroidManifest.xml中配置:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application ... >
<meta-data android:name="android.security.net.config" android:resource="@xml/network_security_config" />
...
</application>
</manifest>
network_security_config文件如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">example.com</domain>
<trust-anchors>
<certificates src="@raw/my_ca"/>
</trust-anchors>
</domain-config>
</network-security-config>
日志輸出
日志是我們開發(fā)調(diào)試中不可或缺的一部分捡鱼,但也是最容易泄露敏感信息的地方八回。所以,在我們發(fā)布應(yīng)用時驾诈,應(yīng)當關(guān)閉缠诅、甚至移除Log輸出:
if (BuildConfig.DEBUG == true) {
Log.e(tag, msg);
}
防止二次打包和動態(tài)調(diào)試
1). 混淆代碼,可以增加反編譯破解的難度乍迄。但是我們在使用混淆功能時也要注意實體類管引、與JS交互的方法、第三方混淆配置等問題闯两。
2). 應(yīng)用加固也是近年來比較熱門的應(yīng)用安全解決方案褥伴,各大廠商都有自己的加固方案,常見的如騰訊樂固漾狼、360加固重慢、梆梆加固等等。
3). Native層增加簽名校驗逊躁,當發(fā)現(xiàn)apk簽名和我們自己的簽名不一致的時候似踱,調(diào)用so庫直接崩潰即可。
4). 獲取MANIFEST.MF文件中的classes.dex文件的SHA-1哈希值,通過后臺保存的初始值進行校驗核芽。
5). java層代碼中驗證簽名囚戚,這種純粹的字符比較都很容易破解掉。
6). 通過api和ApplicationInfo的flag判斷是否調(diào)試狀態(tài)狞洋,碰到調(diào)試器動態(tài)調(diào)試即可果斷結(jié)束程序(打正式包時開啟此邏輯)
漏洞檢測工具
當項目代碼量龐大以后弯淘,積累了較多的歷史代碼,人工檢測代碼工作量大吉懊。這時庐橙,漏洞檢查工具就派上用場了,比較出名的有AndroBugs借嗽、YSO-Mobile Security Framework态鳖、FindBugs + FindSecurityBugs,而中文的漏洞檢測工具中比較有名的就是360的FireLine恶导。
FireLine介紹
優(yōu)勢:
1). 免費提供靜態(tài)代碼掃描服務(wù)
2). 用戶本機執(zhí)行浆竭,不收集任何數(shù)據(jù)
3). Studio中搜索plugins安裝
4). 掃描速度快
5). 中文描述掃描規(guī)則:
1). APP安全檢查
2). 代碼規(guī)范檢查
3). 內(nèi)存泄露檢查
4). 日志輸出檢查
5). 空指針檢查
6). 多線程檢查-
FireLine配置和運行
-
掃描完成后,在火線報告輸出路徑找到testReport.html惨寿,打開后可見邦泄,會看到列出你項目中存在的問題
-
圓形加好按鈕,點開就可展開顯示問題存在代碼中的位置
Android P 安全防護新特性
1). 統(tǒng)一身份驗證對話框
生物傳感器被廣泛應(yīng)用于身份認證裂垦,為了保障用戶在不同感應(yīng)器和應(yīng)用間能夠獲得一致的體驗 Android9操作顺囊。應(yīng)用不再需要自行設(shè)計對話框,而是通過調(diào)用BiometricPrompt API觸發(fā)系統(tǒng)對話框蕉拢。除指紋識別以外(包括屏幕下指紋識別)特碳,該API還支持面部識別以及虹膜識別。
2). 高可信度用戶確認
Android 9 新增了高可信度用戶確認 (Android Protected Confirmation) 晕换,該功能通過可信執(zhí)行環(huán)境 (TEE) 確保提示文本被真實用戶確認午乓。只有在用戶成功確認之后,TEE 才會簽發(fā)該文本闸准,該環(huán)境會對顯示的確認對話框以及用戶輸入進行保護益愈。
借助這個新增的 API,應(yīng)用可以利用 ConfirmationDialog 的實例向用戶顯示提示夷家,請他們批準一個簡短的聲明腕唧。 應(yīng)用可以通過這個聲明再次確認,用戶確實想完成一項敏感事務(wù)瘾英,例如付款枣接。
3). 加強密鑰安全保護
加入了一個新的 KeyStore 類 —— StrongBox,并提供相應(yīng)的 API 來支持安裝了 Android P 的受支持設(shè)備缺谴,該實現(xiàn)位于一個硬件安全性模塊內(nèi)但惶,其中包含了自己的 CPU耳鸯、安全存儲空間、真實隨機數(shù)生成器以及抵御軟件包篡改和未經(jīng)授權(quán)線刷應(yīng)用的附加機制膀曾。 檢查存儲在 StrongBox Keymaster 中的密鑰時县爬,系統(tǒng)會通過可信執(zhí)行環(huán)境 (TEE) 證實密鑰的完整性。支持以下算法和密鑰長度:
RSA 2048
AES 128 和 256
ECDSA P-256
HMAC-SHA256 (支持 8-64 字節(jié)密鑰長度添谊,含首末值)
Triple DES 168
4). DNS over TLS
Android 9 內(nèi)置對 DNS over TLS 的支持:若網(wǎng)絡(luò) DNS 服務(wù)器提供支持财喳,設(shè)備會自動將 DNS 查詢升級為 TLS 查詢。用戶可以通過更改 “網(wǎng)絡(luò)和互聯(lián)網(wǎng)” 設(shè)置下的隱私 DNS (Private DNS) 模式來管理 DNS over TLS 行為斩狱。自行運行 DNS 查詢的應(yīng)用可以通過調(diào)用新的 LinkProperties.isPrivateDnsActive() API 來獲取 DNS 模式相關(guān)信息耳高。
5). 默認使用 HTTPS
為了將所有網(wǎng)絡(luò)流量從明文 (未加密的HTTP) 逐步遷移至 TLS,更改了網(wǎng)絡(luò)安全配置的默認設(shè)置所踊,以阻止所有明文流量泌枪,強制應(yīng)用通過 TLS 建立網(wǎng)降連接,除非開發(fā)者明確允許特定域名使用明文傳輸秕岛。
6). 用戶隱私
系統(tǒng)禁止所有處于空閑狀態(tài)的應(yīng)用對話筒碌燕、攝像頭和所有 SensorManager 傳感器的訪問。
當應(yīng)用的 UID 空閑時继薛,麥克風將會報告 “無音頻信號”修壕,傳感器將會停止報告事件,應(yīng)用使用的攝像頭也會斷開連接遏考,并在應(yīng)用試圖訪問時生成錯誤慈鸠。
在大多數(shù)情況下,這些限制不會對現(xiàn)有應(yīng)用造成新的問題诈皿,但建議從應(yīng)用中移除此類傳感器請求林束。