0x00 私有組件淺談 android應用中,如果某個組件對外導出,那麼這個組件就是一個攻擊面。很有可能就存在很多問題,因為攻擊者可以以各種方式對該組件進行測試攻擊。但是開發者不一定所有的安全問題都能考慮全面。 對於這樣的問題,最方便的修複方式就是在確定不影響業務的情況下,將這個存在問題的組件不 ...
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中的內容,同時被啟動的私有組件需要做好各種安全防範。
阿裡聚安全 | Android安全開發系列文章
-------------------------------------------------------------------
* 作者:舟海、呆狐@阿裡聚安全,更多阿裡安全類技術文章,請訪問阿裡聚安全官方博客