本文來自 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/470000413、防止反編譯,造成接口被攻擊、資料洩露,進行混淆加強處理;同時可以将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)
- // convert intent scheme URL to intent object
- Intent intent = Intent.parseUri(uri);
- // forbid launching activities without BROWSABLE category
- intent.addCategory("android.intent.category.BROWSABLE");
- // forbid explicit call
- intent.setComponent(null);
- // forbid intent with selector intent
- intent.setSelector(null);
- // start the activity by the intent
- 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位以下可以通過暴力破解-入侵的藝術。