Android簽名與許可權的安全問題(3)
簽名和許可權的作用
Android簽名
中使用到的一些加密技術有:
公/私鑰, SHA1(CERT.SF,MANIFEST.MF), RSA(CERT.RSA), 訊息摘要,
移動平臺中的主流簽名作用:
- Android平臺中是使用自簽名
自簽名,證書的簽名者和證書擁有者
是同一人.
自簽名的完整性認證
自簽名是沒有信任模式的
,因為自簽名信息是自己的,對無法知道該資訊是不是安全,我們只能對其的完整性進行認證.
限制安裝和執行
下面是限制應用安裝和執行的流程
應用安裝時
校驗是否含簽名 –> 沒有,禁止安裝
–> 有,提取證書進行校驗–> 證書是否有效可信任–> 不是禁止安裝.基於證書的公鑰對簽名進行校驗–> 簽名是否正確 –> 不正確禁止安裝.
應用執行時
校驗是否包含簽名 –> 沒有,禁止執行
–> 有,提取證書進行校驗–> 證書是否有效可信任–> 不是禁止執行.(這一步跟安裝流程相似)基於證書的公鑰對簽名進行校驗–> 簽名是否正確 –> 不正確禁止執行.(這一步跟安裝流程相似)
許可權的作用(細粒度的特權管理)
- 許可權是一個ID或者一個字串
- 謙虛用來細分權利(類似Capability,分散權利)
- 通常一個許可權與一個類操作繫結
- 許可權首先需要申請(AndroidManifest或者程式碼動態申請)
- 但是申請後是否被批准有平臺策略決定
如:使用者需要讀取SDCard的許可權,這時Android平臺會彈出訪問SDCard的視窗,如果使用者accept了,那這個許可權就被申請.
許可權的安全性保護(通過簽名)
許可權的完整性保護(防篡改)
如發簡訊的方式,不可能沒發一條簡訊都彈dialog來申請許可權,所以這時開發只要在Manifest 中新增sendSMS permission
就可以.(通過認證並獲得簽名後再加policy許可權)許可權的授權安全策略(防Escalate)
如普通應用申請Inject Event 許可權(注入)
簽名作用
完整性鑑別
自簽名支援完整性鑑別
Android中使用的是自簽名方式
,那就是無法對簽名的信任進行認證,只能通過他的完整性鑑別.不做安裝和執行時的限制(不做信任模式)
Android不會在安裝的時候進行Signature Permission
的驗證,他僅僅是做Signature(簽名) 這步驟.
Signature Permission 和ShareUID(TODO 講得不錯要做詳細)
Signature Permission(Signature Permission Level Permission)
相當於他對一些特權的permission 他用單獨的signature 方式去驗證.- 示例程式碼塊:
<permission android:name="android.permission.HARDWARE_TEST"//許可權名稱,要注意命名規範
android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"//在顯示時對許可權進行歸類
android:protectionLevel="signature"// 許可權安全界別
android:label="@string/permlab_hardware_test"// 在對應語言系統上顯示
android:description="@string/permdesc_hardware_test"
//該許可權的描述與使用
/>
上面的protectionLevel="signature"
,因此他並不是給第三方應用去使用的.對於普通的app去使用該許可權的話肯定是會被拒絕的.但是對於如果是系統應用的話只要要.mk
裡的config寫的是security="platefrom"
那麼這個app裡的Signature 就會使用平臺的private key
進行簽名.
ShareUID(Share Process UID)
- 示例程式碼塊:
android:sharedUserid="xxx"
其實Android中的UID也是在manifest 中寫的,如上面程式碼,那麼Android重為什麼要有UID.
UID其實是一個特權的概念,不同檔案對一些許可權會做一些限制,如對於uid="owner"
會用r/w/x 許可權,而對於uid="other"
可能就會連read 的許可權都沒有.這樣就可以使得Android中每一個 project他對於的資源目錄下是屬於一個private 的狀態.
所以Android很好的引用了Linux自有的一些特性,將每個專案通過群組(UID)的方式分離出來.Process間Share UID的目的是共享資源
如果a,b,c三個應用他們之間的share UID是同一個,那麼這幾個應用間的資源是開源互相訪問的.漏洞: 那麼這樣就會引出一個安全問題,如果360配置的時候將share UID設定成 QQ應用一樣,而且框架允許的情況下,那麼問題就來了,360可以很簡單的就訪問到了qq的資料.
Android中兩個Apk Share相同的UID必須其簽名所用的Private Key 一樣.(為什麼?)
google的解決方法就是,如果多個應用之間真的要設定成Share UID相同,那麼前提條件就是這幾個應用的私鑰也必須是一樣的,是同一個owner ,也就是說廠家是同一家.
- 示例程式碼塊:
身份ID和升級的匹配
- Android中的自簽名只是代表了身份,但是不代表身份是否可信任
- Android應用的identifier(鑑定者) 是Package Name:
- Package Name不一樣,相互不影響,只允許同時存在(安裝)
- Package Name一樣,只能存在一個,允許做升級處理.
- 升級的安全性考慮
- 必須簽名的證書一致(市場上假冒app)
- 如果不一致,則使用者要麼放棄新的應用,要麼先解除安裝舊的,再安裝新的.
- 正常的升級將不清除應用cache,以保證歷史資料的持續性.
Android APK 之META INF
其實很應用的安裝包,就是一個壓縮包,把apk 字尾修改成.zip 就可以解壓裡面的資料.
APK的一個結構
- assets
- lib
- META-INF 裡面有3個檔案,相當於是摘要資訊檔案(簽名信息CERT.RSA,CERT.SF,MANIFEST.MF)
- res
- AndroidManifest
- class.ex
簽名流程
java -jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update-signed.apk
Android中的許可權
Android簽名
中使用到的一些加密技術有:
簽名(特權許可權)
許可權作用
細粒度特權管理
許可權與操作關聯
每一個許可權都與對應的操作(功能)有關聯.應用需要顯式申請許可權
如需要在AndroidManifest中去申請需要的許可權.使用者對許可權可知(不可控)
使用者對該專案使用到的app需要涉及什麼許可權,都是可以檢視到的,但是在安裝app時必須accept所有許可權才可以安裝,否則就無法安裝,這就是不可控,但是在Android6.0後google出現了RuntimePermission,對部分單個許可權是可控的,而且當系統root後,也可以通過一些管家對某個app 的單個許可權進行分配.對特權許可權單獨控制
Android中對特權許可權單獨控制,這個方式其實就是通過簽名來處理的.比如上面提到的sendSMS
傳送簡訊的許可權.
Android的不同許可權類別
- Normal 預設,一般安裝不會被顯示出來.
- Dangerous 危險,安裝時會有pop提示.
- Signature 簽名,對於一些特權許可權就需要通過簽名來保護,對apk的私鑰邀請與簽名一樣.
- SignatureOrSystem 簽名or系統,對於申請許可權的私鑰跟簽名一樣,或者改app是系統app才可以使用該許可權.
- 自定義許可權注意
一般一些開發廠商或應用開發商會自定義一些許可權.
注意:
對於自定義許可權很簡單,但是對於要設定他的protectionLevel這個問題還是比較關鍵的.如果level定義太嚴格,那以後拓展起來就比較差,如果定義太寬泛,就很容易出現安全漏洞.建議根據如下方式定義:
- 根據需求應用範圍使用者許可權,按照上面的許可權類別描述來定義需要的許可權.
- 為了避免permission name 重複,命名規範也要注意.
- 如,百度地圖在自定義許可權時,該sdk提供一些api但是如果這些功能只給百度自己公司的app 用,那就可以定義protectionLevel=”SignatureOrSystem”.
Android執行時許可權控制方式
下面是兩種方式的描述
通過PM的CheckPermission
- Android獨有的service(底層平臺不具有)
- 所以需要在Android本身framework中控制
- 主流的service一般都基於binder IPC或者其他IPC提供服務
- Android真正的service都是在底層實現的,所以在最底層控制(service所在的server中)以避免逃逸控制
- 繞開Utility Function 直接 Invoke Remote Service
- 如:DayDream(屏保)
對映為OS的特定屬性
- 非Android特有的service(底層平臺已經提供,如File訪問,TCPIP資料收發等)
- 多個入口訪問: Android API,Java API, NDK C API, Shell,etc
- 底層控制準則,會聚扣在底層,所以在底層(OS層面)統一控制,這樣可以避免逃逸控制.
- 所以複用OS的一些安全控制特性,比如GID
- 所以需要把Android空間的 Permission Mapping到OS的GID
- 如: 訪問SDCard
因為Android是基於Linux OS的那麼Linux它有的一些安全特性與GID ,Android就可以對他複用,因此在對於多介面的訪問安全問題就可以解決了,可以先看下面程式碼:
讀取SDCard的許可權
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
SDCard許可權的對映關係
<permission name="android.permission.WRITE_EXTERNAL_STORAGE"
<group gid="sdcard_rw"
/>
Android的permission 與UID/GID 的mapping
- 任何自定義許可權只要符合上面xml 語法的都會在
system/etc/permissions
下面的xml檔案,被系統讀取並parse 在UID/GID中進行mapping. 如見system/etc/permissions
目錄下的platform.xml . - 安全性問題
- 任何應用都可以為自己的permission 分配GID嗎?那不是安全漏洞?
- 當然不行! 只有ROOT使用者才允許新增或改寫.
相關推薦
Android簽名與許可權的安全問題(3)
簽名和許可權的作用 Android簽名中使用到的一些加密技術有: 公/私鑰, SHA1(CERT.SF,MANIFEST.MF), RSA(CERT.RSA), 訊息摘要, 移動平臺中的主流簽名作用: Android平臺中是使用自簽名 自簽名,證書的簽名者和證書擁有者是同一人. 自簽名
Android進階:網路與資料儲存—步驟1:Android網路與通訊(第3小節:ListView上)
內容概要: 一、課程介紹 二、ListView的準備工作 ListView簡介 ListView的實現步驟 三、ListView簡單應用 Adapter的資料繫結 最簡單ListView效果演示 獲取系統已安裝應用列表 優化效能 一、課程介紹 什麼是List
初識ASP.NET MVC窗體驗證與許可權過濾---3.自定義過濾器驗證Session超時
為了防止使用者在seesion過期之後進行操作,可以新增自定義過濾器驗證session是否過期,為了便於測試將過期時間設定為1分鐘,在Filters資料夾下新增一個自定義過濾器。namespace AuthStudy.Filters { public
Android簽名與認證META-INFO目錄下檔案
一、Android簽名概述 我們已經知道的是:Android對每一個Apk檔案都會進行簽名,在Apk檔案安裝時,系統會對其簽名信息進行比對,判斷程式的完整性,從而決定該Apk檔案是否可以安裝,在一定程度上達到安全的目的。 給定一個Apk檔案,解壓,可以看到一個META
Android簽名與認證詳細分析之一(CERT.RSA剖析)
一、Android簽名概述 我們已經知道的是:Android對每一個Apk檔案都會進行簽名,在Apk檔案安裝時,系統會對其簽名信息進行比對,判斷程式的完整性,從而決定該Apk檔案是否可以安裝,在一定程度上達到安全的目的。 給定一個Apk檔案,解壓,可以看到一個META
7.xamarin.android 發布簽名與控制apk大小
其他 alt 等待 標識 執行 國內 ima 應用 需要 概述 做了xamarin android 後大家想打包一個apk,發布給其他人使用本章我們將帶領大家如何打包簽名一個apk。 打包 對於VS2017 或者是VS MAC來說打包一個APK非常簡單。 首選
區塊鏈教程區塊鏈信息安全3橢圓曲線加解密及簽名算法的技術原理一
rsa 回歸 語言 集合 規則 區塊 連續 rsa加密 對稱加密 區塊鏈教程區塊鏈信息安全3橢圓曲線加解密及簽名算法的技術原理一,2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、回歸理性,表面上看相關人才需求與身價似乎正在回落。但事實上,正是初期泡沫的漸退,讓人們更多
解決Android簽名混淆後WebView與JS互動失效的問題
最近做了個網頁端微信支付的小功能,測試版還好好的,混淆打包後,寫的方法webview無法呼叫,意識到混淆除了問題,於是在網上找了一些大神的解決方案,再根據自己的實際解決過程,列出來一個完整的解決方法。 Android4.2以上版本呼叫js介面需要在方法使用宣告@JavascriptInterfa
Android 6.0 許可權的申請 與 封裝
Android 6.0 以後最大的改變就是對於許可權的管理這一塊了,以前某個App 想使用什麼許可權 只要在 manifest 檔案裡面新增申請就可以了。 Android 6.0 以後不但要在manifest 裡面新增執行的時候還會彈出一個對話方塊讓使用
安全體系(零)—— 加解密演算法、訊息摘要、訊息認證技術、數字簽名與公鑰證書
鋒影 email:[email protected] 如果你認為本系列文章對你有所幫助,請大家有錢的捧個錢場,點選此處贊助,贊助額0.1元起步,多少隨意 本文講解對稱加密、非對稱加密、訊息摘要、MAC、數字簽名、公鑰證書的用途、不足和解決的問題。 0.概
Android Studio與Android SDK 線上更新的解決方案(1.3.2)
1、Android Studio更新 問題:在Android Studio中,點選help-Check for Update,會出現如下錯誤: 解決方案:開啟Android Studio的安裝目錄,
Android自定義許可權與使用
本篇部落格介紹下Android開發者如何自定義許可權,進而如何將自己的部分元件暴露。並介紹客戶端如何呼叫這些暴露的元件。 1. 如何自定義許可權 Android允許我們使用permission標籤,在Manifest檔案中定義屬於自己的許可權,一個例子如
【日常學習筆記】2019/1/3(Log4j與web安全)
Log4j日誌學習 log4j日誌輸出使用教程 https://www.cnblogs.com/sky230/p/5759831.html Spring+SpringMVC+MyBatis+easyUI整合優化篇(二)Log4j講解與整合 https://www.cnblogs.
android apk的簽名和許可權問題
一. android apk的簽名問題(http://blog.csdn.net/lyq8479/article/details/6401093) 1.為什麼要給Android應用程式簽名? 如果只能用一句簡單的話語來回答這個問題的話,我會說:“這是Android系統所要求的”。
[Android除錯基礎五]adb命令—檔案複製與許可權修改
Debug中需要替換一些system下的檔案,通常system為read only,因此需要先修改操作許可權為可讀寫,進入root後,su獲得許可權,在敲入命令:mount -o remount,rw / (mount -ro remount,rw /system),將目錄
unix下檔案的安全與許可權
d 目錄。l 符號連結(指向另一個檔案)。s 套接字檔案。b 塊裝置檔案。c 字元裝置檔案。p 命名管道檔案。- 普通檔案,或者更準確地說,不屬於以上幾種型別的檔案。 檔案的許可權位中中每一組字元中含有三個許可權位: r 讀許可權w 寫/更改許可權x 執行該指令碼或程式的許可權 如: r-- ---
android中Root許可權的判斷與獲取
關於android中root許可權的相關判斷與獲取,我咋這裡做一下筆記。 首先是判斷手機是否有root許可權: /** * 判斷當前手機是否有ROOT許可權 * @return */ public static boolean
阿里Android開發規範:安全與其他
以下內容摘自 阿里巴巴Android開發手冊 我們的目標是: 防患未然,提升質量意識,降低故障率和維護成本; 標準統一,提升協作效率; 追求卓越的工匠精神,打磨精品程式碼。 【強制】必須遵守,違反本約定或將會引起嚴重的後果; 【推薦】儘量遵守,長期遵守有助
Android中的UID、GID與應用安全
Linux系統的檔案許可權機制:每個檔案都是屬於某個使用者的,這個使用者稱作檔案的所有者。檔案對於所有者、所有者所在組的使用者、以及其它任意使用者分別開放了不同的操作許可權,操作許可權分為:讀、寫、執行三種。只有獲得了檔案操作許可權的應用才能對檔案做相應的操作。這就保護了檔案的安全性,保證使用者對自己不具備許
Android 從零學資料結構與演算法(3)——HashMap和LinkedHashMap
本部落格的原創文章,都是本人平時學習所做的筆記,不做商業用途,如有侵犯您的智慧財產權和版權問題,請通知本人,本人會即時做出處理刪除文章。HashMap 基於雜湊表(散列表)的Map介面的實現,允許使用null鍵和null值,HashMap是非執行緒安全的,資料元