天天看點

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

本文來自 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 META-INF/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通信,使用可以檢驗身份的方式會更好。

通用功能 https://www.figotan.org/2016/06/15/android-secret-codes-all/#%E9%80%9A%E7%94%A8%E5%8A%9F%E8%83%BD

代碼 功能描述 備注
*#*#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和藍牙檢測 https://www.figotan.org/2016/06/15/android-secret-codes-all/#wifigps%E5%92%8C%E8%93%9D%E7%89%99%E6%A3%80%E6%B5%8B

*#*#526#*#* WLAN檢測
*#*#528#*#* WLAN測試
*#*#232339#*#*
*#*#232338#*#* 顯示WIFI網卡的MAC位址
*#*#1472365#*#* 快速GPS測試
*#*#1575#*#* 不同類型的GPS測試
*#*#232331#*#* 藍牙測試
*#*#232337#*#* 顯示藍牙裝置位址

系統固件版本資訊 https://www.figotan.org/2016/06/15/android-secret-codes-all/#%E7%B3%BB%E7%BB%9F%E5%9B%BA%E4%BB%B6%E7%89%88%E6%9C%AC%E4%BF%A1%E6%81%AF

*#*#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配置

工廠測試 https://www.figotan.org/2016/06/15/android-secret-codes-all/#%E5%B7%A5%E5%8E%82%E6%B5%8B%E8%AF%95

*#*#0283#*#* 網絡資料包回路測試
*#*#0*#*#* LCD測試
*#*#0673#*#* 音頻測試
*#*#0289#*#*
*#*#0842#*#* 震動與背光測試
*#*#2663#*#* 觸摸屏測試
*#*#2664#*#*
*#*#0588#*#* 近距離感應器測試
*#*#3264#*#* 記憶體硬體版本
*#0782# 實時鐘測試
*#0589# 光感應器測試
*#7353# 快速測試菜單
*#3214789650# LBS測試
*#8999*8378# 測試菜單
*#07# 測試曆史

PDA和電話 https://www.figotan.org/2016/06/15/android-secret-codes-all/#pda%E5%92%8C%E7%94%B5%E8%AF%9D

*#*#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# 自動接聽選擇

其他 https://www.figotan.org/2016/06/15/android-secret-codes-all/#%E5%85%B6%E4%BB%96

*#0*# Galaxy S3服務菜單 Samsung
*#1234# 軟體版本
*#12580*369# 硬體與軟體資訊
檢視電池狀态
*#0011# 打開服務菜單
*#0283# 網絡回路測試
*#0808# 通路USB服務
打開服務模式
FactoryKeystring菜單
*#34971539# 通路攝像頭系統
*#7412365# 攝像頭固件菜單
##7764726 Motorola DROID 隐藏服務菜單 Motorola 預設密碼6個0
1809#*990# LG Optimus 2x 隐藏服務菜單 LG 預設密碼6個0
3845#*920# LG Optimus 3D 隐藏服務菜單
3845#*850# LG G3 診斷測試菜單 LG AT&T
5689#*990# LG Sprint
3845#*851# LG T-Mobile
##228378 LG Verizon
3845#*855# LG 網絡變種
*#*#3424#*#* HTC 測試功能 HTC
##8626337# 運作VOCODER
##33284#
##3282#
##3424# 運作診斷模式
##786# 反轉診斷支援
##7738# 協定修訂
*#*#786#*#* 硬體重置 Nexus 5
*#*#7873778#*#* 啟動Superuser應用
*#123# 是否連接配接到家庭網絡,僅用于加拿大和美國
*#*#2432546#*#* 檢查系統更新

日志輸出辦法:

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位以下可以通過暴力破解-入侵的藝術。

繼續閱讀