Android權限使用錯誤相關漏洞
Android權限概述
權限有助于限制對某些 Android 組件(如活動、廣播接收器、服務和內容提供者)的訪問。權限還用于在運行時驗證應用程序是否有權訪問敏感信息或執行危險操作。開發人員可以在應用程序的AndroidManifest.xml文件中聲明各種權限類型。比如,應用程序想要有權限訪問聯系人,必須在Androidmanifest.xml中包含如下聲明:
"android.permission.READ_CONTACTS" />
Android將權限分為不同的類型,包括安裝時權限、運行時權限和特殊權限。每種權限類型都指明了當系統授予應用該權限后,應用可以訪問的受限數據范圍以及應用可以執行的受限操作范圍。
安裝時權限
首先安裝時權限,顧名思義就是系統會在你安裝時自動授予這些權限,并在你安裝時進行通知。Android提供了多個安裝時權限的子類型,包括普通權限和簽名權限。普通權限規定的操作對用戶隱私和對其他應用帶來的操作影響較小。
分配為“normal”保護級別。簽名權限是當應用聲明了其他應用已定義的簽名權限時,如果兩個應用使用同一個證書簽名,那么系統就會在安裝時就向前者授予該權限了。分配為“signature”保護級別。
運行時權限
其次是運行時權限。運行時權限也被稱為危險權限,此類權限授予應用對受限數據的額外訪問權限,并允許應用執行對系統和其他應用具有更嚴重影響的受限操作。需要先在應用中請求運行時權限,然后才能訪問受限數據或執行受限操作。當應用請求運行時權限時,系統會顯示運行時權限提示。就是咱們現在常見的允許訪問存儲空間這一類的彈窗提示。許多運行時權限會訪問用戶私有數據,這是一種特殊的受限數據,其中包含可能比較敏感的信息。例如,位置信息和聯系信息就屬于用戶私有數據。系統會為運行時權限分配“dangerous”保護級別。
特殊權限
特殊權限是與特定的應用操作對應的,只有平臺和原始設備制造商 (OEM) 可以定義特殊權限。此外,如果平臺和 OEM 想要防止有人執行功能特別強大的操作(例如通過其他應用繪圖),通常會定義特殊權限。系統會為特殊權限分配“appop”保護級別。
聲明應用權限
如果需要聲明應用可能請求的權限,要在應用的清單文件中添加相應的 use-permission 元素
比如訪問相機:
"android.permission.CAMERA"/>
保護級別為dangerous。
此外,如果我們想要創建自己的權限,也需要聲明
printf("hello world!");"com.mycam.USE_CAMERA" android:protectionLevel="dangerous" />
".CamActivity" android:exported="true" android:permission="com.mycam.USE_CAMERA"> "com.mycam.LAUNCH_CAM" /> "android.intent.category.DEFAULT" />
第三方應用想要使用此功能,需要進行如下聲明:
"com.mycam.USE_CAMERA" />
相關漏洞
忘記保護級別
如果程序中沒有聲明protectionLevel,此時權限就會被默認標記normal
"com.mycam.USE_CAMERA" />
這就意味著,任何的應用程序都可以使用它。這就有可能導致用戶的隱私信息,比如通話記錄、短信等。
生態系統錯誤
假設此時有兩個應用程序的生態系統:my cam和my reader。此時reader可以使用相機應用程序的功能。
cam清單文件:
"http://schemas.android.com/apk/res/android" package="com.mycam"> "com.mycam.USE_CAMERA" android:protectionLevel="signature" /> "com.mycam.USE_CAMERA" /> "My Cam"> ".CamActivity" android:exported="true" android:permission="com.mycam.USE_CAMERA"> "com.mycam.LAUNCH_CAM" /> "android.intent.category.DEFAULT" />
reader清單文件:
"http://schemas.android.com/apk/res/android" package="com.mycoolreader"> "com.mycam.USE_CAMERA" /> "My Reader"> ".AllUserNotesContentProvider" android:authorities="com.myreader.notes_provider" android:exported="true" android:permission="com.mycam.USE_COOL_CAMERA" />
此時,只有來自生態系統的應用才能訪問AllUserNotesContentProvider,但是,如果用戶只安裝了reader,那么Android系統就不知道com.mycam.USE_CAMERA權限聲明的任何內容,那么權限級別就默認標記為了normal。此時就出現了問題。
組件聲明中的錯誤
"com.mycam.USE_CAMERA" android:protectionLevel="signature" />
".CamActivity" android:exported="true" android:uses-permission="com.mycam.USE_CAMERA"> "com.mycam.LAUNCH_CAM" /> "android.intent.category.DEFAULT" />
這個可以清晰的看出來,開發者沒有使用android:permission屬性,而是使用了android:uses-permission,這就意味著該組件沒有設置保護級別。
權限保護不足
應用程序沒有完全保護他們使用的權限,所以這為第三方應用程序利用易受攻擊的應用程序并獲得權利留下了空間。
"android.permission.READ_CONTACTS" />
".ContactsProvider" android:authorities="com.exampleapp.contacts" android:exported="true" />
此時在ContactsProvider.java里面
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { return getContext().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, selection, selectionArgs, sortOrder);}
訪問 URI ContactsContract.CommonDataKinds.Phone需要權限android.permission.READ_CONTACTS
但是就不需要com.exampleapp.contacts。
真實案例
布局文件注冊權限:write_contacts
"@string/write_contact_permission" android:name="ru.mail.mailbox.contacts.permission.write_contacts" android:protectionLevel="dangerous"/>
但是卻使用了write:
"@string/contacts" android:name="ru.mail.mailbox.content.contact.ContactsProvider" android:readPermission="android.permission.BIND_CHOOSER_TARGET_SERVICE" android:writePermission="ru.mail.mailbox.contacts.permission.write" android:enabled="true" android:exported="true" android:authorities="ru.mail.mailbox.contacts" android:syncable="false"/>
那么就跟上面沒有關系了,直接默認normal保護級別,任何第三方應用程序都可以將數據寫入該數據庫。
編寫poc
"ru.mail.mailbox.contacts.permission.write" /> "ru.mail.mailbox.contacts.permission.write" />
ContentValues contentValues = new ContentValues(); contentValues.put("display_name", "ihuoxian"); contentValues.put("email", "test@test"); getContentResolver().insert(Uri.parse("content://ru.mail.mailbox.contacts/"), contentValues);
此時就可以在用戶沒有任何感知的情況,加入了一條聯系人信息。
總結
Android權限的濫用相對來說定位比較簡單,在Androidmainfest表單下,剩下的步驟就需要大家去分析權限的級別信息等等,可以看一下谷歌官方說明加深印象。
https://developer.android.com/guide/topics/permissions/overview?hl=zh-cn