Android四大組件簡介
Android應用有四大組件Activity、Service服務、Content Provider內容提供者和Broadcast Receiver廣播接收器。
- Activity:在應用程序中,每個Activity通常就是一個單獨的屏幕,顯示控件並處理用戶的響應事件,每一個看到的應用界面都是一個Activity。
- Service:一個Service是以長生命週期的,沒有用戶界面的程序,可以用來開發後臺服務或者監控類的程序。例如,當音樂播放器退出用戶界面之後,還需要繼續播放,通常會使用Context.startService()來啓動一個後臺服務,來保持音樂的持續播放。
- Content Provider:每個應用程序都會有些數據存儲,存儲方式一般有5種(Android應用五種數據存儲方式),Content Provider使一個應用程序的指定數據集提供給其他應用程序,例如通訊錄、信息和通話記錄等。
- Broadcast Receiver:應用可以使用它對外部事件進行過濾只對感興趣的外部事件(如當電話呼入時,或者數據網絡可用時)進行接收並做出響應。廣播接收器沒有用戶界面。然而,它們可以啓動一個activity或serice 來響應它們收到的信息,或者用NotificationManager 來通知用戶。通知可以用很多種方式來吸引用戶的注意力──閃動背燈、震動、播放聲音等。一般來說是在狀態欄上放一個持久的圖標,用戶可以打開它並獲取消息。
組件暴露漏洞原理
應用程私有組件只能被當前應用啓動,不能被其他應用啓動相對是安全的。
當一個應用程序的組件暴露,就可以被第三方的應用任意調用,可能導致敏感信息泄露、拒絕服務、權限提升繞過,界面劫持、遠程代碼執行等安全漏洞。
簡單舉個例子, 查看如下代碼,假設暴露的activity通過Bundle傳輸數據,如果第三方的應用啓動這個暴露的組件,傳入一個錯誤的數值,這個類就會拋出異常。
@Override
protected void onCreate(Bundle savedInstanceState)
{
int key = savedInstanceState.getInt("key");
}
組件暴露漏洞檢測規則
每一個組件在Manifest.xml定義,都有一個android:exported屬性,滿足以下兩種情況都認爲是有組件暴露漏洞
- 顯式設置exported屬性爲true
- 沒有顯式設定exported值,但組件下面有intent filter,這樣組件exported默認值也爲true
漏洞修復建議
- 顯式設置設置exported屬性爲false,不提供暴露的組件。
- 如果實在需要提供暴露的組件,不在暴露的組件中操作敏感信息。
- 不管是private組件還是public組件,不返回敏感信息,謹慎處理接收的intent。