Android靜態安全檢查(一):組件暴露

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

漏洞修復建議

  1. 顯式設置設置exported屬性爲false,不提供暴露的組件。
  2. 如果實在需要提供暴露的組件,不在暴露的組件中操作敏感信息。
  3. 不管是private組件還是public組件,不返回敏感信息,謹慎處理接收的intent。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章