Android高階之十三講之安全方案

liuzxgeek發表於2016-12-14

本文來自http://blog.csdn.net/liuxian13183/ ,引用必須註明出處!


Android是開源的,內部API相對比較透明,因此App的威脅會多一些,瞭解一些安全知識,有助於使用者體驗和產品穩定性。

1、App元件方面,慎用android:export=true(Activity、Service、BroadcastReveiver如果元件有超過一個intent-filter則預設為true;ContentProvider在16即4.1系統及以下預設為true,以上為false;),防止被程式惡意呼叫;對放出的元件,進行許可權限制和資料校驗,Intent設定包名。

2、WebView使用webView.addJavaScriptInterface的方式注入開放給H5的介面,使用註解的方式@JavaScriptInterface來標明介面。

4.2以下防攻擊方案:http://blog.csdn.net/zhouyongyang621/article/details/47000041

3、防止反編譯,造成介面被攻擊、資料洩露,進行混淆加固處理;同時可以將apk的md5發給服務端進行校驗,如果二次打包,則可以分辨出;用Cipher對資料庫包括SharePreference加密,後者使用MODE_PRIVATE;核心功能寫入so,通過jni呼叫

4、防止DNS劫持,使用https加密傳輸;升級和下載時往往容易被劫持連結而下載別的App,同時防止被hook導致安裝其他路徑的安裝包。升級和下載使用https,安裝時要比較下載包的Md5與服務端返回是否一致、包名是否一致來保證下載包正常;將資料設定失效時間。

5、介面資料校驗,注意頻繁請求某一介面、虛擬註冊、驗證碼介面被刷,防止服務端被拖垮。

6、打包上傳後驗證簽名資訊,下載應用市場apk,解壓出META-INF下CERT.RSA檔案,使用如下命令檢視簽名

keytool printcert file METAINF/CERT.RSA

7、資料傳遞
 Collections.unmodifiableList(list);
上面的方法可使當前list無法再新增物件,保持資料傳遞的安全性。

8、某些敏感Api為防止hook,可以設定setAccessiable(false),使得無訪問許可權來保證業務層實現安全。

9、設定包名和許可權,防止部分攻擊(僅開啟此包下,具備此許可權的頁面)

Intent intent = new Intent("com.android.settings.action.SWITH_AGED_MODE");
intent.setPackage("com.android.settings");
sendBroadcast(intent,"com.android.settings.permission.SWITH_SETTING");

並對四大元件中傳遞的intent進行合法性校驗。

10、防禦措施一般如下三種:

第一、寄託在破壞攻擊者的工具。第二、寄託在Java層程式碼逆向、除錯和閱讀的難度。第三、寄託在c層程式碼逆向、除錯和閱讀的難度上。

  11、對於動態註冊的廣播,儘量使用LocalBroadcastReceiver來進行本地註冊,這樣只在本應用內通訊;如果使用registerReceiver()則要做好許可權控制。

附硬體資訊查詢方式,通過撥號盤輸入如下引數即可

12、onPause時,通過ProcessManager.getRunningAppProcess來檢測自己是否位於棧頂,防止第三方應用懸浮

13、使用TrustMangerFactory匯入證照,自籤校驗

14、getRecentTask,使自己的程式不可見

在AndroidManifest.xml配置android:exclueFromRecents=false或Intent設定此flag,僅5.0以下有效,以上底層已經封掉getRecentTask方法

15、android:allowBackup=“false” 防止設為true後,通過 adb backup 和adb restore來備份和恢復資料。

16、敏感資訊不要使用socket通訊,使用可以檢驗身份的方式會更好。

通用功能

程式碼 功能描述 備註
*#*#7780#*#* 恢復手機出廠設定,清除應用資料以及設定,移除手機繫結的谷歌賬號,解除安裝下載的應用 不會刪除系統內建應用,不會刪除SD Card上的檔案
*2767*3855# 重新安裝手機作業系統,恢復手機出廠狀態,刪除包括安裝在內部儲存上的所有APP並清除設定  
*#*#197328640#*#* 進入除錯模式  
*#*#4636#*#* 電話基本資訊,電話使用情況,電池資訊  
*#*#34971539#*#* 攝像頭系統資訊 注意不要點選不要點選升級攝像頭系統資訊,小心1秒變磚
*#*#7594#*#* 改變電源按鍵的功能,允許直接關機而不是詢問使用者選擇操作(無聲模式,飛航模式,關機)  
*#*#273283*255*663282*#*#* 備份所有的媒體檔案,開啟檔案拷貝介面讓你能夠備份圖片,視屏和音訊等媒體檔案  
*#*#8255#*#* 啟動GTalk服務監控  
*2767*4387264636* 顯示產品資訊  
*#0228# 顯示電池狀態  
*#12580*369* 軟體和硬體資訊  
*#32489# 檢視加密資訊  
*#273283*255*3282*# 資料建立選單  
*#3282*727336*# 資料使用狀態  
*#8736364# OTA升級選單  
##778 顯示EPST選單  
*#228# ADC讀取選單  

WIFI,GPS和藍芽檢測

程式碼 功能描述 備註
*#*#526#*#* WLAN檢測  
*#*#528#*#* WLAN測試  
*#*#232339#*#* WLAN測試  
*#*#232338#*#* 顯示WIFI網路卡的MAC地址  
*#*#1472365#*#* 快速GPS測試  
*#*#1575#*#* 不同型別的GPS測試  
*#*#232331#*#* 藍芽測試  
*#*#232337#*#* 顯示藍芽裝置地址  

系統韌體版本資訊

程式碼 功能描述 備註
*#*#1111#*#* FTA軟體版本  
*#*#2222#*#* FTA硬體版本  
*#*#4986*2650468#*#* 硬體資訊  
*#*#1234#*#* PDA和手機系統資訊  
*#2263# 基帶選擇  
*#9090# 診斷配置  
*#7284# USB模式控制  
*#872564# USB日誌控制  
*#745# RIL日誌輸出選單  
*#746# 除錯日誌輸出選單  
*#9900# 系統日誌輸出模式  
*#*#44336#*#* 顯示構建時間,更新列表  
*#03# NAND快閃記憶體串號  
*#3214789# GCF模式狀態  
*#4238378# GCF配置  

工廠測試

程式碼 功能描述 備註
*#*#0283#*#* 網路資料包迴路測試  
*#*#0*#*#* LCD測試  
*#*#0673#*#* 音訊測試  
*#*#0289#*#* 音訊測試  
*#*#0842#*#* 震動與背光測試  
*#*#2663#*#* 觸控式螢幕測試  
*#*#2664#*#* 觸控式螢幕測試  
*#*#0588#*#* 近距離感應器測試  
*#*#3264#*#* 記憶體硬體版本  
*#0782# 實時鐘測試  
*#0589# 光感應器測試  
*#7353# 快速測試選單  
*#3214789650# LBS測試  
*#8999*8378# 測試選單  
*#07# 測試歷史  

PDA和電話

程式碼 功能描述 備註
*#*#7262626#*#* 場測試  
*#06# 顯示手機IMEI號碼  
*#*#8351#*#* 開啟語音撥號記錄日誌  
*#*#8350#*#* 關閉語音撥號記錄日誌  
**05***# 從緊急撥號螢幕解鎖PUK碼  
*#301279# 網路制式HSDPA HSUPA控制選單  
*#7465625# 檢視手機鎖定狀態  
*7465625*638*# 配置網路鎖定MCC/MNC  
*7465625*782*# 配置網路鎖定NSP  
*7465625*77*# 插入網路鎖定鍵SP  
*7465625*27*# 插入網路鎖定鍵NSP/CP  
*#272886# 自動接聽選擇  

其他

程式碼 功能描述 備註
*#0*# Galaxy S3服務選單 Samsung
*#1234# 軟體版本 Samsung
*#12580*369# 硬體與軟體資訊 Samsung
*#0228# 檢視電池狀態 Samsung
*#0011# 開啟服務選單 Samsung
*#0283# 網路迴路測試 Samsung
*#0808# 訪問USB服務 Samsung
*#9090# 開啟服務模式 Samsung
*#7284# FactoryKeystring選單 Samsung
*#34971539# 訪問攝像頭系統 Samsung
*#7412365# 攝像頭韌體選單 Samsung
##7764726 Motorola DROID 隱藏服務選單 Motorola 預設密碼6個0
1809#*990# LG Optimus 2x 隱藏服務選單 LG 預設密碼6個0
3845#*920# LG Optimus 3D 隱藏服務選單 LG 預設密碼6個0
3845#*850# LG G3 診斷測試選單 LG AT&T
5689#*990# LG G3 診斷測試選單 LG Sprint
3845#*851# LG G3 診斷測試選單 LG T-Mobile
##228378 LG G3 診斷測試選單 LG Verizon
3845#*855# LG G3 診斷測試選單 LG 網路變種
*#*#3424#*#* HTC 測試功能 HTC
##8626337# 執行VOCODER HTC
##33284# 場測試 HTC
##3282# 顯示EPST選單 HTC
##3424# 執行診斷模式 HTC
##786# 反轉診斷支援 HTC
##7738# 協議修訂 HTC
*#*#786#*#* 硬體重置 Nexus 5
*#*#7873778#*#* 啟動Superuser應用 Nexus 5
*#*#1234#*#* 啟動Superuser應用 Nexus 5
*#123# 是否連線到家庭網路,僅用於加拿大和美國 Nexus 5
*#*#2432546#*#* 檢查系統升級 Nexus 5

日誌輸出辦法:

adb logcat -b main -v time>app.log  列印應用程式的log 

adb logcat -b radio -v time> radio.log 列印射頻相關的log

adb logcat -b events -v time  列印系統事件的日誌,比如觸屏事件

6、許可權問題

        try {
            PackageManager packageManager=mContext.getPackageManager();
            Drawable drawable=packageManager.getResourcesForApplication("com.tencent.qq").getDrawable(0x7f020110);
            mOnlineTv.setBackground(drawable);
        }catch (Exception e){
            showToast(e.getMessage());
        }

如上程式碼可以獲取QQ的一張圖片來設定到自己的App來,原因在於QQ設定了export=true,破解其App得到資源即可實現。延伸講一個activity的安全性,一般通過action、設定應用包名可以直接開啟,那麼可以做的就是給activity設定一個許可權,同時將傳過來context的package做判斷,如果在後臺註冊過則同意開啟,否則拒絕開啟。

再舉一例:

   Intent intent = new Intent(Intent.ACTION_MAIN);
        ComponentName cn = new ComponentName("com.tencent.qq", "com.tencent.qq.activity.LoginActivity");
        intent.setComponent(cn);
        startActivity(intent);

7、安全一點的intent(設定selector為null,chrome預設設定component為null)

  1. // convert intent scheme URL to intent object  
  2. Intent intent = Intent.parseUri(uri);  
  3. // forbid launching activities without BROWSABLE category  
  4. intent.addCategory(“android.intent.category.BROWSABLE”);  
  5. // forbid explicit call  
  6. intent.setComponent(null);  
  7. // forbid intent with selector intent  
  8. intent.setSelector(null);  
  9. // start the activity by the intent  
  10. context.startActivityIfNeeded(intent, –1);  

防止被注入選項和component進入其他app,被擷取資料。

劫持後如何防止使用者資料被抓取

主要因為html中被插入js,同時彈出新的偽裝頁面

http://www.cnblogs.com/alisecurity/p/5408588.html

遇到下面這種,還是要自己多注意些

8、zip包裡儘量不要出現../../file,對解壓包的目錄進行判斷是否多級目錄,防止資料被覆蓋。

String entryName = entry.getName();
if (entryName.contains(“..”)){
throw new Exception(“unsecurity zipfile!”);
}

9、

偽基站傳播分析

偽基站能夠偽裝成電信運營商的服務號,向手機使用者群發釣魚簡訊,收到的釣魚簡訊跟正常簡訊顯示在一起,真假難辨。釣魚網站的模擬度很高,並抓住了人們貪小便宜的弱點,先收集使用者資訊,再引導安裝仿冒應用。

美國聯邦調查局認為:金鑰長度需要設定56位,幾乎不可破解,而30位以下可以通過暴力破解-入侵的藝術。


相關文章