0x00 私有組件淺談
android應用中,如果某個組件對外導出,那么這個組件就是一個攻擊面。很有可能就存在很多問題,因為攻擊者可以以各種方式對該組件進行測試攻擊。但是開發者不一定所有的安全問題都能考慮全面。
對于這樣的問題,最方便的修復方式就是在確定不影響業務的情況下,將這個存在問題的組件不對外導出變成私有組件。這樣做的確很有效,私有組件也很安全。但是,如果存在某個私有組件能被導出組件啟動的話,那么這個私有組件其實就不再是私有了。如果攻擊者可以通過控制導出的組件對私有組件進行控制,那么攻擊者的攻擊面就大大的擴大了。如果不對這種情況進行關注很可能帶來一系列安全問題。 正常情況:
私有組件能被啟動情況:
0x01 啟動私有組件原理分析
存在一個私有組件A,和一個對外導出組件B。如果B能夠根據對外傳入的Intent中的內容打開私有組件A,同時啟動私有組件A的Intent的內容來自啟動導出組件B的Intent的內容,那么攻擊者就可以通過對外導出組件B,去控制私有導出組件A。這就可能會造成嚴重的安全風險。
下面用一個簡單例子來說明如果能夠啟動私有組件,能引起的一些安全問題。 PrivateActivity.class
很明顯,PrivateActivity是存在問題的,因為從Intent中直接獲取值之后,沒有做任何異常處理。如果PrivateActivity是私有的一個Activity,并且開發工程師能保證傳入到該Activity的Intent一定有值的話,那么其實是無法造成威脅的。但是如果存在另外一個MainActivity,如下:
那么,攻擊者就可以通過著么一條命令去實施攻擊:
那么應用就會崩潰。
這里只是一個簡單的demo,用來說明存在問題。如果PrivateAcitivty里面存在很重要的邏輯業務處理的話,那么惡意攻擊者可以通過控制MainActivity去控制PrivateActivity,進而控制PrivateActivity里面的邏輯走向,極有可能造成嚴重危害。
除了以上這種情況之外,還有一種情況,就是Intent Scheme URL,如果處理不當的話,也極有可能通過解析Uri的這個導出的組件去攻擊啟動其他私有組件。本質都是一樣的,這里就不討論這種情況了。
0x03 啟動私有組件案例分析
這里以某個app7.5.0版本為例,分析它因為可以啟動私有組件導致的嚴重問題。(目前該app已經沒有再使用有問題的組件,有問題的SDK也早已經修復了這個問題) 首先,這個app存在一個私有組件VersionUpdateActivity:
這個私有組件是用來判斷是否更新的,如果有,會根據Intent中的url鏈接去下載相應的更新apk包。
另外,該apk存在另外一個對外導出的組件。
該組件在實現過程中,通過獲取到的Intent,經過一系列檢查,進入pushClickedResult函數中。
在pushClickedResult函數中,主要做了以下幾個操作:
1、首先獲取intent中activity
2、然后將這個值作為將要啟動的activity的classname
3、將intent傳入將要啟動的activity
4、然后啟動activity
那么很明顯了,攻擊者可以通過控制XGPushActivity進而控制這個應用的所有私有activity。 攻擊私有組件VersionUpdateActivity的POC如下:
這個命令會打開VersionUpdateActivity,如果存在更新,那么點擊更新,下載的將是url對應的內容。
0x04 阿里聚安全對開發者的建議
首先,阿里聚安全已經能夠檢測到這樣的問題了。對于上面案例分析中的app,阿里聚安全掃描器掃描到的結果如下:
對于這樣的安全風險,阿里聚安全建議:
1、對于不必要對外導出的組件,請設置exported=false。
2、如果該組件因為各種原因,需要導出,那么請檢查該組件能不能根據該組件的intent去啟動其他私有組件。如果能,請根據業務嚴格控制過濾和校驗intent中的內容,同時被啟動的私有組件需要做好各種安全防范。
|