自動(dòng)化檢測
360顯微鏡(完全免費(fèi)) http://appscan.360.cn/
阿里聚安全(部分收費(fèi))https://jaq.alibaba.com/gc/appsec/index.htm
apk安全知識(shí)庫 http://appscan.360.cn/vulner/list/
愛加密 加密/監(jiān)測app市場 看不到檢測結(jié)果 http://safe.ijiami.cn/
移動(dòng)APP漏洞自動(dòng)化檢測平臺(tái)建設(shè) https://security.tencent.com/index.php/blog/msg/109
幾維安全 http://www.kiwisec.com/
Android App 漏洞學(xué)習(xí)(一) https://mp.weixin.qq.com/s/aM3rIkwxE2LuE_1jSdWFkA
【過時(shí)】使用 Androl4b 進(jìn)行安卓 APP 安全測試
http://www.freebuf.com/articles/terminal/110374.html
2017.8.14親測不好用:android系統(tǒng)版本低造成應(yīng)用閃退,burp提示版本低且無法升級(jí),辦公等冗余應(yīng)用。
建議1:在虛擬機(jī)中的sdk manager升級(jí)android系統(tǒng)。
建議2:直接本機(jī)安裝必備的工具
apktool 下載完執(zhí)行腳本./apktool https://ibotpeaches.github.io/Apktool/install/
JD-GUI http://jd.benow.ca/ 直接下載打開即可
android虛擬機(jī),或者真機(jī)調(diào)試
使用apktool
檢測網(wǎng)絡(luò)傳輸中的問題 - 使用Android調(diào)試橋 adb 給android虛擬設(shè)備安裝apk
adb
https://developer.android.com/studio/command-line/adb.html?hl=zh-cn
在本機(jī)終端某目錄下有下x.apk 安裝到虛擬機(jī)中:
adb install /home/andro/Desktop/x.apk
為虛擬設(shè)備設(shè)置代理 Burp Suite抓包
虛擬設(shè)備終端執(zhí)行:
emulator -avd lab -no-audio -http-proxy http://127.0.0.1:8888
打開burp:
Applications->tools->BurpSuite
apktool - apk逆向工具
安裝步驟:
https://ibotpeaches.github.io/Apktool/install/
apktool d testapp.apk
反編譯后得到”testapp”目錄,中有一個(gè)AndroidManifest.xml文件
Drozer – Android APP 安全評(píng)估工具
移動(dòng)終端APP安全評(píng)估
App代碼安全:代碼混淆/加密/app加殼
App數(shù)據(jù)存儲(chǔ)安全:數(shù)據(jù)持久化時(shí)要加密
App網(wǎng)絡(luò)傳輸安全:指對(duì)數(shù)據(jù)從客戶端傳輸?shù)絊erver中間過程的加密,防止網(wǎng)絡(luò)世界當(dāng)中其他節(jié)點(diǎn)對(duì)數(shù)據(jù)的竊聽。
重放攻擊 - 時(shí)間戳(加密處理)
數(shù)據(jù)的加密(完整性校驗(yàn))
明文傳輸
使用http協(xié)議明文傳輸用戶名和密碼,并未對(duì)用戶名和密碼進(jìn)行加密處理。通過監(jiān)控網(wǎng)絡(luò)數(shù)據(jù)就可以截獲到用戶名和用戶密碼數(shù)據(jù),導(dǎo)致用戶信息泄露,給用戶帶來安全風(fēng)險(xiǎn)。
關(guān)鍵數(shù)據(jù)明文傳輸
客戶端安全(數(shù)據(jù)錄入)
客戶端到服務(wù)器安全(數(shù)據(jù)傳輸)
服務(wù)器端安全(數(shù)據(jù)存儲(chǔ))
無論客戶端,server還是網(wǎng)絡(luò)傳輸都要避免明文密碼,要使用hash值。客戶端不要做任何密碼相關(guān)的存儲(chǔ),hash值也不行。存儲(chǔ)token進(jìn)行下一次的認(rèn)證,而且token需要設(shè)置有效期,使用refresh token去申請(qǐng)新的token。
APP二次打包
即反編譯后重新加入惡意的代碼邏輯,或置入新病毒重新生成一個(gè)新APK文件。
盡量使用https
https可以過濾掉大部分的安全問題。https在證書申請(qǐng),服務(wù)器配置,性能優(yōu)化,客戶端配置上都需要投入精力,所以缺乏安全意識(shí)的開發(fā)人員容易跳過https,或者拖到以后遇到問題再優(yōu)化。https除了性能優(yōu)化麻煩一些以外其他都比想象中的簡單,如果沒精力優(yōu)化性能,至少在注冊(cè)登錄模塊需要啟用https,這部分業(yè)務(wù)對(duì)性能要求比較低。
不要使用301跳轉(zhuǎn)
301跳轉(zhuǎn)很容易被Http劫持攻擊。移動(dòng)端看不到瀏覽器地址,無法察覺到被重定向到了其他地址。
如果一定要使用301確保跳轉(zhuǎn)發(fā)生在https的環(huán)境下,而且https做了證書綁定校驗(yàn)。
HTTPS中間人劫持漏洞
中間人攻擊是指攻擊者與通訊的兩端分別創(chuàng)建獨(dú)立的聯(lián)系,并交換其所收到的數(shù)據(jù),使通訊的兩端認(rèn)為他們正在通過一個(gè)私密的連接與對(duì)方直接對(duì)話,但事實(shí)上攻擊者攔截通訊雙方的通話并插入新的內(nèi)容。
HTTPS中間人攻擊漏洞有以下來源:
沒有對(duì)SSL證書進(jìn)行校驗(yàn)。
沒有對(duì)域名進(jìn)行校驗(yàn)。
證書頒發(fā)機(jī)構(gòu)(Certification Authority)被攻擊,導(dǎo)致私鑰泄露等。
示例:
實(shí)現(xiàn)的X509TrustManager接口的Java代碼片段 【其中的checkServerTrusted()方法實(shí)現(xiàn)為空,即不檢查服務(wù)器是否可信】:
接受任意域名的Java代碼片段
攻擊效果:
某App中添加收貨地址,使用中間人劫持能獲取到手機(jī)號(hào)、地址、姓名等敏感信息。
我們從上面的攻擊效果可以看出來,利用中間人劫持漏洞,攻擊者可通過中間人攻擊(比如使用釣魚WiFi),盜取賬戶密碼明文、聊天內(nèi)容、通訊地址、電話號(hào)碼以及信用卡支付信息等敏感信息,甚至通過中間人劫持將原有信息替換成惡意鏈接或惡意代碼程序,以達(dá)到遠(yuǎn)程控制、惡意扣費(fèi)等攻擊意圖。
在各大漏洞平臺(tái)上,有大量存在HTTPS證書不校驗(yàn)漏洞, 例如國內(nèi)絕大部分Android APP存在信任所有證書漏洞、亞馬遜最新官方Android版存在一處信任所有證書漏洞、Yahoo雅虎在國內(nèi)訪問遭遇SSL中間人攻擊、攜程旅游網(wǎng)最新Android客戶端https未校驗(yàn)證書導(dǎo)致https通信內(nèi)容完全被捕獲。
登錄安全性
暴力破解
安全鍵盤
使用他人手機(jī)號(hào) 任意注冊(cè)
賬號(hào)找回
撞庫
權(quán)限問題
垂直越權(quán)(管理員)
水平越權(quán)
加密算法漏洞
以下幾種行為會(huì)有產(chǎn)生加密算法漏洞的危險(xiǎn):
使用AES/DES/DESede加密算法時(shí),如果使用ECB模式,容易受到攻擊風(fēng)險(xiǎn),造成信息泄露。
代碼中生成秘鑰時(shí)使用明文硬編碼,易被輕易破解。
使用不安全的Hash算法(MD5/SHA-1)加密信息,易被破解。
生成的隨機(jī)數(shù)具有確定性,存在被破解的風(fēng)險(xiǎn)。
而加密信息被破解后,產(chǎn)生的危害也就不言而喻了: 加密信息被泄露。如果加密的是賬號(hào)、密碼、銀行卡、身份證等信息,破解后可被不法分子用于詐騙、盜號(hào)、盜刷等。
相關(guān)案例:
某互聯(lián)網(wǎng)金融APP加密算法被破解導(dǎo)致敏感信息泄露
某P2P應(yīng)用客戶端,用來加密數(shù)據(jù)的DES算法的密鑰硬編碼在Java代碼中,而DES算法是對(duì)稱密碼算法,既加密密鑰和解密密鑰相同。知道了密文和加密算法以及密鑰,通過解密操作,可以從文件中恢復(fù)出原始的手勢密碼。
Android組件權(quán)限保護(hù)
禁止App內(nèi)部組件被任意第三方程序調(diào)用。
若需要供外部調(diào)用的組件,應(yīng)檢查對(duì)調(diào)用者是否做了簽名限制
APP 更新
部分 APP 更新會(huì)通過接口傳輸一個(gè)是否更新的字段,如果存在新版本,接口會(huì)同時(shí)返回一個(gè)下載地址。如果網(wǎng)絡(luò)被劫持了,劫持者就可以偽造接口,接口數(shù)據(jù)返回 APP 需要更新,但是更新地址卻是攻擊者指定的其它地址,那就可能造成 APP 下載攻擊者指定的 APP 的情況出現(xiàn)。
解決這個(gè)問題也簡單,數(shù)據(jù)包里加一個(gè)完整性的校驗(yàn),當(dāng)客戶端發(fā)現(xiàn)數(shù)據(jù)包被篡改時(shí)可自動(dòng)注銷或提示用戶存在風(fēng)險(xiǎn)。進(jìn)一步的,對(duì)下載的 apk 進(jìn)行簽名校驗(yàn)~
表單的 XSS 攻擊
APP 中會(huì)出現(xiàn)一些需要用戶輸入的地方,輸入之后往往需要在 web/wap 端展現(xiàn),這里的輸入就需要做 xss 過濾。
xss 是攻擊的一個(gè)重要領(lǐng)域,這里不細(xì)說,防 xss 也有很多比較成熟的解決方式,只要服務(wù)器做好相應(yīng)的過濾基本不會(huì)出現(xiàn)太大問題。
京東金融App 用戶反饋 盲打
</textarea>'"><script src=http://*******></script>
代碼安全
可運(yùn)行于虛擬機(jī)
代碼未混淆,可直接逆向
webview 非法 URL
我們通常會(huì)使用 webview 加載部分內(nèi)容,由于 webview 通常是作為 APP 的一部分而存在的,所以 webview 通常提供與 APP 一致的用戶體驗(yàn)。
另一個(gè)背景是 APP 通常有一種外部喚起的機(jī)制,通過某特殊方式喚起 APP。
如果上面兩個(gè)條件均滿足,APP 支持外部喚起打開 webview。如果喚起之后打開的是攻擊者的釣魚頁面,釣魚頁面引導(dǎo)用戶輸入用戶名密碼等信息,就會(huì)導(dǎo)致用戶信息泄露。
解決辦法也是對(duì) webview 打開的網(wǎng)址進(jìn)行校驗(yàn),校驗(yàn)不通過提示風(fēng)險(xiǎn)。
正則校驗(yàn)被繞過:
淘寶客戶端某漏洞導(dǎo)致可以大規(guī)模釣魚獲取淘寶賬號(hào)
本地存儲(chǔ)安全性
iOS 的 APP 存儲(chǔ)空間是不能相互訪問的。
下載團(tuán)貸網(wǎng)IOS客戶端
使用iTools打開,找到存儲(chǔ)cookie的文件(其實(shí)這和明文存儲(chǔ)密碼威脅一樣)
sqlite3 數(shù)據(jù)庫
Android 可以把隱私相關(guān)文件設(shè)置為 PRIVATE 來拒絕用戶以及其它 APP 訪問。
WebView漏洞
應(yīng)用中存在WebView漏洞,沒有對(duì)注冊(cè)JAVA類的方法調(diào)用進(jìn)行限制,導(dǎo)致攻擊者可以利用反射機(jī)制調(diào)用未注冊(cè)的其他任何JAVA類,最終導(dǎo)致javascript代碼對(duì)設(shè)備進(jìn)行任意攻擊。
整改建議
通過在Java的遠(yuǎn)程方法上面聲明一個(gè)@JavascriptInterface 來代替addjavascriptInterface;
在使用js2java的bridge時(shí)候,需要對(duì)每個(gè)傳入的參數(shù)進(jìn)行驗(yàn)證,屏蔽攻擊代碼;
Note :控制相關(guān)權(quán)限或者盡可能不要使用js2java 的bridge 。
AndroidManifest解讀
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2013 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
<!-- java主程序包的包名,也是一個(gè)應(yīng)用進(jìn)程的默認(rèn)名稱-->
package="com.example.android.basiccontactables"
<!-- 代表app更新過多少次-->
android:versionCode="1"
<!-- App版本號(hào)-->
android:versionName="1.0" >
<!-- 描述api level,指定支持的最小版本,目標(biāo)版本以及最大版本;-->
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="20" >
<!-- 申請(qǐng)系統(tǒng)權(quán)限-->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!-- Min/target SDK versions (<uses-sdk>) managed by build.gradle 最小版本號(hào) -->
<!-- 提供了供其他程序使用的權(quán)限-->
<permission android:name="android"></permission>
<application
<!-- 將程序加入到系統(tǒng)的備份和恢復(fù)架構(gòu)中-->
android:allowBackup="true"
<!-- 應(yīng)用配置細(xì)節(jié)
icon是圖標(biāo);
label是程序名稱顯示在titlebar中的
theme是整個(gè)程序的主題,這里是自己文件定義的主題,如果想用android的就是@android:style/Theme再加alt+/就可以隨便選了-->
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.Sample" >
<!-- activity配置-->
<activity
android:name="com.example.android.basiccontactables.MainActivity"
<!-- activity顯示的模式-->
android:label="@string/app_name"
android:screenOrientation="portrait"
<!-- activity的四種啟動(dòng)模式:standard、singleTop、singleTask、singleInstance-->
android:launchMode="singleTop">
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
<!-- 來對(duì)系統(tǒng)中intent進(jìn)行過濾處理,action標(biāo)簽用于描述具體消息的名稱,category標(biāo)簽用于表示能處理消息組件的類別,data標(biāo)簽則用于描述消息需要處理的數(shù)據(jù)格式;-->
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- service配置-->
<service >
<intent-filter >
<action />
<category />
<data />
</intent-filter>
<!-- 服務(wù)開關(guān)android:enabled-->
android:enabled=["true" | "false"]
<!-- 組件是私有的還是公有的,公有組件能夠被外部應(yīng)用使用。注意content provider默認(rèn)是公有的true,其余組件默認(rèn)是私有的false-->
android:exported[="true" | "false"]
</service>
<!-- Broadcast Receive配置 -->
<receiver >
<intent-filter />
<meta-data />
</receiver>
<!-- content Provider配置 -->
<provider >
<grant-uri-permission />
<meta-data />
<path-permission />
</provider>
<!-- 程序需要的外部庫 -->
<uses-library />
</application> </manifest>
2017年度移動(dòng)App安全漏洞與數(shù)據(jù)泄露現(xiàn)狀報(bào)告
Activity公開組件暴露
Broadcast Receiver組件調(diào)用漏洞
Service組件任意調(diào)用漏洞
運(yùn)行其它可執(zhí)行程序漏洞
應(yīng)用反編譯
硬編碼敏感信息泄露漏洞
本地拒絕服務(wù)漏洞
外部存儲(chǔ)設(shè)備信息泄露漏洞
PendingIntent包含隱式Intent信息泄露漏洞
Android App allowBackup安全漏洞
360
程序可被任意調(diào)試
風(fēng)險(xiǎn)描述
安卓AndroidManifest.xml文件中android:debuggable為true。
危害描述
app可以被任意調(diào)試。
修復(fù)建議
AndroidManifest.xml 配置文件中中設(shè)置為android:Debugable="false"。
參考鏈接
https://developer.android.com/guide/topics/manifest/application-element.html#debug
程序數(shù)據(jù)任意備份
風(fēng)險(xiǎn)描述
安卓AndroidManifest.xml文件中android: allowBackup=true
屬性allowBackup=true
當(dāng)allowBackup標(biāo)志為true時(shí),用戶可通過adb backup來進(jìn)行對(duì)應(yīng)用數(shù)據(jù)的備份,在無root的情況下可以導(dǎo)出應(yīng)用中存儲(chǔ)的所有數(shù)據(jù),造成用戶數(shù)據(jù)的嚴(yán)重泄露。
整改建議
將參數(shù)android:allowBackup屬性設(shè)置為false,不能對(duì)應(yīng)用數(shù)據(jù)備份。
危害描述
app數(shù)據(jù)可以被備份導(dǎo)出。
修復(fù)建議
AndroidManifest.xml 配置文件中中設(shè)置為android:allowBackup="false"。
參考鏈接
https://developer.android.com/guide/topics/manifest/application-element.html#allowbackup
Activity組件暴露
風(fēng)險(xiǎn)描述
Activity組件的屬性exported被設(shè)置為true或是未設(shè)置exported值但I(xiàn)ntentFilter不為空時(shí),activity被認(rèn)為是導(dǎo)出的,可通過設(shè)置相應(yīng)的Intent喚起activity。
危害描述
黑客可能構(gòu)造惡意數(shù)據(jù)針對(duì)導(dǎo)出activity組件實(shí)施越權(quán)攻擊。
修復(fù)建議
如果組件不需要與其他app共享數(shù)據(jù)或交互,請(qǐng)將AndroidManifest.xml 配置文件中設(shè)置該組件為exported = “False”。如果組件需要與其他app共享數(shù)據(jù)或交互, 請(qǐng)對(duì)組件進(jìn)行權(quán)限控制和參數(shù)校驗(yàn)。
參考鏈接
https://developer.android.com/guide/components/activities.html
Service組件暴露
風(fēng)險(xiǎn)描述
Service組件的屬性exported被設(shè)置為true或是未設(shè)置exported值但I(xiàn)ntentFilter不為空時(shí),Service被認(rèn)為是導(dǎo)出的,可通過設(shè)置相應(yīng)的Intent喚起Service。
危害描述
黑客可能構(gòu)造惡意數(shù)據(jù)針對(duì)導(dǎo)出Service組件實(shí)施越權(quán)攻擊。
修復(fù)建議
如果組件不需要與其他app共享數(shù)據(jù)或交互,請(qǐng)將AndroidManifest.xml 配置文件中設(shè)置該組件為exported = “False”。如果組件需要與其他app共享數(shù)據(jù)或交互, 請(qǐng)對(duì)組件進(jìn)行權(quán)限控制和參數(shù)校驗(yàn)。
參考鏈接
https://developer.android.com/guide/components/services.html
ContentProvider組件暴露
風(fēng)險(xiǎn)描述
Content Provider組件的屬性exported被設(shè)置為true或是Android API<=16時(shí),Content Provider被認(rèn)為是導(dǎo)出的。
危害描述
黑客可能訪問到應(yīng)用本身不想共享的數(shù)據(jù)或文件。
修復(fù)建議
如果組件不需要與其他app共享數(shù)據(jù)或交互,請(qǐng)將AndroidManifest.xml 配置文件中設(shè)置該組件為exported = “False”。如果組件需要與其他app共享數(shù)據(jù)或交互, 請(qǐng)對(duì)組件進(jìn)行權(quán)限控制和參數(shù)校驗(yàn)。
參考鏈接
https://developer.android.com/guide/topics/providers/content-providers.html
BroadcastReceiver組件暴露
風(fēng)險(xiǎn)描述
BroadcastReceiver組件的屬性exported被設(shè)置為true或是未設(shè)置exported值但I(xiàn)ntentFilter不為空時(shí),BroadcastReceiver被認(rèn)為是導(dǎo)出的。
危害描述
導(dǎo)出的廣播可以導(dǎo)致數(shù)據(jù)泄漏或者是越權(quán)。
修復(fù)建議
如果組件不需要與其他app共享數(shù)據(jù)或交互,請(qǐng)將AndroidManifest.xml 配置文件中設(shè)置該組件為exported = “False”。如果組件需要與其他app共享數(shù)據(jù)或交互, 請(qǐng)對(duì)組件進(jìn)行權(quán)限控制和參數(shù)校驗(yàn)。
參考鏈接
https://developer.android.com/guide/topics/manifest/receiver-element.html
Webview存在本地Java接口
風(fēng)險(xiǎn)描述
android的webView組件有一個(gè)非常特殊的接口函數(shù)addJavascriptInterface,能實(shí)現(xiàn)本地java與js之間交互。
危害描述
在targetSdkVersion小于17時(shí),攻擊者利用 addJavascriptInterface這個(gè)接口添加的函數(shù),可以遠(yuǎn)程執(zhí)行任意代碼。
修復(fù)建議
建議開發(fā)者不要使用addJavascriptInterface,使用注入javascript和第三方協(xié)議的替代方案。
參考鏈接
https://developer.android.com/reference/android/webkit/WebView.html
SSL通信服務(wù)端檢測信任任意證書
風(fēng)險(xiǎn)描述
自定義SSL x509 TrustManager,重寫checkServerTrusted方法,方法內(nèi)不做任何服務(wù)端的證書校驗(yàn)。
危害描述
黑客可以使用中間人攻擊獲取加密內(nèi)容。
修復(fù)建議
嚴(yán)格判斷服務(wù)端和客戶端證書校驗(yàn),對(duì)于異常事件禁止return 空或者null。
參考鏈接
https://developer.android.com/reference/javax/net/ssl/X509TrustManager.html
隱式意圖調(diào)用
風(fēng)險(xiǎn)描述
封裝Intent時(shí)采用隱式設(shè)置,只設(shè)定action,未限定具體的接收對(duì)象,導(dǎo)致Intent可被其他應(yīng)用獲取并讀取其中數(shù)據(jù)。
危害描述
Intent隱式調(diào)用發(fā)送的意圖可能被第三方劫持,可能導(dǎo)致內(nèi)部隱私數(shù)據(jù)泄露。
修復(fù)建議
將隱式調(diào)用改為顯式調(diào)用。
參考鏈接
https://developer.android.com/guide/components/intents-filters.html
WebView忽略SSL證書錯(cuò)誤
風(fēng)險(xiǎn)描述
WebView調(diào)用onReceivedSslError方法時(shí),直接執(zhí)行handler.proceed()來忽略該證書錯(cuò)誤。
危害描述
忽略SSL證書錯(cuò)誤可能引起中間人攻擊。
修復(fù)建議
不要重寫onReceivedSslError方法, 或者對(duì)于SSL證書錯(cuò)誤問題按照業(yè)務(wù)場景判斷,避免造成數(shù)據(jù)明文傳輸情況。
參考鏈接
https://developer.android.com/reference/android/webkit/WebViewClient.html
HTTPS關(guān)閉主機(jī)名驗(yàn)證
風(fēng)險(xiǎn)描述
構(gòu)造HttpClient時(shí),設(shè)置HostnameVerifier時(shí)參數(shù)使用ALLOW_ALL_HOSTNAME_VERIFIER或空的HostnameVerifier。
危害描述
關(guān)閉主機(jī)名校驗(yàn)可以導(dǎo)致黑客使用中間人攻擊獲取加密內(nèi)容。
修復(fù)建議
APP在使用SSL時(shí)沒有對(duì)證書的主機(jī)名進(jìn)行校驗(yàn),信任任意主機(jī)名下的合法的證書,導(dǎo)致加密通信可被還原成明文通信,加密傳輸遭到破壞。
參考鏈接
https://developer.android.com/reference/javax/net/ssl/HostnameVerifier.html
Intent Scheme URLs攻擊
風(fēng)險(xiǎn)描述
在AndroidManifast.xml設(shè)置Scheme協(xié)議之后,可以通過瀏覽器打開對(duì)應(yīng)的Activity。
危害描述
攻擊者通過訪問瀏覽器構(gòu)造Intent語法喚起app相應(yīng)組件,輕則引起拒絕服務(wù),重則可能演變?yōu)樘釞?quán)漏洞。
修復(fù)建議
配置category filter, 添加android.intent.category.BROWSABLE方式規(guī)避風(fēng)險(xiǎn)
參考鏈接
https://developer.android.com/guide/components/intents-filters.html
全局文件可讀
風(fēng)險(xiǎn)描述
APP在創(chuàng)建內(nèi)部存儲(chǔ)文件時(shí),將文件設(shè)置了全局的可讀權(quán)限。
危害描述
攻擊者惡意讀取文件內(nèi)容,獲取敏感信息。
修復(fù)建議
請(qǐng)開發(fā)者確認(rèn)該文件是否存儲(chǔ)敏感數(shù)據(jù),如存在相關(guān)數(shù)據(jù),請(qǐng)去掉文件全局可讀屬性。
參考鏈接
https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE
全局文件可寫
風(fēng)險(xiǎn)描述
APP在創(chuàng)建內(nèi)部存儲(chǔ)文件時(shí),將文件設(shè)置了全局的可寫權(quán)限。
危害描述
攻擊者惡意寫文件內(nèi)容,破壞APP的完整性。
修復(fù)建議
請(qǐng)開發(fā)者確認(rèn)該文件是否存儲(chǔ)敏感數(shù)據(jù),如存在相關(guān)數(shù)據(jù),請(qǐng)去掉文件全局可寫屬性。
參考鏈接
https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_WRITEABLE
全局文件可讀可寫
風(fēng)險(xiǎn)描述
APP在創(chuàng)建內(nèi)部存儲(chǔ)文件時(shí),將文件設(shè)置了全局的可讀寫權(quán)限。
危害描述
攻擊者惡意寫文件內(nèi)容或者,破壞APP的完整性,或者是攻擊者惡意讀取文件內(nèi)容,獲取敏感信息。。
修復(fù)建議
請(qǐng)開發(fā)者確認(rèn)該文件是否存儲(chǔ)敏感數(shù)據(jù),如存在相關(guān)數(shù)據(jù),請(qǐng)去掉文件全局可寫、寫屬性。
參考鏈接
https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_WRITEABLEhttps://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE
SSL通信客戶端檢測信任任意證書
風(fēng)險(xiǎn)描述
自定義SSL x509 TrustManager,重寫checkClientTrusted方法,方法內(nèi)不做任何服務(wù)端的證書校驗(yàn)。
危害描述
黑客可以使用中間人攻擊獲取加密內(nèi)容。
修復(fù)建議
嚴(yán)格判斷服務(wù)端和客戶端證書校驗(yàn),對(duì)于異常事件禁止return 空或者null。
參考鏈接
https://developer.android.com/reference/javax/net/ssl/X509TrustManager.html
配置文件可讀
風(fēng)險(xiǎn)描述
使用getSharedPreferences打開文件,第二個(gè)參數(shù)設(shè)置為MODE_WORLD_READABLE。
危害描述
當(dāng)前文件可以被其他應(yīng)用讀取,導(dǎo)致信息泄漏。
修復(fù)建議
使用getSharedPreferences時(shí)第二個(gè)參數(shù)設(shè)置為MODE_PRIVATE;如果必須設(shè)置為全局可讀模式供其他程序使用,請(qǐng)保證存儲(chǔ)的數(shù)據(jù)非隱私數(shù)據(jù)或是加密后存儲(chǔ)。
參考鏈接
[https://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String](https://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String), int)https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE
配置文件可寫
風(fēng)險(xiǎn)描述
使用getSharedPreferences打開文件,第二個(gè)參數(shù)設(shè)置為MODE_WORLD_WRITEABLE。
危害描述
當(dāng)前文件可以被其他應(yīng)用寫入,導(dǎo)致文件內(nèi)容被篡改,可能導(dǎo)致影響應(yīng)用程序的正常運(yùn)行或更嚴(yán)重的問題。
修復(fù)建議
使用getSharedPreferences時(shí)第二個(gè)參數(shù)必須設(shè)置為MODE_PRIVATE。
參考鏈接
[https://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String](https://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String), int)https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_WRITEABLE
配置文件可讀可寫
風(fēng)險(xiǎn)描述
使用getSharedPreferences打開文件時(shí),如果將第二個(gè)參數(shù)設(shè)置為MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE。
危害描述
當(dāng)前文件可以被其他應(yīng)用讀取和寫入,導(dǎo)致信息泄漏、文件內(nèi)容被篡改,影響應(yīng)用程序的正常運(yùn)行或更嚴(yán)重的問題。
修復(fù)建議
使用getSharedPreferences時(shí)第二個(gè)參數(shù)設(shè)置為MODE_PRIVATE。禁止使用MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE模式。
參考鏈接
[https://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String](https://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String), int)https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_WRITEABLEhttps://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE
DEX文件動(dòng)態(tài)加載
風(fēng)險(xiǎn)描述
使用DexClassLoader加載外部的 apk、jar 或 dex文件,當(dāng)外部文件的來源無法控制時(shí)或是被篡改,此時(shí)無法保證加載的文件是否安全。
危害描述
加載惡意的dex文件將會(huì)導(dǎo)致任意命令的執(zhí)行。
修復(fù)建議
加載外部文件前,必須使用校驗(yàn)簽名或MD5等方式確認(rèn)外部文件的安全性。
參考鏈接
https://developer.android.com/reference/dalvik/system/DexClassLoader.html
AES弱加密
風(fēng)險(xiǎn)描述
在AES加密時(shí),使用“AES/ECB/NoPadding”或“AES/ECB/PKCS5padding”的模式。
危害描述
ECB是將文件分塊后對(duì)文件塊做同一加密,破解加密只需要針對(duì)一個(gè)文件塊進(jìn)行解密,降低了破解難度和文件安全性。
修復(fù)建議
禁止使用AES加密的ECB模式,顯式指定加密算法為:CBC或CFB模式,可帶上PKCS5Padding填充。AES密鑰長度最少是128位,推薦使用256位。
參考鏈接
https://developer.android.com/reference/javax/crypto/Cipher.html
Provider文件目錄遍歷
風(fēng)險(xiǎn)描述
當(dāng)Provider被導(dǎo)出且覆寫了openFile方法時(shí),沒有對(duì)Content Query Uri進(jìn)行有效判斷或過濾。
危害描述
攻擊者可以利用openFile()接口進(jìn)行文件目錄遍歷以達(dá)到訪問任意可讀文件的目的。
修復(fù)建議
一般情況下無需覆寫openFile方法,如果必要,對(duì)提交的參數(shù)進(jìn)行“../”目錄跳轉(zhuǎn)符或其他安全校驗(yàn)。
參考鏈接
[https://developer.android.com/reference/android/content/ContentProvider.html#openFile(android.net.Uri](https://developer.android.com/reference/android/content/ContentProvider.html#openFile(android.net.Uri), java.lang.String)
activity綁定browserable與自定義協(xié)議
風(fēng)險(xiǎn)描述
activity設(shè)置“android.intent.category.BROWSABLE”屬性并同時(shí)設(shè)置了自定義的協(xié)議android:scheme意味著可以通過瀏覽器使用自定義協(xié)議打開此activity。
危害描述
可能通過瀏覽器對(duì)app進(jìn)行越權(quán)調(diào)用。
修復(fù)建議
app對(duì)外部調(diào)用過程和傳輸數(shù)據(jù)進(jìn)行安全檢查或檢驗(yàn)。
參考鏈接
https://developer.android.com/reference/android/content/Intent.html#CATEGORY_BROWSABLE
動(dòng)態(tài)注冊(cè)廣播
風(fēng)險(xiǎn)描述
使用registerReceiver動(dòng)態(tài)注冊(cè)的廣播在組件的生命周期里是默認(rèn)導(dǎo)出的。
危害描述
導(dǎo)出的廣播可以導(dǎo)致拒絕服務(wù)、數(shù)據(jù)泄漏或是越權(quán)調(diào)用。
修復(fù)建議
使用帶權(quán)限檢驗(yàn)的registerReceiver API進(jìn)行動(dòng)態(tài)廣播的注冊(cè)。
參考鏈接
[https://developer.android.com/reference/android/content/Context.html#registerReceiver(android.content.BroadcastReceiver](https://developer.android.com/reference/android/content/Context.html#registerReceiver(android.content.BroadcastReceiver), android.content.IntentFilter, java.lang.String, android.os.Handler)
開放socket端口
風(fēng)險(xiǎn)描述
app綁定端口進(jìn)行監(jiān)聽,建立連接后可接收外部發(fā)送的數(shù)據(jù)。
危害描述
攻擊者可構(gòu)造惡意數(shù)據(jù)對(duì)端口進(jìn)行測試,對(duì)于綁定了IP 0.0.0.0的app可發(fā)起遠(yuǎn)程攻擊。
修復(fù)建議
如無必要,只綁定本地ip127.0.0.1,并且對(duì)接收的數(shù)據(jù)進(jìn)行過濾、驗(yàn)證。
Fragment注入
風(fēng)險(xiǎn)描述
通過導(dǎo)出的PreferenceActivity的子類,沒有正確處理Intent的extra值。
危害描述
攻擊者可繞過限制訪問未授權(quán)的界面。
修復(fù)建議
當(dāng)targetSdk大于等于19時(shí),強(qiáng)制實(shí)現(xiàn)了isValidFragment方法;小于19時(shí),在PreferenceActivity的子類中都要加入isValidFragment ,兩種情況下在isValidFragment 方法中進(jìn)行fragment名的合法性校驗(yàn)。
webview明文存儲(chǔ)密碼
風(fēng)險(xiǎn)描述
Webview中使用setSavePassword(true),保存在WebView中輸入的用戶名和密碼到應(yīng)用數(shù)據(jù)目錄的databases/webview.db中。
危害描述
當(dāng)手機(jī)是root或是通過其他漏洞獲取webview.db的內(nèi)容時(shí),將會(huì)造成用戶敏感數(shù)據(jù)的泄漏。
修復(fù)建議
使用WebView.getSettings().setSavePassword(false)來禁止保存密碼。
參考鏈接
https://developer.android.com/reference/android/webkit/WebSettings.html#setSavePassword(boolean
unzip解壓縮
風(fēng)險(xiǎn)描述
解壓 zip文件,使用getName()獲取壓縮文件名后未對(duì)名稱進(jìn)行校驗(yàn)。
危害描述
攻擊者可構(gòu)造惡意zip文件,被解壓的文件將會(huì)進(jìn)行目錄跳轉(zhuǎn)被解壓到其他目錄,覆蓋相應(yīng)文件導(dǎo)致任意代碼執(zhí)行。
修復(fù)建議
解壓文件時(shí),判斷文件名是否有../特殊字符。
參考鏈接
https://developer.android.com/reference/java/util/zip/ZipEntry.html#getName()
未使用編譯器堆棧保護(hù)技術(shù)
風(fēng)險(xiǎn)描述
為了檢測棧中的溢出,引入了Stack Canaries漏洞緩解技術(shù)。在所有函數(shù)調(diào)用發(fā)生時(shí),向棧幀內(nèi)壓入一個(gè)額外的被稱作canary的隨機(jī)數(shù),當(dāng)棧中發(fā)生溢出時(shí),canary將被首先覆蓋,之后才是EBP和返回地址。在函數(shù)返回之前,系統(tǒng)將執(zhí)行一個(gè)額外的安全驗(yàn)證操作,將棧幀中原先存放的canary和.data中副本的值進(jìn)行比較,如果兩者不吻合,說明發(fā)生了棧溢出。
危害描述
不使用Stack Canaries棧保護(hù)技術(shù),發(fā)生棧溢出時(shí)系統(tǒng)并不會(huì)對(duì)程序進(jìn)行保護(hù)。
修復(fù)建議
使用NDK編譯so時(shí),在Android.mk文件中添加:LOCAL_CFLAGS := -Wall -O2 -U_FORTIFY_SOURCE -fstack-protector-all
參考鏈接
https://en.wikipedia.org/wiki/Stack_buffer_overflow#Stack_canaries
未使用地址空間隨機(jī)化技術(shù)
風(fēng)險(xiǎn)描述
PIE全稱Position Independent Executables,是一種地址空間隨機(jī)化技術(shù)。當(dāng)so被加載時(shí),在內(nèi)存里的地址是隨機(jī)分配的。
危害描述
不使用PIE,將會(huì)使得shellcode的執(zhí)行難度降低,攻擊成功率增加。
修復(fù)建議
NDK編譯so時(shí),加入LOCAL_CFLAGS := -fpie -pie開啟對(duì)PIE的支持。
參考鏈接
https://en.wikipedia.org/wiki/Position-independent_code#Position-independent_executables
動(dòng)態(tài)鏈接庫中包含執(zhí)行命令函數(shù)
風(fēng)險(xiǎn)描述
在native程序中,有時(shí)需要執(zhí)行系統(tǒng)命令,在接收外部傳入的參數(shù)執(zhí)行命令時(shí)沒有做過濾或檢驗(yàn)。
危害描述
攻擊者傳入任意命令,導(dǎo)致惡意命令的執(zhí)行。
修復(fù)建議
對(duì)傳入的參數(shù)進(jìn)行嚴(yán)格的過濾。
參考鏈接
http://baike.baidu.com/subview/627587/14965930.htm#2
隨機(jī)數(shù)不安全使用
風(fēng)險(xiǎn)描述
調(diào)用SecureRandom類中的setSeed方法。
危害描述
生成的隨機(jī)數(shù)具有確定性,存在被破解的可能性。
修復(fù)建議
使用/dev/urandom或者/dev/random來初始化偽隨機(jī)數(shù)生成器。
參考鏈接
https://developer.android.com/reference/java/security/SecureRandom.html#setSeed(long
FFmpeg文件讀取
風(fēng)險(xiǎn)描述
使用了低版本的FFmpeg庫進(jìn)行視頻解碼。
危害描述
在FFmpeg的某些版本中可能存在本地文件讀取漏洞,可以通過構(gòu)造惡意文件獲取本地文件內(nèi)容。
修復(fù)建議
升級(jí)FFmpeg庫到最新版。
參考鏈接
http://ffmpeg.org/
libupnp棧溢出漏洞
風(fēng)險(xiǎn)描述
使用了低于1.6.18版本的的libupnp庫文件。
危害描述
構(gòu)造惡意數(shù)據(jù)包可造成緩沖區(qū)溢出,造成代碼執(zhí)行。
修復(fù)建議
升級(jí)libupnp庫到1.6.18版本或以上。
參考鏈接
https://sourceforge.net/projects/pupnp/files/pupnp/libUPnP%201.6.18/
Webview組件遠(yuǎn)程代碼執(zhí)行(調(diào)用getClassLoader)
風(fēng)險(xiǎn)描述
使用低于17的targetSDKVersion,并且在Context子類中使用addJavascriptInterface綁定this對(duì)象。
危害描述
通過調(diào)用getClassLoader可以繞過google底層對(duì)getClass方法的限制。
修復(fù)建議
targetSDKVersion使用大于17的版本。
參考鏈接
https://developer.android.com/reference/android/content/Context.html#getClassLoader()
AES/DES硬編碼密鑰
風(fēng)險(xiǎn)描述
使用AES或DES加解密時(shí),采用硬編碼在程序中的密鑰。
危害描述
通過反編譯拿到密鑰可以輕易解密APP通信數(shù)據(jù)。
修復(fù)建議
密鑰加密存儲(chǔ)或是用過變形后進(jìn)行加解密運(yùn)算,切勿硬編碼到代碼中。
參考鏈接
[https://developer.android.com/reference/javax/crypto/spec/SecretKeySpec.html#SecretKeySpec(byte](https://developer.android.com/reference/javax/crypto/spec/SecretKeySpec.html#SecretKeySpec(byte)[], java.lang.String)